我有一个VB / asp经典背景。关于结构,从抽象的意义上讲,它们是否与常数相似?换句话说,Structs是常量,类是变量(以非常宽松的方式)?
答案 0 :(得分:3)
我会说你对所有这些概念都有非常宽松的理解。 struct
,by definition是:
...一个值类型,可以包含构造函数,常量,字段,方法,属性,索引器,运算符,事件和嵌套类型。
因此,就关联而言,struct
更像是class
,因为class
可以包含所有上述内容和更多内容。但是,有一个非常明显的差异,,它与实例的传递方式有关。 struct
显式传递按值,因为它是value type
,而class
是通过引用传递 ,因为它是{ {1}}。此外,为了澄清Asik所陈述的内容,reference type
有时存储在堆栈中,但如果它们是value types
之类的容器的一部分,则可以存储在堆上。这是一个精彩博客,真正打破了by Eric Lippert。
现在,要处理您对class
和constants
的比较(虽然您没有直接比较它们,我会去)。 variables
实际上是一个constant
,而不是variable
。事实上,by definition,struct
是:
......字段或局部变量的声明。它指定字段或局部变量的值是常量,这意味着它不能被修改。
答案 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通常不必涉及(因为值类型可以在堆栈上),但如果按值将结构作为参数传递,则必须复制并传递整个结构。相比之下,将类作为参数传递是一种轻量级操作,因为它只是传递一个简单的引用。