Как сделать значение по умолчанию для структуры c#?
Я пытаюсь сделать значение по умолчанию для моей структуры. Например, значение по умолчанию для Int-0, для DateTime-1/1/0001 12: 00: 00 AM Как известно, мы не можем определить беспараметрический конструктор в структуре.
struct Test
{
int num;
string str;
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(default(Test)); // shows namespace and name of struct test.Test
Console.WriteLine(new Test()); // same
Console.ReadKey(true);
}
}
Как я могу сделать значение по умолчанию для struct?
4 ответа:
Структуры всегда предварительно обнуляются, и нет никакой гарантии, что конструктор когда-либо вызывается (например,
new MyStruct[10]
). Если вам нужны значения по умолчанию, отличные от нуля, вам нужно использовать класс. Вот почему вы не можете изменить конструктор по умолчанию в первую очередь (до C# 6) - он никогда не выполняется.Самое близкое, что вы можете получить, это используя поля
Nullable
и интерпретируя их, чтобы иметь некоторое значение по умолчанию, если они равны нулю через свойство:public struct MyStruct { int? myInt; public int MyInt { get { return myInt ?? 42; } set { myInt = value; } } }
myInt
все еще предварительно обнулено, но вы интерпретируйте "ноль" как собственное значение по умолчанию (в данном случае 42). Конечно, это могут быть совершенно ненужные накладные расходы :)Что касается
Console.WriteLine
, то он просто называет виртуальныйToString
. Вы можете изменить его, чтобы вернуть все, что захотите.
Ваша проблема не в поведении C#/. Net. способ создания экземпляра структуры эффективно создает экземпляр со значениями по умолчанию для всех полей-членов.
Console.WriteLine
преобразует свой аргумент в строку с помощью метода ToString (). Реализация по умолчанию (Object.ToString()
) просто записывает полное имя класса (пространство имен и имя, как вы его называете).Если вы хотите другую визуализацию, вы должны переопределить метод
ToString
:public struct Test { int num; string str; public override string ToString() { return $"num: {num} - str: {str}"; } }
Печать объектов результатов C# с пространствами имен, если вы не переопределяете .ToString () для ваших объектов. Можете ли вы определить свою структуру, как показано ниже ,и попробовать ее?
public struct Test { int num; string str; public override string ToString() { return "Some string representation of this struct"; } }
PS: default(Test) дает вам структуру, содержащую default(int) и default (string), которую я имею в виду Test.num - это
0
и тест.str - этоnull
Надеюсь, это поможет
То, что вы, вероятно, хотите сделать, это переопределить
ToString()
, напримерstruct Test { int num; string str; public override string ToString () { return string.Format ($"{str} | {num}"); } }
Как вы уже упоминали, невозможно определить значения по умолчанию для полей, отличных от значений по умолчанию для их соответствующих типов. Однако с переопределенным
ToString()
, Вы будете видеть лучше отформатированную информацию о вашей структуре в консоли и во время отладки.