2009-12-17 22 views
40

Veo que algún código devolverá el valor predeterminado, entonces me pregunto si una clase definida por el usuario, ¿cómo definirá el compilador su valor predeterminado?Valor predeterminado para la clase definida por el usuario en C#

+2

Solo para aclarar: todas las clases (incluyendo los que se crean) tome por defecto 'null'. Los tipos de valor numérico se establecerán por defecto en cero y las estructuras se definirán en la implementación (los valores se establecen en el constructor). –

+3

En realidad, las estructuras tienen un constructor predeterminado implícito que no se puede sobrescribir, que es cero por la memoria utilizada por la estructura, por lo que el valor predeterminado sigue siendo el compilador definido, no la implementación definida. –

+0

Distinción importante: _Los miembros de clase_ se inicializan con su valor predeterminado. Las variables de función local no inicializadas solo dan errores de compilación;) – Nyerguds

Respuesta

48

a sonar con el resto, será null, pero también hay que añadir que se puede obtener el valor por defecto de cualquier tipo, utilizando default

default(MyClass) // null 
default(int) // 0 

Puede ser especialmente útil cuando se trabaja con los genéricos ; Es posible que desee devolver default(T), si su tipo de devolución es T y no desea suponer que es anulable.

+3

+1 Hay una explicación completa de la palabra clave predeterminada en http://msdn.microsoft.com/en-us/library/xwth0h0d%28VS.80%29.aspx –

12

El valor por defecto para class es una null

3

Si se trata de un tipo de referencia, el valor por defecto será null, si se trata de un tipo de valor, entonces depende.

2
Assert.IsTrue(default(MyClass) == null); 
+1

what ¿El propósito de esto es afirmar? –

11

Nota: Una DefaultValueAttribute no hará que un miembro se inicialice automáticamente con el valor del atributo. Debe establecer el valor inicial en su código.

Puede decorar sus propiedades con DefaultValueAttribute.

private bool myVal=false; 

[DefaultValue(false)] 
public bool MyProperty { 
    get { 
     return myVal; 
    } 
    set { 
     myVal=value; 
    } 
} 

Sé que no se trata de responder a tu pregunta, solo quería añadir esto como información relevante.

Para más información ver http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx

+0

Como dice la página, DefaultValue es algo utilizado por el diseñador visual de VS. Realmente no está relacionado con la inicialización real; es solo una "pista" de cómo debe inicializarse. – Nyerguds

5

El valor por defecto para las clases se null. Para las estructuras, el valor predeterminado es el mismo que se obtiene al crear una instancia del constructor sin parámetros predeterminado de la estructura (que por cierto no puede ser anulado). La misma regla se aplica recursivamente a todos los campos contenidos dentro de la clase o estructura.

1

Si está buscando de algún modo definir un valor predeterminado no nulo para un tipo de referencia, tenga en cuenta que no tendría sentido que un tipo de referencia tenga un valor predeterminado. En algún punto, una referencia necesitaría apuntar a la memoria asignada para el objeto construido. Para que sea posible, imagino dos implementaciones:

  1. definir una instancia estática como predeterminado: esto podría funcionar, pero requeriría probablemente una manera muy torpe para identificar de alguna manera al compilador dónde obtener la instancia estática. No es realmente una característica que valga la pena poner en el lenguaje.

  2. Permitir llamar al constructor predeterminado cada vez que aparece el valor predeterminado en una expresión: esto sería terrible porque ahora tiene que preocuparse de que dos valores predeterminados sean desiguales porque no anuló Igual a no comparar referencias, y también es terrible debido a la administración de la memoria y al rendimiento de la asignación de memoria, y los efectos secundarios del constructor.

Así que, en resumen, creo que es una función de idioma que realmente no queremos. Y por defecto (MyClass) siempre será == nulo.

0

Me gustaría hacer esta instancia de clase "por defecto" un campo en lugar de la propiedad, como la forma System.String.Empty Apariencia:

public class Person 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 

    public static readonly Person Default = new Person() 
    { 
     Name = "Some Name", 
     Address = "Some Address" 
    }; 
} 

... 

public static void Main(string[] args) 
{ 
    string address = String.Empty; 

    Person person = Person.Default; 

    //the rest of your code 
} 
Cuestiones relacionadas