Как сделать значение по умолчанию для struct 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);
}
}
Как я могу сделать значение по умолчанию для структуры?
4 ответов
ты не можешь. Структуры всегда предварительно обнулены, и нет никакой гарантии, что конструктор когда-либо вызывается (например,new MyStruct[10]
). Если вам нужны значения по умолчанию, отличные от нуля, вам нужно использовать класс. Вот почему вы не можете изменить конструктор по умолчанию в первую очередь (до C# 6) - он никогда не выполняется.
ближайший вы можете получить, используя Nullable
поля и интерпретация их для некоторого значения по умолчанию, если они равны null через свойство:
public struct MyStruct
{
int? myInt;
public int MyInt { get { return myInt ?? 42; } set { myInt = value; } }
}
myInt
is все еще предварительно обнулен, но вы интерпретируете "ноль" как свое собственное значение по умолчанию (в данном случае 42). Конечно, это могут быть совершенно ненужные накладные расходы:)
что касается Console.WriteLine
, Он просто называет виртуальный ToString
. Вы можете изменить его, чтобы вернуть все, что захотите.
ваша проблема не в поведении C#/.Сеть. Способ создания экземпляра структуры эффективно создает экземпляр со значениями по умолчанию для всех полей-членов.
на 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 is 0
и тест.str is null
надеюсь, что это помогает
что вы, вероятно, хотите сделать, это переопределить ToString()
, например,
struct Test
{
int num;
string str;
public override string ToString ()
{
return string.Format ($"{str} | {num}");
}
}
как вы уже упоминали, невозможно определить значения по умолчанию для полей, отличных от значений по умолчанию для соответствующих типов. Однако с переопределенным ToString()
, вы увидите более подробную информацию о вашей структуры в консоли и во время отладки.