时间:2021-05-19
翻译自 Manju lata Yadav 2019年6月2日 的博文 《Difference Between Struct And Class In C#》,补充了一些内容和示例。
结构体(struct)是类(class)的轻量级版本。结构体是值类型,可用于创建行为类似于内置类型的对象。
比较
结构体和类共享许多特性,但与类相比有以下局限性。
什么时候使用结构体或类?
要回答这个问题,我们应该很好地理解它们的差异。
序号 结构体(struct) 类(class) 1 结构体是值类型,可以在栈(stack)上分配,也可以在包含类型中内联分配。 类是引用类型,在堆(heap)上分配并垃圾回收。 2 值类型的分配和释放通常比引用类型的分配和释放更节约成本。 大的引用类型的赋值比大的值类型的赋值成本更低。 3 在结构体中,每个变量都包含自己的数据副本(ref和out参数变量除外),对一个变量的操作不会影响另一个变量。 在类中,两个变量可以包含同一对象的引用,对一个变量的任何操作都会影响另一个变量。
这样,结构体(struct)只能在确定以下情形时使用:
在所有其他情形,应该将类型定义为类(class)。
结构体示例:
struct Location{ public int x, y; public Location(int x, int y) { this.x = x; this.y = y; }}static void Main(){ Location a = new Location(20, 20); Location b = a; a.x = 100; Console.WriteLine(b.x);}输出将是 20。“b” 的值是 “a” 的副本,因此 “b” 不受 “a.x” 更改的影响。但是在类中,输出将是 100,因为变量 “a” 和 “b” 引用同一个对象。
以下为译者补充
结构体实例与类实例
结构体实例的内存在栈(stack)上进行分配,所占用的内存随声明它的类型或方法一起回收。 这就是在赋值时要复制结构体的一个原因。 相比之下,类实例的内存在堆(heap)上进行分配,当对类实例的所有引用都超出范围时,为该类实例分配的内存将由公共语言运行时自动回收(垃圾回收)。
结构体实例的值相等性
两个结构体实例的比较是基于值的比较,而类实例的比较则是对其引用的比较。
若要确定两个结构体实例中的实例字段是否具有相同的值,可使用 ValueType.Equals 方法。 由于所有结构都隐式继承自 System.ValueType,因此可以直接在其对象上调用该方法,如以下示例所示:
public struct Person{ public string Name; public int Age; public Person(string name, int age) { Name = name; Age = age; }}static void Main(){ Person p1 = new Person("技术译站", 100); Person p2; p2.Name = "技术译站"; p2.Age = 100; if (p2.Equals(p1)) Console.WriteLine("p2 和 p1 有相同的值。"); Console.ReadKey();}// 输出: p2 和 p1 有相同的值。System.ValueType 是值类型的隐式基类, 它的 Equals 使用反射实现,因为它必须能够确定任何结构体中有哪些字段。 在创建自己的结构体时,重写 Equals 方法可以提供特定于你的类型的高效求等算法。
“基于值的相等”这一点和 C# 9.0 中新增的记录(record) 类型具有相似之处
作者 : Manju lata Yadav
译者 : 技术译民
出品 : 技术译站
链接 : 英文原文
以上就是区分C# 中的 Struct 和 Class的详细内容,更多关于C# 中 Struct 和 Class的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的。简单来说,struct是值类型,创建一个struct类型的实例被
这里有两种情况下的区别。(1)C的struct与C++的class的区别。(2)C++中的struct和class的区别。在第一种情况下,struct与clas
C++中保留了C语言的struct关键字,并且加以扩充。在C语言中,struct只能包含成员变量,不能包含成员函数。而在C++中,struct类似于class,
Struct和Class的区别今天这篇博文主要讲解在C++中关键字struct和class的区别。这篇博文,将会系统的将这两个关键字的不同面进行详细的讲解。从语
struct和C语言的很相似,模拟出class的功能,但是不完全的!没有构造函数等!struct的申明复制代码代码如下:packagemainimport"fm