概念上(和松散地),是一个类似于(vb)常量的结构体



我有VB/asp经典背景。关于结构体,在抽象意义上,它们与常量相似吗?换句话说,结构是常量什么类是变量(在一个非常松散的方式)?

No Structs更像是轻量级类。用户自定义类型更接近于此,变量可以指向类或结构体的实例。

真正重要的一点是struct是一个值类型,所以更像int而不是MyClass。

所以如果你做了像

这样的事情
v = new MyStruct(16);
w = v;
w.somevalue = 14;
v.somevalue would still be 16

如果MyStruct是我的类w和v将指向我的类的同一个实例

我会说你对所有这些概念的理解非常松散。根据定义,struct是:

…一种值类型,可以包含构造函数、常量、字段、方法、属性、索引器、操作符、事件和嵌套类型。

因此,就关联而言,struct更像class,因为class可以包含上述所有和更多。但是,有一个非常明显的区别,它与实例的传递方式有关。struct通过值显式传递,因为它是value type,而class通过引用传递,因为它是reference type。此外,为了澄清Asik所说的,value types有时存储在堆栈中,但如果它们是像class这样的容器的一部分,则可以存储在堆中。这是Eric Lippert写的很棒的博客。

现在,处理你的constantsvariables的比较(虽然你没有直接比较它们,我要)constant 实际上是 variable,与struct相去甚远。实际上,根据定义,constant是:

…字段或局部变量的声明。它指定字段或局部变量的值为常量,这意味着它不能被修改。

No。结构体/结构体是值类型(按值传递),而类是引用类型(按引用传递)。

:

class Program{
    static void main(){
        MyStruct testStruct; //we don't need a constructor for a struct
        testStruct.p_var = 10;
        change(testStruct);
        Console.WriteLine(testStruct.p_var);
    }
    static void change(MyStruct test){
        test.p_var = 20;
    }
}
struct MyStruct{
    public int p_var;
}

将打印10

将MyStruct更改为Class将需要构造函数(即使它不做任何事情),并导致程序打印20

使用struct时需要考虑性能问题。虽然GC通常不必参与(因为值类型可以放在堆栈上),但如果您将结构体作为参数按值传递,则必须复制并传递整个结构体。相比之下,将类作为参数传递是一种轻量级操作,因为它只是传递一个简单的引用。

最新更新