Class AND Struct (1)
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来实例化。
view plaincopy to clipboardprint?
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();
}
}
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可以是抽象类,可以声明抽象函数;struct不能为抽象的,不能声明抽象函数
class可以声明protected、virtual、sealed和override成员;struct不可以,但是struct可以重载system.object的三个虚方法:Equals()、ToString()个GetHashTable().
class实例由垃圾回收机制来保证内存的回收处理;struct的变量在使用完以后立即自动解除内存分配。
class的内存分配与托管堆;struct的内存分配与线程的堆栈上。
在结构声明中,除非字段被声明为 const 或 static,否则无法初始化 ---->From MSDN
通过实验发现,字段没用声明为 const或者static,但是照样可以初始化。
最后找到答案:这是一些老版本里面要的,现在新版本可以的,可以在常规结构里面初始化的.最后bs 下ms,更新下msdn,别误导我们啊!
结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
结构在赋值时进行复制。 将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。 在使用值类型的集合(如 Dictionary<string, myStruct>)时,请务必记住这一点。
结构是值类型,而类是引用类型。
与类不同,结构的实例化可以不使用 new 运算符。
结构可以声明带参数的构造函数。
一个结构不能从另一个结构或类继承,而且不能作为一个类的基。 所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
结构可以实现接口。
结构可用作可以为 null 的类型,因而可向其赋 null 值。
结构在赋值时进行复制。 将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。 在使用值类型的集合(如 Dictionary<string, myStruct>)时,请务必记住这一点。
那么我们声明什么时候使用类,什么时候使用结构呢?
一般来说,值类型的适合于数据存储,而引用类型的更加适合于定义应用程序的行为。如果你有很多的数据,但是结构并不复杂,永远不可能有子类,那么结构是一个不错的选择。