Struct 从C 的时代就已经有了(向丹尼斯.里奇致敬), 它是Structure 的缩写 -- 就是结构的意思. 它是一种最初级的数据结构, 它包含一到多个相同类型或不同类型的值或者变量. 它就像是一个存储数据的"包".
Class(类) 是有了面向对象概念之后才有的, 它"是创建对象的蓝图,描述了所创建的对象共同的属性和方法".
从它们被创立的用途可以看出Class 比Struct 负担了更大的使命.
类从出生的那天就被赋予了一个伟大的使命: 模拟真实世界的行为, 拥有继承和多态两种利器.
Struct 到了C#这个领域中有了一个进化, 它甚至可以实现接口(当然,这个也是C时代没有的东西), 在本文中会有一个简单的介绍.
值类型 VS 引用类型
在.net 世界中, System.Object "支持 .NET Framework 类层次结构中的所有类,并为派生类提供低级别服务。 这是 .NET Framework 中所有类的最终基类;它是类型层次结构的根。" 从Object再衍生出所有类、结构、枚举和委托。
看看下面这个图对net中两大类型的描述, -- 当然还有一种"指针类型",在这里我们不予讨论.
Struct 是属于值类型这个阵容, 而所有class 都是引用类型.
这意味着什么?
当我们使用等号"赋值"时, 对于Struct而言就是将同样的值复制给另一个变量; 而对于Class而言就只是将它们的名字指向同一个对象.
看下面的实例:
class FooClass { public int FooValue; } struct FooStruct { public int FooValue; } class Program { static void Main(string[] args) { FooClass classObj = new FooClass(); classObj.FooValue = 0; FooClass classObj2 = classObj; classObj2.FooValue = 1; FooStruct structObj = new FooStruct(); structObj.FooValue = 0; FooStruct structObj2 = structObj; structObj2.FooValue = 1; } }
再最后设个断点, 运行后取值:
structObj2 在初始时,
会创建一个全新的副本, 然后获取structObj 的所有数值;
classObj2 在初始时, 只是指向了classObj. 这就是值类型和引用类型的一个区别. 当修改classObj 或者 classObj2 时, 修改的是同一部分内存.
Struct实现接口
前面提到了Struct可以实现接口, 下面我们引用一个实例:
interface IPromotion { void promote(); } struct Employee : IPromotion { public string Name; public int JobGrade; public void promote() { JobGrade++; } public Employee(string name, int jobGrade) { this.Name = name; this.JobGrade = jobGrade; } public override string ToString() { return string.Format("{0} ({1})", Name, JobGrade); } } class Program { static void Main(string[] args) { Employee employee = new Employee("Cool Guy", 65); IPromotion p = employee; Console.WriteLine(employee); p.promote(); Console.WriteLine(employee); } }
一旦增加了这个功能, 我们就可以在应用Struct之前, 给予其一些接口的定义. 使一类的struct 在形式上保持一致.