Значение по умолчанию для определенного пользователем класса в C # - PullRequest
51 голосов
/ 17 декабря 2009

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

Ответы [ 8 ]

59 голосов
/ 17 декабря 2009

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

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

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

14 голосов
/ 17 декабря 2009

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

11 голосов
/ 17 декабря 2009

Примечание. 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

7 голосов
/ 17 декабря 2009

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

3 голосов
/ 25 августа 2016

Я бы сделал этот экземпляр класса "по умолчанию" полем, а не свойством, например, как выглядит 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
}
3 голосов
/ 17 декабря 2009

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

2 голосов
/ 17 декабря 2009
Assert.IsTrue(default(MyClass) == null);
1 голос
/ 03 апреля 2015

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

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

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

Итак, в общем, я думаю, что это особенность языка, которая нам действительно не нужна. И по умолчанию (MyClass) всегда будет == ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...