Struct vs Class:
相同点:
1) 它们都是创建对象的模板,用以抽象某类具有统统特征的对象;他们都包含数据和方法;
2) 它们在使用上没有太大的区别,除了关键字class和struct不同;
不同点:
1) Struct是值类型,它在内存中的存储方式是存储于堆(heap)上
2) Class是引用类型,它在内存中的存储方式是存储于栈(stack)上
使用实例:
//如下语句定义一个struct,struct是封闭的,所以它不能作为其他结构或者类的基,同时,它也不能基于其他类或者结构
public struct StudentS {
public int age;
public string name;
//重要:struct不能含有默认构造函数,如下语句报错
public StudentS() {}
//但是可以定义含有参数的构造函数
public StudentS(int age, string name) {
this.age = age;
this.name = name; }}
//如下语句定义一个class
public class StudentC {
public int age;
public string name; }
public class ClassMain {
public static void Main () {
//如下语句声明这个struct:
StudentS xiaoMing;
//给age赋值,因为struct类型(值类型),所以一旦被声明,就被分配了内存
xiaoMing.age = 20;
//但是,如果不初始化就使用对象的值,则会报错:use of unassigned field
Console.WriteLine(xiaoMing.name);
//应该赋值:
xiaoMing.name = "XiaoMing";
Console.WriteLine(xiaoMing.name);
//或者使用new显式初始化:
xiaoMing = new StudentS();
Console.WriteLine(xiaoMing.name);
//如下语句声明这个class:
StudentC xiaoFang;
//如下语句初始化这个class
//重要!对于class来说,一定要使用new来进行显式的初始化,如不显式初始化则会报错
xiaoFang = new StudentC();
xiaoFang.age = 20;
}
}
Class vs abstract Class:
相同点:
1) 都可以含有成员变量
2) 成员函数都允许有函数体
3) 都不能多重继承或被多重继承
不同点:
1) class能被实例化,abstract class不能被实例化
2) class不能含有抽象方法,abstract能
abstract Class vs Interface:
相同点:
1) 都不能被初始化;
2) 都支持抽象方法;
不同点:
1) abstract class的成员函数允许有函数体,interface不能
2) abstract class允许有成员变量,interface不能(interface只能含有事件,委托,函数,属性,索引器);
3) abstract class的方法允许含有可见性修饰符,interface不能(默认为public)
4) abstract class不能被多重继承,interface可以被多重继承(实现)
5) abstract class 可以拥有构造函数/静态构造函数,interface不可以