Pregunta ¿Cómo le das a C # Auto-Property un valor predeterminado?


¿Cómo le das a C # Auto-Property un valor predeterminado? Yo uso el constructor o vuelvo a la sintaxis anterior.

 Usando el Constructor:

class Person 
{
    public Person()
    {
        Name = "Default Name";
    }
    public string Name { get; set; }
}

Usando la sintaxis de propiedad normal  (con un valor predeterminado)

private string name = "Default Name";
public string Name 
{
    get 
    {
        return name;
    }
    set
    {
        name = value;
    }
}

¿Hay una mejor manera?


1419
2017-09-02 21:29


origen


Respuestas:


En C # 5 y anteriores, para dar a las propiedades implementadas automáticamente un valor predeterminado, debe hacerlo en un constructor.

La capacidad de tener inicializadores de propiedad de auto se incluye desde C # 6.0. La sintaxis es:

public int X { get; set; } = x; // C# 6 or higher

1574
2017-09-02 21:46



Editar 1/2/15

Con C # 6 puede inicializar auto-propiedades directamente (¡finalmente!), Ahora hay otras respuestas en el hilo que describen eso.

Para C # 5 y abajo:

Aunque el uso previsto del atributo no es establecer realmente los valores de las propiedades, puede usar el reflejo para establecerlos siempre de todos modos ...

public class DefaultValuesTest
{    
    public DefaultValuesTest()
    {               
        foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this))
        {
            DefaultValueAttribute myAttribute = (DefaultValueAttribute)property.Attributes[typeof(DefaultValueAttribute)];

            if (myAttribute != null)
            {
                property.SetValue(this, myAttribute.Value);
            }
        }
    }

    public void DoTest()
    {
        var db = DefaultValueBool;
        var ds = DefaultValueString;
        var di = DefaultValueInt;
    }


    [System.ComponentModel.DefaultValue(true)]
    public bool DefaultValueBool { get; set; }

    [System.ComponentModel.DefaultValue("Good")]
    public string DefaultValueString { get; set; }

    [System.ComponentModel.DefaultValue(27)]
    public int DefaultValueInt { get; set; }
}

242
2018-06-22 18:14



Cuando en línea un valor inicial para una variable, se hará de forma implícita en el constructor de todos modos.

Yo diría que esta sintaxis fue la mejor práctica en C # hasta 5:

class Person 
{
    public Person()
    {
        //do anything before variable assignment

        //assign initial values
        Name = "Default Name";

        //do anything after variable assignment
    }
    public string Name { get; set; }
}

Como esto le da un control claro de los valores de orden, se asignan.

A partir de C # 6 hay una nueva forma:

public string Name { get; set; } = "Default Name"

128
2017-09-04 12:16



DefaultValueAttribute SÓLO funciona en el diseñador vs. No inicializará la propiedad a ese valor.

Ver El atributo DefaultValue no funciona con mi propiedad de auto


73
2017-09-02 22:44



A veces uso esto, si no quiero que realmente se establezca y persista en mi db:

class Person
{
    private string _name; 
    public string Name 
    { 
        get 
        {
            return string.IsNullOrEmpty(_name) ? "Default Name" : _name;
        } 

        set { _name = value; } 
    }
}

Obviamente, si no se trata de una cadena, entonces podría hacer que el objeto sea nulo (double ?, int?) Y comprobar si es nulo, devolver un valor predeterminado o devolver el valor establecido.

Luego puedo verificar en mi repositorio para ver si es mi predeterminado y no persistir, o hacer una verificación de puerta trasera para ver el verdadero estado del valor de respaldo, antes de guardar.

¡Espero que ayude!


48
2017-09-02 23:07



Comenzando con C # 6.0, Podemos asignar un valor predeterminado a las propiedades implementadas automáticamente.

public string Name { get; set; } = "Some Name";

También podemos crear propiedades implementadas automáticamente de solo lectura como:

public string Name { get; } = "Some Name";

Ver: C # 6: Primeras reacciones, Inicializadores para propiedades implementadas automáticamente - Por Jon Skeet


23
2018-04-29 14:40



En C # 6.0 esto es muy sencillo.

Puedes hacerlo en el Class declaración en sí misma, en las declaraciones de declaración de propiedad.

public class Coordinate
{ 
    public int X { get; set; } = 34; // get or set auto-property with initializer

    public int Y { get; } = 89;      // read-only auto-property with initializer

    public int Z { get; }            // read-only auto-property with no initializer
                                     // so it has to be initialized from constructor    

    public Coordinate()              // .ctor()
    {
        Z = 42;
    }
}

17
2017-07-25 19:35



pequeña muestra completa:

using System.ComponentModel;

private bool bShowGroup ;
[Description("Show the group table"), Category("Sea"),DefaultValue(true)]
public bool ShowGroup
{
    get { return bShowGroup; }
    set { bShowGroup = value; }
}

11
2018-06-17 07:44