2012-03-21 14 views
9

Se produjo una excepción no controlada del tipo 'System.StackOverflowException' en wcfserviceLibrary.DLLSystem.StackOverflowException, cuando se establece ¿Se usan las propiedades?

el código se muestra de la siguiente manera.

[DataContract] 
public class memberdesignations 
{ 
    [DataMember] 
    public string DesigId 
    { 
     get { return DesigId; } 
     set { DesigId = value;} 
    } 
    [DataMember] 
    public string DesignationName 
    { 
     get { return DesignationName; } 
     set { DesignationName = value; } 
    } 

} 

entonces he método de memberdesignations Tipo de la siguiente manera

public List<memberdesignations> memberdesignations() 
    { 
     List<memberdesignations> designations = new List<memberdesignations>(); 
     memberdesignations objmemDesignations; 
     ds = objbll.Get_Member_Designations(); 
     DataView dv = new DataView(); 
     dv = ds.Tables[0].DefaultView; 
     foreach (DataRowView drow in dv) 
     { 
      objmemDesignations = new memberdesignations(); 
      objmemDesignations.DesigId = drow["DesignationId"].ToString(); 
      objmemDesignations.DesignationName = drow["DesignationName"].ToString(); 
      designations.Add(objmemDesignations); 
     } 
     return designations; 
    } 

iam conseguir el error en la clase que contiene las propiedades del conjunto de conseguir.

Pero yo era capaz de deshacerse del error cuando lo modifico la clase como esta:

[DataContract] 
public class memberdesignations 
{ 
    [DataMember] 
    public string DesigId 
    { 
     get; set; 
    } 
    [DataMember] 
    public string DesignationName 
    { 
     get; set; 
    } 
} 

en la búsqueda del foro, he encontrado la causa por la que era y explica por Konamiman here

me gustaría saber la diferencia entre las dos formas diferentes de propiedades explicadas por Konamiman

o cualquier otra explicación sería apreciada.

Gracias

+0

debes aceptar una respuesta a continuación. –

+0

@Valamas acepté la respuesta, gracias por recordarme. – Mourya

Respuesta

24

El problema es que, como dijo Konamiman, está llamando a una propiedad recursivamente.

Digamos que tengo una propiedad de cadena "DesignationName".

public string DesignationName 
{ 
    //Some getter to return some data 
    //Some setter to set the data 
} 

¿Qué esperarías que volviera? ¿Qué tal si devolvemos una cadena codificada _designationName?

private string _designationName = "someName"; 
public string DesignationName 
{ 
    get {return _designationName;} 
    //Some setter to set the data 
} 

Eso funciona. Pero, ¿qué pasaría si tuviera que devolverlo?

public string DesignationName 
{ 
    get {return DesignatioName;} 
    //Some setter to set the data 
} 

Bueno, sería seguir llamando DesignationName, lo que mantendría que se hace llamar de nuevo, lo que de nuevo llamar DesignationName ... y así sucesivamente. Todo esto pone datos en la pila y continúa para siempre hasta que se sobrepase el espacio asignado para la pila. Voila, un stackoverflow.

El motivo por el que funciona su último ejemplo es porque está utilizando lo que se denomina 'autopropiedad', una nueva característica de .NET 3.0. Básicamente, detrás de las escenas, que es la creación de campos de respaldo para sus propiedades para que esto:

public string DesignationName 
{ 
    get; 
    set; 
} 

realidad compila a comportarse de esta manera:

private string _designationName = string.Empty; 
public string DesignationName 
{ 
    get { return _designationName; } 
    set { _designationName = value; } 
} 
+0

Las propiedades implementadas automáticamente eran una característica de C# 3.0 :) –

+0

@Killnine, así que puedo ir con solo obtener; conjunto;. gracias por la explicación. – Mourya

+0

Después de referirme a todas las respuestas publicadas aquí, visité el artículo de MSDN que tiene una explicación detallada sobre las propiedades. visite el enlace [aquí] (http://msdn.microsoft.com/en-us/library/w86s7x04.aspx) – Mourya

3

Usted se refiere a la propiedad en sí en el organismo, por lo que se llama a sí mismo de forma recursiva. (Una y otra vez hasta que los desbordamientos de pila)

Mediante el uso de la notación de la mano corta con sólo obtener; y establecer; básicamente está agregando un campo de respaldo implícito (como una variable de respaldo). De esta manera, no activará llamadas recursivas ya que su propiedad es solo un contenedor alrededor del campo de respaldo.

+0

gracias por la explicación, ahora entendí la causa principal del error – Mourya

4

declaran variables privadas para ambos: _desigId, _designationName.Estás en un bucle recursivo que continuará infinitamente. devuelve las variables privadas, en lugar de las propiedades.

Cuestiones relacionadas