2012-04-07 8 views
3

Das ist mein Eigentum auf meinem Code:Warum bekomme ich diese "Endlosschleife" auf Klasseneigenschaften?

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

aber es sagt:

Eine nicht behandelte Ausnahme des Typs 'System.StackOverflowException' in App_Code.rhj3qeaw.dll aufgetreten

Warum? Wie kann ich es reparieren?

EDIT

Nachdem der Code richtig, das ist mein eigentlicher Code:

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

Was denken Sie da?

+0

Was 'sonst {PadreInterno = null; } 'Gut für im korrigierten Code? Sie rufen diesen Code nur dann auf, wenn 'PadreInterno' auf jeden Fall' null' ist: 'if (PadreInterno == null)'. Vereinfachen Sie das wie folgt: if (PadreInterno == null && paginaDB.father! = Null) {PadreInterno = neue KPage ((int) paginaDB.father); } return PadreInterno; ' –

Antwort

7

Das Grundstück selbst ruft ... in der Regel Eigenschaften nennen zugrunde liegende Felder:

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; 

Ihr alter Code rekursiv die get der Padre Eigenschaft Aufruf wurde, daher die Ausnahme.

Wenn Ihr Code nur „bekommt“ und braucht nicht den Wert zu speichern, können Sie auch die dahinter liegende Feld vollständig loszuwerden:

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

Das heißt, würde ich dies in einem Verfahren setzen . Diese

ist auch das gleiche Problem wie die, die Sie vor ein paar Tagen gefragt:

An unhandled exception of type 'System.StackOverflowException' occurred

+0

Es ist ziemlich üblich, eine Eigenschaft träge zu laden; Das ist das erste Mal, dass es darum gebeten wird, dass es konstruiert und auf eine interne Eigenschaft gesetzt ist, und in allen zukünftigen Aufrufen wird diese Eigenschaft gerade zurückgegeben. Einige Eigenschaften sind ebenfalls inherent abgeleitete Daten und konstruieren so ein Objekt, das jedes Mal zurückgegeben wird. Der OP-Code ist es wert, erneut überlegt zu werden, aber es ist nicht 100% böse. – Servy

+0

@Servy Wahr genug, ich habe diesen Anwendungsfall vergessen. Dies ist kein typischer Fall von Lazy Loading, wohlgemerkt. –

+0

einverstanden, weshalb ich sagte, er sollte es überdenken, wenn das ein gutes Modell ist, nur nicht einfach ablehnen. – Servy

Verwandte Themen