Я вижу, что какой-то код вернет значение по умолчанию, поэтому мне интересно, какой класс будет определяться пользователем, как компилятор определит его значение по умолчанию?
Значение по умолчанию для определяемого пользователем класса в С#
Ответ 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
}