Windows Phone 7手机开发.NET培训期待与您交流!
C#中的结构除了包含数据成员外,还有构造函数、方法、属性、事件、索引等成员,结构也可以实现多个接口。结构与类类似,但也有很大的区别。首先,结构是值类型,而类是引用类型。
值类型的结构示例。
using System;
//
定义结构
MyStruct
struct MyStruct
{
//
定义字段
x,y
public int x;
public int y;
//
定义构造函数
public MyStruct(int i, int j)
{
x = i;
y = j;
}
//
定义方法
public void Sum()
{
int sum = x + y;
Console.WriteLine("The sum is {0}",sum);
}
}
class Class1
{
static void Main()
{
MyStruct s1 = new MyStruct(1,2);
MyStruct s2 = s1;
s1.x = 2;
s1.Sum(); // The sum is 4
s2.Sum(); // The sum is 3
}
}
程序中的
s2
获得了
s1
的一份数据副本,虽然
s1.x
值改变了,但并没有影响到
s2
。
当两个类的实例相等时,则表示它们指向同一段内存地址,试图改变一个必然
要影响到另一个。
结构实例化时也可以不用
new
关键字,如在
Main()
加入:
MyStruct s3 = new MyStruct();
s3.Sum();
虽然结构中没有默认的无参构造函数,但是却可以调用无参构造函数,并且将
值类型的数据成员设置为对应值类型的默认值,将其引用类型的数据成员设置
为
null
。所以
s3.x
和
s3.y
都为
0
,
s3
最终的和也为
0
。
结
构
|
类
|
值类型
|
引用类型
|
可以不使用
new
实例化
|
必须使用
new
实例化
|
没有默认的构造函数,但可以添加构造
函数
|
有默认的构造函数
|
没有析构函数
|
有析构函数
|
没有
abstract
、
protected
和
sealed
修饰符
|
可以使用
abstract
、
protected
和
sealed
修饰符
|
结构使用的成员一般是数值,如点、矩形和颜色等的轻量对象。值类型在堆栈上分配地址,引用类型在堆上分配地址。堆栈的执行效率要比堆的执行效率高,因此结构的效率高于类。
原因在于,堆用完以后由.NET的垃圾收集器自动回收,程序中大量使用堆,将导致程序性能的下降。