国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#基礎語法:結構和類區別詳解

2020-01-24 01:41:41
字體:
來源:轉載
供稿:網友

結構和類很相似,也可以包含數據成員和函數成員,但是與類不同,結構是一種值類型,(我們可以理解為一種特殊的值類型所以不存在繼承的問題)為其分配數據不需要從托管堆中分配存儲器。結構類型的變量直接包含了該結構的數據,而類類型的變量所包含的只是對相應對象的一個引用。

 下面總結一下結構和類的不同:

1.結構是值類型,對結構類型的變量賦值將創建所賦值的一個副本。
2.結構實例的默認值不是null,而是具有默認值的初始值。
3.在結構和類中this的意義不一樣。
4.結構不支持繼承(所以結構成員的聲明可訪問性不能是protected,protected internal,結構中的函數成員不能是abstract 或者virtual,所以在結構中override修飾符只適用于重寫從System.ValueType繼承的方法)但是可以實現接口。
5.在結構中實例字段聲明中不能含有變量的初始值設定項
6.在結構中不能聲明無參數的實例構造函數。
7.在結構中不能聲明析構函數。

測試區別特性代碼:
 

using System;namespace StructAndClass{  struct SPoint  {    public int x, y;    public SPoint(int x, int y)    {      this.x = x;      this.y = y;    }  }  class CPoint    {      public int x, y;      public CPoint(int x, int y)      {        this.x = x;        this.y = y;      }    }  class Test  {    public static void Main()    {      SPoint sp1 = new SPoint(2, 5);      Console.WriteLine("結構/sp1初始值:");      Console.WriteLine("sp1.x={0}", sp1.x);      SPoint sp2 = sp1;      Console.WriteLine("sp1=sp2后:");      Console.WriteLine("sp1.x={0}");      Console.WriteLine("sp1.x={0}", sp1.x);      Console.WriteLine("sp2.x={0}", sp2.x);      sp1.x = 5;      Console.WriteLine("再次改變sp1的值后:");      Console.WriteLine("sp1.x={0}", sp1.x);      Console.WriteLine("sp2.x={0}", sp2.x);      Console.WriteLine("============================");      CPoint cp1 = new CPoint(2,5);      Console.WriteLine("類/cp1初始值:");      Console.WriteLine("cp1.x={0}", cp1.x);      CPoint cp2 = cp1;      Console.WriteLine("cp1=cp2后:");      Console.WriteLine("cp1.x={0}", cp1.x);      Console.WriteLine("cp2.x={0}", cp2.x);      cp1.x = 5;      Console.WriteLine("再次改變cp1的值后:");      Console.WriteLine("cp1.x={0}", cp1.x);      Console.WriteLine("cp2.x={0}", cp2.x);      Console.ReadKey();    }  }}


對于結構,即使沒有new運算符聲明的結構變量也是有效的,結構雖然不能聲明無參數的實力構造函數,但是它其實隱式的包含了一個無參數的構造函數:而且在結構的所有字段沒有明確賦值之前,不能調用結構的實例函數成員。在結構的構造函數中應該給所有的字段賦值。例如:
 

struct DC  {    public int x, y;    public int X    {      set      {        x = value;      }      get      {        return x;      }    }    public int Y    {      set      {        y = value;      }      get      {        return y;      }    }    public DC(int x,int y)    {      this.x = x;      this.y = y;    }  }  struct RDC  {    public int x, y;    public int X    {      set      {        x = value;      }      get      {        return x;      }    }    public int Y    {      set      {        y = value;      }      get      {        return y;      }    }    public RDC(int x, int y)    {      this.x = x;      this.y = y;    }  }  class Test  {    public static void Main()    {      DC dc=new DC();      dc.x = 3;      dc.y = 5;      Console.WriteLine("已經對x,y初始化后:");      Console.WriteLine("此時可以訪問和修改dc.X={0}的值",dc.X);      Console.WriteLine("我在這里創建了一個DC的復制結構RDC/n并且不對x,y初始化就會報錯");      RDC rdc;       rdc.y = 5;//可以編譯通過       rdc.X = 3;//這里就會出錯,不能編譯通過      Console.WriteLine("=======test over================");     }  } 

在結構的實例構造函數內,this 相當于一個結構類型的 out 參數,(必須在內部對它明確賦值)而在結構的實例函數成員內,this 相當于一個結構類型的 ref 參數。在這兩種情況下,this 本身相當于一個變量,因而有可能對該函數成員調用所涉及的整個結構進行修改(如對 this 賦值,或者將 this 作為 ref 或 out 參數傳遞)。例如:(引用上面的例子)

 

struct DC  {    public int x, y;    public int X    {      set      {        x = value;      }      get      {        return x;      }    }    public int Y    {      set      {        y = value;      }      get      {        return y;      }    }    public DC(int x,int y)    {      X= x;//這里就是錯的      Y = y;//會提示沒有給this對象的所有字段賦值    }  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 唐海县| 葵青区| 宝清县| 临清市| 台南市| 永城市| 佛教| 甘谷县| 隆德县| 柘城县| 垫江县| 遵义市| 乌拉特中旗| 龙山县| 城口县| 武穴市| 清新县| 射洪县| 肇州县| 台北市| 化州市| 东阿县| 汉沽区| 巧家县| 辉县市| 阿图什市| 清原| 肃南| 萍乡市| 申扎县| 乐平市| SHOW| 尼木县| 五寨县| 黔西| 镇安县| 驻马店市| 泸水县| 高邑县| 商水县| 塔城市|