Как сделать значение по умолчанию для 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(), вы увидите более подробную информацию о вашей структуры в консоли и во время отладки.