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

时间:2013-06-12 13:34:23

标签: c# .net oop

我有一个VB / asp经典背景。关于结构,从抽象的意义上讲,它们是否与常数相似?换句话说,Structs是常量,类是变量(以非常宽松的方式)?

3 个答案:

答案 0 :(得分:3)

我会说你对所有这些概念都有非常宽松的理解。 structby definition是:

  

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

因此,就关联而言,struct更像是class,因为class可以包含所有上述内容和更多内容。但是,有一个非常明显的差异,,它与实例的传递方式有关。 struct显式传递按值,因为它是value type,而class是通过引用传递 ,因为它是{ {1}}。此外,为了澄清Asik所陈述的内容,reference type 有时存储在堆栈中,但如果它们是value types之类的容器的一部分,则可以存储在堆上。这是一个精彩博客,真正打破了by Eric Lippert

现在,要处理您对classconstants 的比较(虽然您没有直接比较它们,我会去)variables 实际上是一个constant,而不是variable。事实上,by definitionstruct是:

  

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

答案 1 :(得分:3)

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

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

所以,如果你做了像

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

好像MyStruct是我的班级w而v会指向我班级的同一个实例。

答案 2 :(得分:2)

没有。 Structs / Structures是值类型(按值传递),而类是引用类型(通过引用传递)。

所以:

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更改为类需要构造函数(即使它不执行任何操作)并导致程序打印20

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