这一定已经回答了,但我找不到答案:
是否有一种快速提供的方法可以将C#中的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;
}
答案 0 :(得分:24)
只需使用:
myLunch = new ChocolateBar();
或
myLunch = default(ChocolateBar);
这些是等效的 1 ,并且最终都会将新的“所有字段设置为零”值分配给myLunch
。
另外,理想情况下不要使用可变结构 - 我通常更喜欢创建一个不可变的结构,但是它的方法返回一个 new 值,并且特定的字段设置不同,例如
ChocolateBar myLunch = new ChocolateBar().WithLength(100).WithGirth(10);
......当然也提供适当的构造函数:
ChocolateBar myLunch = new ChocolarBar(100, 10);
1 至少对于在C#中声明的结构。值类型可以在IL中具有自定义无参数构造函数,但是相对很难预测C#编译器将调用它的情况而不是仅使用默认的“零”值。
答案 1 :(得分:11)
只需在代码中调用无参数构造函数:
ChocolateBar chocolateBar = new ChocolateBar();
答案 2 :(得分:5)
新的ChocolateBar
初始化为零。这样:
myLunch = new ChocolateBar();
这只能起作用,因为ChocolateBar
是结构/值类型。如果ChocolateBar
是一个类,则会创建一个新的ChocolateBar
并更改myLunch
以指向它。存储在ChocolateBar
中的myLunch
的值将为零。旧的ChocolateBar将保持不变,并最终由垃圾收集器声明,除非其他一些参考指向旧的myLunch。
答案 3 :(得分:2)
struct
是value type
。默认情况下,它们在初始化时设置为零。
int
默认值为零。您无需将其设置为零。
答案 4 :(得分:0)
只需将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
属性,以及构造函数。这非常实用。