Есть ли быстрый способ обнуления структуры в С#?

Об этом, должно быть, уже был дан ответ, но я не могу найти ответ:

Есть ли быстрый и предоставленный способ обнуления struct в С# или мне нужно предоставить someMagicalMethod самостоятельно?

Чтобы быть ясным, я знаю, что структура будет инициализирована до 0, я хочу знать, есть ли быстрый способ сбросить значения до 0.

т.е.

struct ChocolateBar {
    int length;
    int girth;
}

static void Main(string[] args) {
    ChocolateBar myLunch = new ChocolateBar();
    myLunch.length = 100;
    myLunch.girth  = 10;

    // Eating frenzy...
    // ChocolateBar.someMagicalMethod(myLunch);

    // myLunch.length = 0U;
    // myLunch.girth = 0U;
}

Ответ 1

Просто используйте:

myLunch = new ChocolateBar();

или

myLunch = default(ChocolateBar);

Они эквивалентны 1 и оба будут назначать новое значение "все поля, установленное на ноль" на myLunch.

Кроме того, в идеале не следует использовать mutable structs для начала - я обычно предпочитаю создавать структуру, которая является неизменной, но которая имеет методы, которые возвращают новое значение с определенным полем, установленным по-разному, например.

ChocolateBar myLunch = new ChocolateBar().WithLength(100).WithGirth(10);

... и, конечно же, предоставить соответствующие конструкторы:

ChocolateBar myLunch = new ChocolarBar(100, 10);

1 По крайней мере, для структур, объявленных в С#. Типы значений могут иметь настраиваемые конструкторы без параметров в IL, но относительно сложно предсказать обстоятельства, в которых компилятор С# будет вызывать это, а не просто использовать значение "нуля" по умолчанию.

Ответ 2

Просто вызовите конструктор без параметров в свой код:

ChocolateBar chocolateBar = new ChocolateBar();

Ответ 3

Новый ChocolateBar инициализируется нулем. так:

myLunch = new ChocolateBar();

Это работает только потому, что ChocolateBar - тип struct/value. Если ChocolateBar был классом, это создало бы новый ChocolateBar и изменило бы myLunch, чтобы указать на него. Значения ChocolateBar, сохраненные в myLunch, будут равны нулю. Старый ChocolateBar не изменился и, в конце концов, будет востребован сборщиком мусора, если какая-либо другая ссылка не указала на старый myLunch тоже.

Ответ 4

struct являются value type. Они устанавливаются в ноль по умолчанию, когда вы его инициализируете.

int Значение по умолчанию равно нулю. Вам не нужно устанавливать его на ноль.

Ответ 5

Просто добавьте Zero в свою структуру, как показано ниже. Кроме того, в качестве бокового пункта рассмотрим использование конструкторов в ваших структурах, чтобы вы могли параметризовать свои переменные, а не устанавливать их отдельно:

public struct ChocolateBar {
    int length;
    int girth;

    public static ChocolateBar Zero { get; }

    public ChocolateBar(int length, int girth) {
        this.length = length;
        this.girth = girth;
    }
}

class OtherClass() {
    ChocolateBar cB = new ChocolateBar(5, 7);
    cB = ChocolateBar.Zero();

    Console.Writeline( (cB.length).ToString() ); // Should display 0, not 5
    Console.Writeline( (cB.girth).ToString() ); // Should display 0, not 7
}

Причина, по которой Zero получает значения 0, заключается в том, что значения по умолчанию (статические) int length и int girth равны 0, как упоминалось выше. И Zero сам статичен, поэтому вы можете обращаться к нему напрямую без ссылки на объект.

Другими словами, большинство (если не все) ваших структур должны иметь свойство Zero, а также конструктор. Это очень полезно.