引用类型与值类型

C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。
C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。
下面用一个实例来看一下引用类型和值类型的区别:

 

  class Program
{
static void Main(string[] args)
{
ClassDemo obj1
= new ClassDemo();
obj1.x
= 10;
ClassDemo obj2
= obj1;
obj1.x
= 20;
Console.WriteLine(obj2.x);

StructDemo o1
= new StructDemo();
o1.x
= 10;
StructDemo o2
= o1;
o1.x
= 20;
Console.WriteLine(o2.x);
Console.ReadKey();
}
}
class ClassDemo
{
public int x;
}

struct StructDemo
{
public int x;
}

类是引用类型,在把类对象赋予变量时,实际上是把带有一个指针的变量给了该对象。在实际代码中,指针是内存中的一个地址。在把第一个对象引用赋给类别为ClassDemo的第二个变量时,实际上是复制了这个地址。这样两个变量就包含同一个对象的指针。

结构式值类型,创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。对一个副本的更改不影响另一个副本。

因此输出结果是:20,10

 

在此说下类与结构的区别:

1.类是引用类型 (继承system.object),结构式值类型(system.valueType)

2.继承性
结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
3.内部结构:
结构:
没有默认的构造函数,但是可以添加构造函数  没有析构函数
没有 abstract 和 sealed(因为不能继承)
不能有protected 修饰符
可以不使用new 初始化 在结构中初始化实例字段是错误的
类:
有默认的构造函数 有析构函数
可以使用 abstract 和 sealed
有protected 修饰符 必须使用new 初始化


如何选择类还是结构:

1.在表现抽象和多级别的对象层次时,类是最好的选择
2.大多数情况下该类型只是一些数据时,结构时最佳的选择

posted @ 2011-09-08 10:57  寶貝尐膤  阅读(189)  评论(0编辑  收藏  举报