Есть ли быстрый способ обнуления структуры в С#?
Об этом, должно быть, уже был дан ответ, но я не могу найти ответ:
Есть ли быстрый и предоставленный способ обнуления 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
, а также конструктор. Это очень полезно.