结构与继承:
一个结构声明可以指定实现的接口列表,但是不能指定基类。
由于结构不支持类与结构的继承,所以结构成员的声明可访问性不能是protected或protected internal。
结构中的函数成员不能是 abstract或 virtual,因而 override修饰符只适用于重写从System.ValueType继承的方法。
为在设计编程语言时将结构设计成无继承性?
其实类的继承是有相当的成本的 ——由于继承性,每个类需要用额外的数据空间来存储“继承图”来表示类的传承历史,
通俗地说来就是我们人类的家族家谱,里面存储着我们的祖宗十八代,只有这样我们才知道我们从哪里来的,而家谱肯定是需要额外的空间来存放的。
大家不要觉得这个存放“继承图”的空间很小,如果我们的程序需要用10000个点(Point)来存放游戏中的人物形体数据的话,
在一个场景中又有N个人,这个内存开销可不是小数目了。所以我们可以通过将点(Point)申明成 Struct而不是class来节约内存空间。
interface ITest
{
void Fun(int x,int y);
}
struct A:ITest
{
public void Fun(int x,int y) //隐式实现接口里的方法
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
class Program
{
static void Main(string[] args)
{
A a; //结构的实例化可以不使用new
a.Fun(1, 2);
Console.Read();
}
}
// 结果为:x=1,y=2
什么情况下结构的实例化可以不使用new? 当结构中没有参数时,结构的实例化可以不使用new; 当结构中有参数时,必须对结构中所有参数进行初始化后,才能不使用new对结构进行实例化。
什么时候使用结构? 结构体适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主; 例如:struct类型适于表示Point、Rectangle和Color等轻量对象。 尽管可以将一个点表示为类,但在某些情况下,使用结构更有效。 如果声明一个10000个Point对象组成的数组,为了引用每个对象,则需分配更多内存;这种情况下,使用结构可以节约资源。 定义的时候不会用到面向对象的一些特性; 结构体在不发生装箱拆箱的情况下性能比类类型是高很多的.
|