Значение по умолчанию для определяемого пользователем класса в С#

Я вижу, что какой-то код вернет значение по умолчанию, поэтому мне интересно, какой класс будет определяться пользователем, как компилятор определит его значение по умолчанию?

Ответ 1

Чтобы прослушивать с остальными, это будет null, но я также должен добавить, что вы можете получить значение по умолчанию любого типа, используя default

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

Это может быть особенно полезно при работе с дженериками; вам может потребоваться вернуть default(T), если ваш тип возврата T, и вы не хотите предполагать, что он является допустимым.

Ответ 2

Значение по умолчанию для class - это null

Ответ 3

Примечание: атрибут DefaultValueAttribute не приведет к тому, что член будет автоматически инициализирован значением атрибута. Вы должны установить начальное значение в своем коде.

Вы можете украсить свои свойства с помощью атрибута DefaultValueAttribute.

private bool myVal=false;

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

Я знаю, что это не отвечает на ваш вопрос, просто хотел добавить это в качестве релевантной информации.

Подробнее см. http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx

Ответ 4

Значение по умолчанию для классов null. Для структур значение по умолчанию такое же, как и при создании экземпляра конструктора без параметров по умолчанию (который, кстати, не может быть переопределен). Это же правило применяется рекурсивно ко всем полям, содержащимся внутри класса или структуры.

Ответ 5

Если это ссылочный тип, значением по умолчанию будет null, если это тип значения, тогда это зависит.

Ответ 6

Assert.IsTrue(default(MyClass) == null);

Ответ 7

Если вы хотите каким-то образом определить ненулевое значение по умолчанию для ссылочного типа, поймите, что для ссылочного типа не было бы значения по умолчанию. В какой-то момент ссылка должна указывать на выделенную память для построенного объекта. Чтобы это было возможно, я представляю две реализации:

  • Определите статический экземпляр как значение по умолчанию: это может работать, но, вероятно, потребуется действительно неуклюжий способ как-то идентифицировать компилятор, где получить статический экземпляр. На самом деле это не значит, что нужно вставлять язык.

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

Итак, я думаю, что это языковая функция, которую мы действительно не хотим. И default (MyClass) всегда будет == null.

Ответ 8

Я бы сделал этот экземпляр класса "по умолчанию" полем, а не свойством, как выглядит System.String.Empty:

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
}