Как сделать «структуру» нулевой по определению?

struct AccountInfo
{
   String Username;
   String Password;
}

теперь, если я хочу иметь экземпляр Nullable, я должен написать:

Nullable<AccountInfo> myAccount = null;

Но я хочу сделать struct Nullable по своей природе, и его можно использовать так (без использования Nullable<T>):

AccountInfo myAccount = null;

person Xaqron    schedule 20.12.2010    source источник
comment
Сделать это классом?   -  person Shurdoof    schedule 20.12.2010
comment
Я думал, что всего с двумя участниками будет забавный класс, мне было стыдно, что кто-то заглянет в мой код :)   -  person Xaqron    schedule 20.12.2010
comment
Изменяемая структура гораздо более проблематична, чем класс, состоящий только из двух членов.   -  person Dan Bryant    schedule 20.12.2010
comment
Побочный комментарий: есть ли причина использовать String вместо string?   -  person danielrozo    schedule 06.02.2014
comment
Ответы, в которых говорится, что это класс, хотя и в основном правильные, не учитывают случай, когда вы используете стороннюю библиотеку, содержащую тип структуры. В некоторых случаях вам может понадобиться член данных этого типа, который может быть неинициализирован или сброшен, и нет очевидного значения по умолчанию, которое работает. Изменить: какое решение ziplin ниже имеет адрес.   -  person Tim Keating    schedule 28.04.2015


Ответы (3)


Вы не можете. Struct считаются типами значений и по определению не могут быть нулевыми. Самый простой способ сделать его nullable — сделать его ссылочным типом.

Ответ, который вы должны задать себе: «Почему это структура?» и если вы не можете придумать действительно вескую причину, не делайте этого и сделайте это классом. Аргумент о том, что структура «быстрее», действительно преувеличен, поскольку структуры не обязательно создаются в стеке (вы не должны полагаться на это), а «полученная» скорость варьируется в каждом конкретном случае.

См. публикацию Эрика Липперта о дебатах между классами и структурами и скорости.

person kemiller2002    schedule 20.12.2010

Когда вы объявляете его, объявляйте его с помощью "?" Если вы предпочитаете

AccountInfo? myAccount = null;
person Dlongnecker    schedule 20.12.2010
comment
Это не определение. Это декларация. - person Chris Farmer; 20.12.2010

Краткий ответ: сделайте это классом.

Длинный ответ: эта структура является изменчивой, чего никогда не должно быть в структурах, не представляет единственное значение, которое всегда должно быть в структурах, и не имеет разумного «нулевого» значения, которое всегда должно быть в структурах, поэтому, вероятно, это не должен быть тип значения . Сделать его классом (ссылочным типом) означает, что он всегда может быть нулевым.


Примечание. Использование таких слов, как «никогда» и «всегда», следует понимать с подразумеваемым «почти».

person Greg Beech    schedule 20.12.2010