概念上(和松散地),是一个类似于(vb)常量的结构体
本文关键字:类似于 一个 vb 常量 结构体 概念上 | 更新日期: 2023-09-27 18:18:15
我有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写的很棒的博客。
现在,处理你的constants
和variables
的比较(虽然你没有直接比较它们,我要)。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通常不必参与(因为值类型可以放在堆栈上),但如果您将结构体作为参数按值传递,则必须复制并传递整个结构体。相比之下,将类作为参数传递是一种轻量级操作,因为它只是传递一个简单的引用。