2012-04-07 55 views
3

这是我在我的代码属性:为什么我会在Class属性上得到这个“无限循环”?

public KPage Padre 
{ 
    get 
    { 
     if (k_oPagina.father != null) 
     { 
      this.Padre = new KPage((int)k_oPagina.father); 
     } 
     else 
     { 
      this.Padre = null; 
     } 

     return this.Padre; 
    } 
    set { } 
} 

但它说:

类型 'System.StackOverflowException' 未处理的异常发生在App_Code.rhj3qeaw.dll

为什么?我该如何解决它?

编辑

后正确的代码,这是我的实际代码:

private KPage PadreInterno; 
public KPage Padre 
{ 
    get 
    { 
     if (PadreInterno == null) 
     { 
      if (paginaDB.father != null) 
      { 
       PadreInterno = new KPage((int)paginaDB.father); 
      } 
      else 
      { 
       PadreInterno= null; 
      } 
     } 

     return PadreInterno; 
    } 
} 

你怎么看待呢?

+0

什么是'其他{PadreInterno = NULL; }在修正的代码中有用吗?无论如何,只有当'PadreInterno'为'null'时才调用该代码:'if(PadreInterno == null)'。像这样简化if(PadreInterno == null && paginaDB.father!= null){PadreInterno = new KPage((int)paginaDB.father); }返回PadreInterno;' – 2012-04-07 17:16:12

回答

7

该物业自称...通常性能调用底层的领域:

public KPage Padre 
    { 
     get 
     { 
      if (k_oPagina.father != null) 
      { 
       _padre = new KPage((int)k_oPagina.father); 
      } 
      else 
      { 
       _padre = null; 
      } 

      return _padre; 
     } 
     set { } 
    } 

    private KPage _padre; 

您的旧代码是递归调用Padre财产get,因此例外。

如果只有你的代码“获得”,并不需要存储的价值,你也可以摆脱完全支持字段的:

public KPage Padre 
    { 
     get 
     { 
      return k_oPagina.father != null 
       ? new KPage((int)k_oPagina.father) 
       : (KPage)null; 
     } 
    } 

这就是说,我把这个方法。

这也是同样的问题,你问了前两天的一个:

An unhandled exception of type 'System.StackOverflowException' occurred

+0

懒惰地载入属性是相当常见的;这是第一次被要求它被构建并设置为内部属性,并且在将来的所有调用中,该属性只是返回。一些属性也是固有的派生数据,所以构造一个对象以便每次返回。 OP的代码值得重新考虑,但它不是100%的邪恶。 – Servy 2012-04-07 16:33:40

+0

@Servy真的够了,我忘记了这个用例。这不是懒加载的典型情况,请注意。 – 2012-04-07 16:35:14

+0

同意,这就是为什么我说他应该重新考虑这是否是一个好的模型,只是不要直接拒绝它。 – Servy 2012-04-07 16:39:39

相关问题