有没有一种快速的方法可以在C#中对结构进行归零?

时间:2013-12-10 13:35:41

标签: c# struct

这一定已经回答了,但我找不到答案:

是否有一种快速提供的方法可以将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;
}

5 个答案:

答案 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)

structvalue 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 lengthint girth的默认(静态)值为0,正如上面其他人所提到的那样。 Zero本身是静态的,因此您可以直接访问它而无需对象引用。

换句话说,大多数(如果不是全部)结构应该具有Zero属性,以及构造函数。这非常实用。