0

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

4

3 回答 3

3

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

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

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

现在,来处理你对constantsand的比较variables (虽然你没有直接比较它们,我要去)。Aconstant 实际上是a variable,与 a 相去甚远struct。事实上,根据定义,aconstant是:

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

于 2013-06-12T13:44:22.803 回答
3

No Structs 更像是一个轻量级的类。用户定义类型将更接近平行,变量可以指向类或结构的实例。

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

所以如果你做了类似的事情

v = new MyStruct(16);
w = v;
w.somevalue = 14;
v.somevalue would still be 16

好像 MyStruct 是我的类 w 和 v 将指向我的类的同一个实例。

于 2013-06-12T13:47:36.143 回答
2

不。结构/结构是值类型(通过值传递),而类是引用类型(通过引用传递)。

所以:

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 通常不必参与(因为值类型可以进入堆栈),但如果您按值将结构作为参数传递,则必须复制并传递整个结构。相比之下,将类作为参数传递是一种轻量级操作,因为这只是传递一个简单的引用。

于 2013-06-12T13:58:44.507 回答