2010-06-30 16 views
5

He leído que hay buenas razones para usar propiedades en lugar de campos en C# en SO. Así que ahora quiero convertir mi código de usar campos a usar propiedades.¿Existe alguna manera elegante de establecer un valor predeterminado para una propiedad en C#?

Para un campo de instancia de una clase, puedo establecer un valor predeterminado. Por ejemplo:

int speed = 100; 

para la propiedad equivalente, que creo que es:

int Speed { get; set; } 

Mi entendimiento es que la propiedad de velocidad será inicializado a cero cuando se crea una instancia de la clase. No he podido averiguar cómo establecer un valor predeterminado para actualizar fácilmente mi código. ¿Hay alguna manera elegante de proporcionar un valor predeterminado para una propiedad?

Parece que debe haber una manera elegante de hacer esto, sin usar un constructor, pero no puedo averiguar cómo.

+0

¿Qué hay de malo en usar un constructor? ¿O usar una propiedad con un campo de respaldo definido manualmente en lugar de una propiedad automática? –

+0

Facilitaría mi tarea de conversión si puedo cambiar el campo a una propiedad en el mismo lugar donde el campo fue declarado previamente. Usando un constructor necesitaría desplazarme por mi código para hacer el cambio. No sabía que podría usar un campo de respaldo que se inicializó. –

+0

Nuevo en C# 6: [Inicializadores para auto-propiedades] (https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#auto-property-enhancements) –

Respuesta

7

La mejor opción es hacer una propiedad respaldado campo normal antigua usanza, como:

private int _speed = 100; 
public int Speed { get { return _speed; } set { _speed = value; } } 
+0

Gracias para el código. Eso es bastante elegante y no tengo que usar un constructor. Brillante. –

+0

Sin problema Esto es lo que verá todo el tiempo para el código escrito antes de .NET 3.0. Con 3.0, se introdujo la propiedad automática, pero se encuentra exactamente con el problema que planteó, donde no puede definir un valor predeterminado simplemente, sin usar el constructor. –

+0

Todavía me gusta la forma antigua de hacer las propiedades, sin embargo, puede causar confusión porque no se sabe qué forma de obtener/establecer el valor de dentro de la clase. ¿Utiliza la variable de instancia o usa la propiedad? –

1

debe establecer el valor predeterminado para la propiedad en el constructor. No hay otra manera de hacerlo además de esto para las propiedades automáticas ya que los campos para los apoyos automáticos se declaran en tiempo de compilación y se reemplazan en getter/setter. Sin embargo, en propiedades explícitas, puede inicializar el campo que la propiedad utiliza para leer o escribir como Joe mencionó en su respuesta.

0

El constructor es la única manera de establecer el valor inicial de una propiedad de auto.

1

CciSharp es compatible con DefaultValue attribute, que permite colocar valores predeterminados en propiedades automáticas. Si CciSharp califica como una solución "elegante", sin embargo, es una cuestión de opinión (actúa como un compilador posterior que edita el IL en el binario).

2

El patrón de diseño que uso, que se utiliza en todos los controles Windows.Forms de Microsoft y otras clases .NET. Además, desde mi comprensión, la inicialización fuera del contructor permite que el compilador just-in-time optimice el código de clase.

public class Foo { 
    public static const int DefaultSpeed = 100; 
    private int _speed = DefaultSpeed; 
    [DefaultValue(DefaultSpeed)] 
    public int Speed { get { return _speed; } set { _speed = value; } } 
} 

public class Foo { 
     public static Color DefaultForecolor { get {return SystemColors.WindowText; }} 
     private Color _forecolor = DefaultForecolor; 
     [DefaultValue(DefaultForeColor)] 
     public Color Forecolor { get { return _forecolor; } set { _forecolor = value; } } 
    } 
Cuestiones relacionadas