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>)时,请务必记住这一点。

     

  •  

     

      那么我们声明什么时候使用类,什么时候使用结构呢?

      一般来说,值类型的适合于数据存储,而引用类型的更加适合于定义应用程序的行为。如果你有很多的数据,但是结构并不复杂,永远不可能有子类,那么结构是一个不错的选择。

     

     

    posted @ 2011-03-12 23:25  王海龙(Heaven)  阅读(370)  评论(0编辑  收藏  举报