2016-10-04 1 views
4

Я пытаюсь сделать значение по умолчанию для моей структуры. Например, значение по умолчанию для Int - 0, для DateTime - 1/1/0001 12:00:00 AM Как известно, мы не можем определить конструктор без параметров в структуре.Как сделать значение по умолчанию для struct C#?

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?

+0

Читать подобную статью: http://stackoverflow.com/questions/4572325/how-to-make-default-value-with-a-struct- имущество –

ответ

7

Вы не можете. Структуры всегда предварительно обнуляются, и нет никакой гарантии, что конструктор когда-либо называется (например, 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. Вы можете изменить его, чтобы вернуть его, как хотите.

1

Распечатка объектов результатов C# с пространствами имен, если вы не переопределите .ToString() для ваших объектов. Можете ли вы определить свою структуру, как показано ниже, и попробовать?

public struct Test 
{ 
    int num; 
    string str; 
    public override string ToString() 
    { 
     return "Some string representation of this struct"; 
    } 
} 

PS: по умолчанию (Test) дает вам структуру содержит по умолчанию (INT) и по умолчанию (строка), который я имею в виду Test.num является 0 и Test.str является null

Надеется, что это помогает

2

Ваша проблема не в поведении C# /. Net. Способ создания структуры эффективно создает экземпляр со значениями по умолчанию для всех полей-членов.

Console.WriteLine преобразует аргумент в строку с использованием метода ToString(). Реализация по умолчанию (Object.ToString()) просто записывает полное имя класса (пространство имен и имя, как вы его называете).

Если вы хотите другой визуализации, вы должны переопределить метод ToString:

public struct Test 
{ 
    int num; 
    string str; 
    public override string ToString() 
    { 
     return $"num: {num} - str: {str}"; 
    } 
} 
0

Что вы, вероятно, хотите сделать, это переопределить ToString(), например.

struct Test 
{ 
    int num; 
    string str; 

    public override string ToString() 
    { 
     return string.Format ($"{str} | {num}"); 
    } 
} 

Как вы уже упоминали, невозможно определить значения по умолчанию для полей, отличных от значений по умолчанию, для их соответствующих типов. Однако с превышением ToString() вы увидите лучшую форматированную информацию о своей структуре в консоли и во время отладки.

0

Вы можете инициализировать struct так:

struct Test 
    { 
     public int num; 
     public string str; 
    }; 

static void Main(string[] args) 
    { 
      Test tdefault = new Test{ num = 1, str = "" }; 
      Test t = tdefault; 
    } 
Смежные вопросы