LiYingYi

专注于.NET

导航

浅谈C#中的结构

       结构与类很相似,都表示可以包含数据成员和函数成员的数据结构。但是,与类不同,结构是一种值类型,并且不需要堆分配。结构类型的变量直接包含结构的数据,而类类型的变量包含对数据的引用。

        结构对于具有值语义的小的数据结构特别有用。复数、坐标系中的点或字典中的“键-值”对都是结构的典型示例。这些数据结构的关键之处在于:它们只有少量数据成员,它们不要求使用继承或引用标识,而且它们适合使用值语义(赋值时直接复制值而不是复制它的引用)方便地实现。。

结构声明
结构声明是一种用于声明新结构的类型声明: 使用struct关键字

访问修辞符 struct 结构名
{
 数据成员
 成员函数
}

类和结构的区别
结构在以下几个重要方面和类是不同的:
• 结构是值类型,类是引用类型。
• 在结构中,实例字段声明中不能含有变量初始值设定项。
• 在结构中不能声明无参数的实例构造函数。
• 在结构中不能声明析构函数。
• 在结构中不存在继承。一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。结构可实现接口,而且实现方式与类实现接口的方式完全相同。

示例 1
本示例声明一个结构,它有5个成员:2个属性、1个方法和2个私有字段。本示例创建该结构的一个实例,并将其投入使用:
using System;
struct Point
{
     private int x,y;
     public int X
     {
          get 
          {
                   return x;
          }
          set 
          {
                   x=value;
          }
     }
     public int Y
     {
          get
          {
                   return y;
          }
          set
          {
                   y=value;
           }
     }
     public void DisplayPoint()
     {
          Console.WriteLine("The Point'x value is: {0}", x);
          Console.WriteLine("The Point'y value is: {0}",y);
     }
}

class TestClass
{
     public static void Main()
     {
          Point p = new Point();
          p.X = 5;
          p.Y=5;
          p.DisplayPoint();
     }
}
     以上new 运算符创建结构的实例,但结构是值类型,并没有在堆上为实例分内存空间.结构变量本身就存储了该实例的值.而不是实例的引用。new运算符只不过是调用了结构的构造函数。
示例 2
本示例展示当向方法传递结构时,将传递该结构的副本,而传递类实例时,将传递一个引用。
using System;
struct STPointX
{
     private int x;
     public int X
     {
          get 
          {
               return x;
          }
          set 
          {
               x=value;
          }
     }
}

class CLPointX
{
     private int x;
     public int X
     {
          get 
          {
               return x;
          }
          set 
          {
               x=value;
          }
     } 
}

class TestClass
{
     public static void structP(STPointX s)
     {
          s.X = 5;
     }
     public static void classP(CLPointX c)
     {
          c.X = 5;
     }

     public static void Main()
     {
          STPointX a = new STPointX() ;
          CLPointX b = new CLPointX();
          a.X = 1;
          b.X = 1;   
          structP(a);  //传递实例的副本
          classP(b);   //传递实例的引用
          Console.WriteLine("a.x = {0}", a.X);
          Console.WriteLine("b.x = {0}", b.X);
     }
}

posted on 2005-12-28 23:45  小飞侠  阅读(1712)  评论(2编辑  收藏  举报