Как сделать значение по умолчанию для структуры 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 6
c#

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