Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StackOverFlow例外:你能帮我解决这个问题吗?_C#_Exception_Stack Overflow_Builder - Fatal编程技术网

C# StackOverFlow例外:你能帮我解决这个问题吗?

C# StackOverFlow例外:你能帮我解决这个问题吗?,c#,exception,stack-overflow,builder,C#,Exception,Stack Overflow,Builder,我设计了一个实现Builder设计模式的类。但使用其生成器创建该类时,会引发系统异常,即StackOverFlow异常。我知道它的构建器是递归的,但我只调用了它的构建链的三倍。我真的不明白这是什么,我也不明白。下面是我的类,它包含自己的构建器 SnirgeeDosya sn = new SnirgeeDosya.SnirgeeDosyaBuilder() .setDosyaId(0) .setDosyaAdi("Dosya1")

我设计了一个实现Builder设计模式的类。但使用其生成器创建该类时,会引发系统异常,即StackOverFlow异常。我知道它的构建器是递归的,但我只调用了它的构建链的三倍。我真的不明白这是什么,我也不明白。下面是我的类,它包含自己的构建器

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; }

真的谢谢你。你的回答似乎解决了我的问题。真的谢谢你。你的回答似乎解决了我的问题。谢谢你。它解决了我的问题。谢谢你。它解决了我的问题。