Можете ли вы создать свой собственный T по умолчанию, где T - ваш собственный класс - PullRequest
2 голосов
/ 18 июня 2009

Допустим, у меня есть следующее

public class A 
{
   private string _someField;
   public string SomeField { get { return _someField; } }
}

По какой-то причине я проверяю значение по умолчанию для этого класса, и я хотел бы установить значение по умолчанию для класса, так же как значение по умолчанию типа int равно 0, я хотел бы, чтобы в приведенном выше классе для моего значения по умолчанию Somefield "привет";

int i = default(int); // i is 0
A myClass = default(A);
string s = myClass.SomeField; // s is hello

Это больше для моего собственного теоретического удовлетворения, чем для практического применения. Просто интересно.

Ответы [ 6 ]

5 голосов
/ 18 июня 2009

Вы не можете изменить значение по умолчанию (T) для T. Оно всегда равно нулю для ссылочных типов и «пустое» значение для типов значений (т. Е. Для структуры все члены имеют значения по умолчанию, неинициализированные значения) .

5 голосов
/ 18 июня 2009

Нет. По умолчанию для классов (ссылочных типов) установлено значение null, и оно не может быть перегружено.

3 голосов
/ 18 июня 2009

Нет способа перегрузки по умолчанию (T).

Для меня это действительно звучит так, как будто вы просите ненулевые ссылочные типы, которых еще нет в .NET. Посмотрите здесь для реализации: http://msmvps.com/blogs/jon_skeet/archive/2008/10/06/non-nullable-reference-types.aspx

0 голосов
/ 18 июня 2009

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

void SomeMethod<T>(T something) where T : new()
    {
        T newObject = new T();
    }
0 голосов
/ 18 июня 2009

В случае классов (ссылочных типов) ключевое слово по умолчанию ничего не делает для членов класса, оно просто устанавливает всю ссылку на ноль

0 голосов
/ 18 июня 2009

Это должно сделать работу:

public class A 
{
   private string _someField = "hello";
   public string SomeField { get { return _someField; } }
}

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

[Edit: Это не совсем то, что вы хотите. Как и другие отмечали в комментариях, default (T), где T - класс, всегда будет иметь значение null.

Вместо этого вы обычно создаете класс вместо использования ключевого слова «по умолчанию».

A myClass = new A();
string defaultValue = myClass.SomeField // This will be set to "hello" by default.

]

...