C# 中的结构类型(struct type)
ylbtech- .NET-Basic:C# 中的结构类型(struct type) |
C# 中的结构类型(struct type)
1.A,相关概念返回顶部 |
public struct Book { public decimal price; public string title; public string author; }
结构对于具有值语义的小型的数据结构特别有用。复数、坐标系中的点或字典中的“键-值”对都是结构类型的典型示例。对小型数据结构而言,使用结构而不是用类会大大节省应用程序分配的量。例如,下面的程序创建并初始化一个含有 100 个点的数组。对于作为类实现的 Piont,出现了 101 个实例对象,其中,数组需要一个,它的 100 个元素每一个都需要一个,具体情况看下例:
//使用类进行“键-值”对的应用 using System; namespace Test { class Piont { public int x, y; public Piont(int x, int y) { this.x = x; this.y = y; } } class PiontClass { static void Main() { Piont[] pionts = new Piont[100]; for (int i = 0; i < 100; i++) pionts[i] = new Piont(i, i); } } }
一种替代办法是将 Piont 定义为结构。
struct Piont { public int x, y; public Piont(int x, int y) { this.x = x; this.y = y; } }
替换后,示例如下:
//使用 struct 后的示例 using System; namespace Test { struct Piont { public int x, y; public Piont(int x, int y) { this.x = x; this.y = y; } } class PiontClass { static void Main() { Piont[] pionts = new Piont[100]; for (int i = 0; i < 100; i++) pionts[i] = new Piont(i, i); } } }
现在,只有一个对象被实例化(即用于数组的那个对象),而 Piont 实例以值的形式直接内联存储在数组中。
结构构造函数也是使用 new 运算调用,但是这并不意味着会分配内存。与动态分配对象并返回对它的引用不同,结构构造函数直接返回构造值本身(通常是堆栈上的一个临时位置),然后根据需要复制该结构值。
对于类,两个变量可能引用同一对象,因此对一个变量进行操作可能影响另一个变量所引用的对象。对于结构,每个变量都有自己的数据副本,对一个变量操作不可能影响另一个变量。下面的代码段产生的输出取决于 Piont 是类还是构造。
Piont a = new Piont(10,10);
Piont b= a;
a.x = 20;
Console.WriteLine(b.x);
如果 Piont 是类,将输出是 20,因为 a 和 b 引用同一对象。如果 Piont 是结构,输出将是 10,因为将 a 对 b 的赋值创建了该值的一个副本,因此接下来对 a.x 的赋值不会影响 b 这一副本。
前一示例突出了结构的两个限制。首先,赋值整个结构常数不如复制对象引用的效率高,因此结构类型的赋值和值参数传递可能比引用类型的开销更大。其次,除了 ref 和 out 参数,不可能创建对结构的引用,这样限制了结构的应用范围。
结构还可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型,但如果同时需要上述几种成员,则应当考虑改为使用类作为类型。
结构可是实现接口,但它们无法继承另一个结构。因此,结构成员无法声明为 protected。
作者:ylbtech 出处:http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |