C# StackOverFlow例外:你能帮我解决这个问题吗?
我设计了一个实现Builder设计模式的类。但使用其生成器创建该类时,会引发系统异常,即StackOverFlow异常。我知道它的构建器是递归的,但我只调用了它的构建链的三倍。我真的不明白这是什么,我也不明白。下面是我的类,它包含自己的构建器C# StackOverFlow例外:你能帮我解决这个问题吗?,c#,exception,stack-overflow,builder,C#,Exception,Stack Overflow,Builder,我设计了一个实现Builder设计模式的类。但使用其生成器创建该类时,会引发系统异常,即StackOverFlow异常。我知道它的构建器是递归的,但我只调用了它的构建链的三倍。我真的不明白这是什么,我也不明白。下面是我的类,它包含自己的构建器 SnirgeeDosya sn = new SnirgeeDosya.SnirgeeDosyaBuilder() .setDosyaId(0) .setDosyaAdi("Dosya1")
SnirgeeDosya sn = new SnirgeeDosya.SnirgeeDosyaBuilder()
.setDosyaId(0)
.setDosyaAdi("Dosya1")
.setUserId(1214)
.setDBFactory(new DatabaseFactory()).build();
public class SnirgeeDosya:ISnirgeeDosyaOracleCommands
{
public int dosyaId { set { dosyaId = value; } get { return dosyaId; } }
public int userId { set { userId = value; } get { return userId; } }
public DateTime baslangicZaman { get { return DateTime.Now; } }
public String dosyaAdi { set { dosyaAdi = value; } get { return dosyaAdi; } }
private SnirgeeOracleDBWorker oracleDbWorker{ set { oracleDbWorker = value; } get { return oracleDbWorker; } }
/// <summary>
/// SnirgeeDosya olusturması sırasında kullanılır. ilgili parametreler girildikten sonra build edilip SnirgeeDosya elde edilir. Kullanım şekli aşağıdaki gibidir.
/// SnirgeeDosya sn = new SnirgeeDosya.SnirgeeDosyaBuilder().setDosyaAdi("Dosya1").setUserId(1214).setDBFactory(new DatabaseFactory()).build();
/// </summary>
public class SnirgeeDosyaBuilder
{
public int dosyaId { set { dosyaId = value; } get { return dosyaId; } }
public int userId { set { userId = value; } get { return userId; } }
public String dosyaAdi { set { dosyaAdi = value; } get { return dosyaAdi; } }
public SnirgeeOracleDBWorker oracleDbWorker { set { oracleDbWorker = value; } get { return oracleDbWorker; } }
/// <summary>
/// Dosya Builder içerinde dosya adının belirlenmesi.
/// </summary>
/// <param name="dosyaadi"></param>
/// <returns></returns>
public SnirgeeDosyaBuilder setDosyaAdi(String dosyaadi)
{
this.dosyaAdi = dosyaadi;
return this;
}
/// <summary>
/// Dosya Builder içerinde SnirgeeDosyasının kime ait olduğunu belirten metotdur.
/// </summary>
/// <param name="userid"></param>
/// <returns></returns>
public SnirgeeDosyaBuilder setUserId(int userid)
{
this.userId = userid;
return this;
}
/// <summary>
/// Dosya Builder içerinde SnirgeeDosyasının kime ait olduğunu belirten metotdur.
/// </summary>
/// <param name="userid"></param>
/// <returns></returns>
public SnirgeeDosyaBuilder setDosyaId(int dosyaId)
{
this.dosyaId = dosyaId;
return this;
}
/// <summary>
/// Snirgee Dosyasının içerisine Veritabanı işlemleri yapan classın eklenmesi.
/// Elementlerin yazılması ve okunması sırasında bu class içerisinde kullanılacaktır.
/// </summary>
/// <param name="db"></param>
/// <returns></returns>
public SnirgeeDosyaBuilder setDBFactory(DatabaseFactory db)
{
this.oracleDbWorker = new SnirgeeOracleDBWorker(db);
return this;
}
/// <summary>
/// dosyaAdı, kullanıcıId ve Veritabanı işlerini yapacak DatabaseFactory parametreleri atandıktan sonra Snirgee Dosyasını oluşturan methodtur.
/// Henüz veritabanı SnirgeeDosya tablosuna herhangi bir kayıt atanmaz.
/// </summary>
/// <returns></returns>
public SnirgeeDosya build()
{
return new SnirgeeDosya(this);
}
}
/// <summary>
/// SnirgeeDosya'sını oluşturan SnirgeeDosyaBuilder classı build metodu içerisinde kullanılır.
/// </summary>
/// <param name="formBuilder"></param>
private SnirgeeDosya(SnirgeeDosyaBuilder formBuilder)
{
this.dosyaId = formBuilder.dosyaId;
this.userId = formBuilder.userId;
this.dosyaAdi = formBuilder.dosyaAdi;
this.oracleDbWorker = formBuilder.oracleDbWorker;
}
}
snirgedosya sn=新的snirgedosya.snirgedosyabuilder()
.setDosyaId(0)
.setDosyaAdi(“Dosya1”)
.setUserId(1214)
.setDBFactory(新数据库工厂()).build();
公共类SnirgeeDosya:IsnirgeDosYaoracleCommands
{
public int dosyaId{set{dosyaId=value;}get{return dosyaId;}}
public int userId{set{userId=value;}get{return userId;}}
public DateTime baslangicZaman{get{return DateTime.Now;}
公共字符串dosyaAdi{set{dosyaAdi=value;}get{return dosyaAdi;}}
private snirgeoracledbworker oracleDbWorker{set{oracleDbWorker=value;}get{return oracleDbWorker;}}
///
///斯尼尔杰多亚·奥卢斯特马斯·拉斯隆达·库兰·勒尔·伊尔吉利·格拉迪克滕·索拉·埃迪利普·斯尼尔杰多亚·埃尔德·埃迪利尔·库伦·梅克利·阿卡利·吉比迪。
///snirgedosya sn=new snirgedosya.snirgedosyabuilder().setDosyaAdi(“Dosya1”).setUserId(1214.setDBFactory(new DatabaseFactory()).build();
///
公共类Snirgedosyabuilder
{
public int dosyaId{set{dosyaId=value;}get{return dosyaId;}}
public int userId{set{userId=value;}get{return userId;}}
公共字符串dosyaAdi{set{dosyaAdi=value;}get{return dosyaAdi;}}
public snirgeoracledbworker oracleDbWorker{set{oracleDbWorker=value;}get{return oracleDbWorker;}}
///
///建筑商içerinde Dosya adının Belillenmesi。
///
///
///
公共SNIRGEDOSYABUILDER setDosyaAdi(字符串dosyaadi)
{
this.dosyaAdi=dosyaAdi;
归还这个;
}
///
///建筑商伊瑟琳德·斯奈杰多西亚斯·恩金·艾特·奥杜乌纳·贝里滕·梅托杜尔。
///
///
///
公共SNIRGEDOSYABUILDER setUserId(int userid)
{
this.userId=userId;
归还这个;
}
///
///建筑商伊瑟琳德·斯奈杰多西亚斯·恩金·艾特·奥杜乌纳·贝里滕·梅托杜尔。
///
///
///
公共SNIRGEDOSYABUILDER setDosyaId(int dosyaId)
{
this.dosyaId=dosyaId;
归还这个;
}
///
///斯尼尔吉·多斯亚斯(Snirgee Dosyasının içerisine Veritabanıişlemleri yapan)是埃克伦梅西(eklenmesi)的第三流。
///亚兹尔马斯·奥昆马斯·拉斯兰达一级学院。
///
///
///
公共SNIRGEDOSYABILDER setDBFactory(数据库工厂数据库)
{
this.oracleDbWorker=新的Snirgeoracledbworker(db);
归还这个;
}
///
///dosyaAdı,kullanıcıId ve Veritabanıişlerini yapacak数据库工厂参数和sonra Snirge Dosyasın௫oluşturan方法。
///这是一个很好的解释。
///
///
公共SNIRGEDOSYA构建()
{
返回新的SNIRGEDOSYA(本);
}
}
///
///斯尼尔杰多西亚的奥卢图兰斯尼尔杰多多西亚比尔德船级社(Snirgedosya'sınıoluşturan SnirgeeDosyaBuilder classıbuild metodu içerisinde kullanılır)。
///
///
私人Snirgedosya(Snirgedosyabuilder formBuilder)
{
this.dosyaId=formBuilder.dosyaId;
this.userId=formBuilder.userId;
this.dosyaAdi=formBuilder.dosyaAdi;
this.oracleDbWorker=formBuilder.oracleDbWorker;
}
}
常见错误。您的属性正在getter/setter中调用自身。因此,当您设置dosyaId
时,它会设置dosyaId
,它设置dosyaId
,它设置dosyaId
,它。。。直到调用堆栈已满,并且您得到一个StackOverflowException
改变
public int dosyaId { set { dosyaId = value; } get { return dosyaId; } }
到
其他属性也是如此。我认为你没有必要根据你发布的内容设置支持字段。事实上,我认为没有必要使用
设置…
方法-您可以直接设置属性。常见错误。您的属性正在getter/setter中调用自身。因此,当您设置dosyaId
时,它会设置dosyaId
,它设置dosyaId
,它设置dosyaId
,它。。。直到调用堆栈已满,并且您得到一个StackOverflowException
改变
public int dosyaId { set { dosyaId = value; } get { return dosyaId; } }
到
其他属性也是如此。我认为你没有必要根据你发布的内容设置支持字段。事实上,我认为没有必要使用
set…
方法-您可以直接设置属性。这是一个无限循环-在属性中,您正在设置属性,该属性调用属性设置器,该设置器设置属性等,直到出现异常
创建属性设置和获取的成员变量(使用不同的名称,这称为支持字段),或者,由于这些是非常简单的属性,使其自动实现:
public int dosyaId { get; set; }
这是一个无限循环-在属性中,您正在设置属性,它调用属性设置器,设置属性,等等,直到异常发生 创建属性设置和获取的成员变量(使用不同的名称,这称为支持字段),或者,由于这些是非常简单的属性,使其自动实现:
public int dosyaId { get; set; }
真的谢谢你。你的回答似乎解决了我的问题。真的谢谢你。你的回答似乎解决了我的问题。谢谢你。它解决了我的问题。谢谢你。它解决了我的问题。