Как вы даете C-Auto-Property значение по умолчанию? - PullRequest
1663 голосов
/ 03 сентября 2008

Как задать для свойства C # Auto-Property значение по умолчанию? Я либо использую конструктор, либо возвращаюсь к старому синтаксису.

Использование конструктора:

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

Использование обычного синтаксиса свойства (со значением по умолчанию)

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

Есть ли лучший способ?

Ответы [ 23 ]

1958 голосов
/ 03 сентября 2008

В C # 5 и более ранних версиях, чтобы автоматически реализовать свойства, реализованные автоматически, вы должны сделать это в конструкторе.

Возможность иметь авто инициализаторы свойств включена начиная с C # 6.0. Синтаксис:

public int X { get; set; } = x; // C# 6 or higher
271 голосов
/ 22 июня 2011

Отредактировано 1/2/15

C # 6 :

С C # 6 вы можете инициализировать авто-свойства напрямую (наконец-то!), Теперь в ветке есть другие ответы, описывающие это.

C # 5 и ниже :

Хотя предполагаемое использование атрибута не в том, чтобы фактически устанавливать значения свойств, вы можете использовать отражение, чтобы всегда устанавливать их в любом случае ...

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; }
}
148 голосов
/ 04 сентября 2008

Когда вы встраиваете начальное значение для переменной, это все равно будет сделано неявно в конструкторе.

Я бы сказал, что этот синтаксис был лучшей практикой в ​​C # до 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; }
}

Поскольку это дает вам четкий контроль над назначенными значениями заказа.

Начиная с C # 6, появился новый способ:

public string Name { get; set; } = "Default Name"
83 голосов
/ 03 сентября 2008

DefaultValueAttribute работают ТОЛЬКО в vs конструкторе. Это не будет инициализировать свойство к этому значению.

См. Атрибут DefaultValue не работает с моим автоматическим свойством

57 голосов
/ 03 сентября 2008

Иногда я использую это, если я не хочу, чтобы оно было фактически установлено и сохранено в моей базе данных:

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

        set { _name = value; } 
    }
}

Очевидно, что если это не строка, я мог бы сделать объект обнуляемым (double?, Int?) И проверить, равен ли он нулю, вернуть значение по умолчанию или вернуть значение, которое ему присвоено.

Затем я могу сделать проверку в своем репозитории, чтобы увидеть, является ли она моим значением по умолчанию и не сохраняется, или выполнить проверку бэкдора, чтобы увидеть истинный статус значения поддержки перед сохранением.

Надеюсь, это поможет!

39 голосов
/ 25 июля 2016

В C # 6.0 это бриз!

Вы можете сделать это в самой декларации Class, в операторах объявления свойств.

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;
    }
}
38 голосов
/ 29 апреля 2014

Начиная с C # 6.0 , мы можем назначить значение по умолчанию для автоматически реализуемых свойств.

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

Мы также можем создать автоматически реализованное свойство только для чтения, например:

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

См .: C # 6: Первые реакции, Инициализаторы для автоматически реализуемых свойств - Джон Скит

26 голосов
/ 15 марта 2017

В версии C # (6.0) и выше вы можете сделать:

Для объектов Readonly

public int ReadOnlyProp => 2;

Как для записываемых, так и для читаемых свойств

public string PropTest { get; set; } = "test";

В текущей версии C # (7.0) вы можете сделать следующее: (Фрагмент кода скорее показывает, как можно использовать средства доступа get / set для выражения выражения, чтобы сделать его более компактным при использовании с полями поддержки)

private string label = "Default Value";

// Expression-bodied get / set accessors.
public string Label
{
   get => label;
   set => this.label = value; 
 }
16 голосов
/ 30 октября 2016

В дополнение к уже принятому ответу, для сценария, когда вы хотите определить свойство по умолчанию как функцию других свойств, вы можете использовать примечание тела выражения на C # 6.0 (и выше) для еще более элегантных и лаконичных конструкций, таких как:

public class Person{

    public string FullName  => $"{First} {Last}"; // expression body notation

    public string First { get; set; } = "First";
    public string Last { get; set; } = "Last";
}

Вы можете использовать вышеперечисленное следующим образом

    var p = new Person();

    p.FullName; // First Last

    p.First = "Jon";
    p.Last = "Snow";

    p.FullName; // Jon Snow

Чтобы использовать вышеуказанную запись "=>", свойство должно быть доступно только для чтения, и вы не используете ключевое слово get accessor.

Подробная информация о MSDN

13 голосов
/ 17 июня 2010

маленький полный образец:

using System.ComponentModel;

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