程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#基本語法:構造和類差別詳解

C#基本語法:構造和類差別詳解

編輯:C#入門知識

C#基本語法:構造和類差別詳解。本站提示廣大學習愛好者:(C#基本語法:構造和類差別詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#基本語法:構造和類差別詳解正文


構造和類很類似,也能夠包括數據成員和函數成員,然則與類分歧,構造是一種值類型,(我們可以懂得為一種特別的值類型所以不存在繼續的成績)為其分派數據不須要從托管堆平分配存儲器。構造類型的變量直接包括了該構造的數據,而類類型的變量所包括的只是對響應對象的一個援用。

 上面總結一下構造和類的分歧:

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對象的一切字段賦值
    }
  }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved