从网上查看了很多相关的总结,现个人总结如下:
| Class | Struct |
本质 | 继承与System.Object,是引用类型。 其实例分配在堆上。 其实例可以设为Null。 作为参数时,按址方式传递。 可以声明析构函数,因为其实例由垃圾回收机制来确保内存回收。 | 继承自System.ValueType,是值类型。 其实例分配在栈上。(性能优势) 其实例不可以设为Null。 作为参数时,按值方式传递。 不可以声明析构函数,因为使用完后立即自动解除内存分配。 |
构造函数 | 可以显示声明无参数的构造函数。 不需要在构造函数中初始化全部字段。 | 不可以显示声明无参数的构造函数,只能声明有参数的构造函数。默认无参构造器只是简单地把所有的值初始它的的0等价值。 构造函数必须初始化所有字段。 |
成员 | 可以对成员进行初始化。 | 不可以对成员进行初始化。 |
实例化 | 使用new关键字。 | 可以不使用new关键字。对于struct如果是实例无参的时就可以无new了;但如果是有参的构造函数生成时,就要用new了。如果不以new来实例化struct,则其所有的字段将处于未分配状态,直到所有字段完成初始化,否则引用未赋值的字段会导致编译错误。 |
继承 | 可以继承类和接口。(扩展优势) | 不能从类继承,也不能作为类的基类,但是可以继承接口。 |
抽象 | 可以是抽象类,并可声明抽象函数。 | 不支持抽象。 |
重载 | 可以声明protected成员、virtual成员、sealed成员和override成员。 | 只可以重载System.Object的3个虚方法,Equals()、ToString()、GetHashTable()。 |
职能 | 是行为的封装,用来表述对象。 | 是数据的封装,用于存储数据。 |
1 struct fenshu 2 { 3 //'ConsoleApplication1.fenshu.fenzi': cannot have instance field initializers in structs 4 //public int fenzi = 1; 5 6 public int fenzi; 7 public int fenmu; 8 9 //Structs cannot contain explicit parameterless constructors 10 //fenshu() 11 //{ } 12 13 //Field 'ConsoleApplication1.fenshu.fenzi' must be fully assigned before control is returned to the caller 14 //fenshu(int fm) 15 //{ 16 // fenmu = fm; 17 //} 18 19 //need to mark the constructor as public (or internal). 20 internal fenshu(int fm) 21 { 22 fenzi = 0; 23 fenmu = fm; 24 } 25 } 26 27 class Program 28 { 29 static void Main(string[] args) 30 { 31 fenshu fs = new fenshu(); 32 fs.fenzi = 2; 33 fs.fenmu = 3; 34 Console.WriteLine("{0}/{1}", fs.fenzi, fs.fenmu); 35 36 fenshu f; 37 f.fenzi = 1; 38 f.fenmu = 2; 39 Console.WriteLine("{0}/{1}", f.fenzi, f.fenmu); 40 41 fenshu s = new fenshu(2); 42 Console.WriteLine("{0}/{1}", s.fenzi, s.fenmu); 43 } 44 }
Reference:
http://www.cnblogs.com/waitrabbit/archive/2008/05/18/1202064.html
http://witmax.cn/csharp-class-vs-struct.html
http://blog.sina.com.cn/s/blog_4a7b40d70101gl65.html
Addition: