[英]Process is Terminated due to StackOverFlowException C#
這是我的代碼。 我無法弄清楚為什么這段代碼給出了'由於StackOverFlowException而導致進程終止'。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SadiSDAL4
{
class Program
{
static void Main(string[] args)
{
PrivateVehical privateV = new PrivateVehical("001");
PrivateVehical pVehical = (PrivateVehical)privateV.Clone();
Console.WriteLine("Cloned : {0}", privateV.name);
Console.WriteLine("Cloned : {0}", pVehical.name);
privateV.name = "Sadia's Car";
Console.WriteLine("Cloned : {0}", privateV.name);
Console.WriteLine("Cloned : {0}", pVehical.name);
pVehical.name = "Waheed's Car";
Console.WriteLine("Cloned : {0}", privateV.name);
Console.WriteLine("Cloned : {0}", pVehical.name);
Console.WriteLine(privateV.GetHashCode().ToString());
Console.WriteLine(pVehical.GetHashCode().ToString());
PublicVehical publicV = new PublicVehical("002");
Console.WriteLine(publicV.id);
PublicVehical pubVehi = (PublicVehical)publicV.Clone();
Console.WriteLine("Cloned : {0}", pubVehi.id);
}
}
abstract class Vehical
{
private string vehicalId = "01";
public string name = "Car_1";
public Vehical(string id)
{
this.vehicalId = id;
}
public string id
{
get { return id; }
set { this.vehicalId = id; }
}
public abstract Vehical Clone();
}
class PrivateVehical : Vehical
{
public PrivateVehical(string id)
: base(id)
{
}
public override Vehical Clone()
{
return (Vehical)this.MemberwiseClone();
}
}
class PublicVehical : Vehical
{
public PublicVehical(string id)
: base(id)
{
}
public override Vehical Clone()
{
return (Vehical)this.MemberwiseClone();
}
}
}
這是輸出。 有人能解釋一下它的原因是什么嗎? 為什么它在第一部分工作而在另一部分工作?
看看這段代碼:
public string id
{
get { return id; }
set { this.vehicalId = id; }
}
具體來說, get { return id; }
get { return id; }
。 您將屬性返回給自己,導致SO錯誤。
這是你的意圖:
public string id
{
get { return this.vehicalId; }
set { this.vehicalId = value; }
}
您的錯誤發生在這行代碼上
Console.WriteLine(publicV.id);
當您嘗試從publicV
變量獲取屬性的值時,它會調用基類上的getter。 在你的情況下,這是Vehicle
類中的這個塊
public string id
{
get { return id; }
set { this.vehicalId = id; }
}
但是,當調用get
時,它會執行return id;
。 所以它再次調用id屬性的getter,它執行return id;
代碼行再次。 因此,有效的代碼行無法自行調用自身,從而產生Stack Overflow問題。 (如果你不熟悉這個概念,請參閱遞歸 )
再看一下Vehicle的id屬性。 您對set
版本有正確的想法,您將值分配給vehicleId
屬性。 這也是你應該從中得到它的地方。 我希望如果你改變getter get { return this.vehicleId; }
get { return this.vehicleId; }
這將解決您的問題。
調試代碼顯示您有剪切和粘貼錯誤。
public string id
{
// having this set to id causes endless recursion
//get { return id; }
//use this instead
get { return vehicalId; }
set { this.vehicalId = id; }
}
您的錯誤是由以下定義引起的:
public string id
{
get { return id; }
set { this.vehicalId = id; }
}
這是因為get調用正在返回對自身的調用,也就是說,獲取Id調用獲取Id,它會反復調用獲取Id,直到內存不足並獲得StackOverflowException。 我猜你打算這樣做:
public string id
{
get { return vehicalId; }
set { this.vehicalId = id; }
}
順便說一句,感覺真的很高興來到stackoverflow來獲得調試StackOverflowException的幫助:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.