C#关键字 - class和struct
2010-06-25 17:38
190 查看
class 用来声明类,struct用来声明结构
类 class:
类是面向对象变成的基本概念,是一种自定义数据的结构类型,通常包括:字段、属性、方法、构造函数、索引器、操作符等等。
类是引用类型,可以继承和被继承,所有的类都继承自System.Object类。
类通过new 来创建对象的实例,这个过程叫做实例化。在new一个类的实例的时候,对象保存了该实例的实际数据的引用地址,而对象的值保存在托管堆中(managed heap)
声明:
public class MyClass{}
实例化:
MyClass aclass=new MyClass();
非静态类:通过创建赋给变量的“对象”或“实例”来使用类。
静态类:静态类用sealed来修饰,静态类不能被实例化,只能通过类来访问。
结构 struct:
结构是一种值类型,结构将一组相关的信息变量组织变为一个单一的变量实体。
结构继承自System.ValueType类,是值类型. struct实例分配在线程的堆栈(stack)上,它本身存储了值,但是不包括指向该值的指针。在使用strcut时,我们可以把他当作int, char这样的基本类型来对待。
strcut的声明和class相同
声明:
public struct MyStruct{}
实例化:
MyStruct astruct=new MyStruct();
结构也可以不用new 来进行实例化:
MyStruct asruct;
但是如果不用new来实例化结构,其所有的字段将会处于未分配状态,只有对字段进行初始化,才能引用,否则,引用未赋值的字段会导致编译错误。如下,此时showMsg()的调用将会出错,只有将i和j都初始化才能对它进行引用,或者用new来实例化。
类和结构的异同点:
相同点:语法类似
不同点:
class是引用类型,继承自System.Object类;struct是值类型,继承自System.ValueType类。
从职能观点来说,class表现为行为;而struct常用于存储数据
class支持类和接口的继承;struct不能从类继承,也不能做类的基类,但是由于strcut是值类型,它支持接口继承
class可以声明无参构造函数,可以声明析构函数;struct只能声明带参数的构造函数,而且不能声明析构函数。
class必须用new来进行实例化;struct可以不用new来实例化
class可以是抽象类,可以声明抽象函数;struct不能为抽象的,不能声明抽象函数
class可以声明protected、virtual、sealed和override成员;struct不可以,但是struct可以重载system.object的三个虚方法:Equals()、ToString()个GetHashTable().
class实例由垃圾回收机制来保证内存的回收处理;struct的变量在使用完以后立即自动解除内存分配。
class的内存分配与托管堆;struct的内存分配与线程的堆栈上。
结构可以作为null的类型,因而可以向其赋null值。
结构在赋值时进行复制。将结构赋值给新的变量时,将复制所有数据,并对新的副本所做的修改不会影响原始副本的数据。
在结构声明中,除非字段被声明为 const 或 static,否则无法初始化???(from MSDN)。
类 class:
类是面向对象变成的基本概念,是一种自定义数据的结构类型,通常包括:字段、属性、方法、构造函数、索引器、操作符等等。
类是引用类型,可以继承和被继承,所有的类都继承自System.Object类。
类通过new 来创建对象的实例,这个过程叫做实例化。在new一个类的实例的时候,对象保存了该实例的实际数据的引用地址,而对象的值保存在托管堆中(managed heap)
声明:
public class MyClass{}
实例化:
MyClass aclass=new MyClass();
非静态类:通过创建赋给变量的“对象”或“实例”来使用类。
静态类:静态类用sealed来修饰,静态类不能被实例化,只能通过类来访问。
结构 struct:
结构是一种值类型,结构将一组相关的信息变量组织变为一个单一的变量实体。
结构继承自System.ValueType类,是值类型. struct实例分配在线程的堆栈(stack)上,它本身存储了值,但是不包括指向该值的指针。在使用strcut时,我们可以把他当作int, char这样的基本类型来对待。
strcut的声明和class相同
声明:
public struct MyStruct{}
实例化:
MyStruct astruct=new MyStruct();
结构也可以不用new 来进行实例化:
MyStruct asruct;
但是如果不用new来实例化结构,其所有的字段将会处于未分配状态,只有对字段进行初始化,才能引用,否则,引用未赋值的字段会导致编译错误。如下,此时showMsg()的调用将会出错,只有将i和j都初始化才能对它进行引用,或者用new来实例化。
struct MyStruct { public int i; public string j; public void showMsg() { Console.WriteLine("aaaa"); } } public class TestStruct { public static void Main() { MyStruct astruct; //MyStruct astruct=new Mystruct(); //astruct.i = 1; //astruct.j = "a"; astruct.showMsg(); } }
类和结构的异同点:
相同点:语法类似
不同点:
class是引用类型,继承自System.Object类;struct是值类型,继承自System.ValueType类。
从职能观点来说,class表现为行为;而struct常用于存储数据
class支持类和接口的继承;struct不能从类继承,也不能做类的基类,但是由于strcut是值类型,它支持接口继承
class可以声明无参构造函数,可以声明析构函数;struct只能声明带参数的构造函数,而且不能声明析构函数。
class必须用new来进行实例化;struct可以不用new来实例化
class可以是抽象类,可以声明抽象函数;struct不能为抽象的,不能声明抽象函数
class可以声明protected、virtual、sealed和override成员;struct不可以,但是struct可以重载system.object的三个虚方法:Equals()、ToString()个GetHashTable().
class实例由垃圾回收机制来保证内存的回收处理;struct的变量在使用完以后立即自动解除内存分配。
class的内存分配与托管堆;struct的内存分配与线程的堆栈上。
结构可以作为null的类型,因而可以向其赋null值。
结构在赋值时进行复制。将结构赋值给新的变量时,将复制所有数据,并对新的副本所做的修改不会影响原始副本的数据。
在结构声明中,除非字段被声明为 const 或 static,否则无法初始化???(from MSDN)。
相关文章推荐
- struct关键字和class关键字
- C# struct 与class 使用 new 关键字的区别
- class struct关键字区别
- C++中struct和class关键字的区别
- C/C++struct与C++struct/class关键字详解
- 练习使用ref, out关键字来传递class, struct, int, double的数据
- 关键字-分节15(struct 与class 的区别)
- struct与class关键字在定义类中的区别
- C++中struct和class关键字的三个区别
- C++中关键字Struct和Class的区别
- 关键字struct与class区别
- 关键字class与struct
- struct 和class关键字
- C++中使用class和struct关键字的不同
- 【C++模板】C++声明模板时能否用struct关键字代替class或者typename
- C++中声明类的class与声明结构体的struct关键字详解
- struct与class关键字在定义类中的区别
- 使用class或struct关键字定义类
- 无法解析的外部符号 "public: virtual struct CRuntimeClass
- Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别