程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 不可不知的C#基礎–從 struct 和 class的異同 說開去

不可不知的C#基礎–從 struct 和 class的異同 說開去

編輯:C#入門知識

 

我知道很多人都討論過這個問題, 多我一個不多, 少我一個不少.

最近有人又問到這個問題, 所以想再說說. 萬丈高樓平地起, 地基很重要. 懂了的人不要嫌羅嗦, 歡迎補充或者糾正.

從起源/定義說起

Struct 從C 的時代就已經有了(向丹尼斯.裡奇致敬), 它是Structure 的縮寫-- 就是結構的意思. 它是一種最初級的數據結構, 它包含一到多個相同類型或不同類型的值或者變量. 它就像是一個存儲數據的"包".

 

Class(類) 是有了面向對象概念之後才有的, 它"是創建對象的藍圖,描述了所創建的對象共同的屬性和方法".

 

從它們被創立的用途可以看出Class 比Struct 負擔了更大的使命.

類從出生的那天就被賦予了一個偉大的使命: 模擬真實世界的行為, 擁有繼承和多態兩種利器.

Struct 到了C#這個領域中有了一個進化, 它甚至可以實現接口(當然,這個也是C時代沒有的東西), 在本文中會有一個簡單的介紹.

 

值類型VS 引用類型

在.net 世界中, System.Object "支持.NET Framework 類層次結構中的所有類,並為派生類提供低級別服務。 這是.NET Framework 中所有類的最終基類;它是類型層次結構的根。" 從Object再衍生出所有類、結構、枚舉和委托。

看看下面這個圖對net中兩大類型的描述, -- 當然還有一種"指針類型",在這裡我們不予討論.

 

chappell5fig01

 

Struct 是屬於值類型這個陣容, 而所有class 都是引用類型.

這意味著什麼?

 

當我們使用等號"賦值"時, 對於Struct而言就是將同樣的值復制給另一個變量; 而對於Class而言就只是將它們的名字指向同一個對象.

 

看下面的實例:

class FooClass

{

    public int FooValue;

}

struct FooStruct

{

    public int FooValue;

}

 

 

class Program

{

 

    static void Main(string[] args)

    {

        FooClass classObj = new FooClass();

 

        classObj.FooValue = 0;

 

        FooClass classObj2 = classObj;

 

        classObj2.FooValue = 1;

 

        FooStruct structObj = new FooStruct();

 

        structObj.FooValue = 0;

 

        FooStruct structObj2 = structObj;

       

        structObj2.FooValue = 1;

 

    }

 

}

再最後設個斷點, 運行後取值:

ScreenShot047

 

structObj2 在初始時, 會創建一個全新的副本, 然後獲取structObj 的所有數值;

classObj2 在初始時, 只是指向了classObj. 這就是值類型和引用類型的一個區別. 當修改classObj 或者classObj2 時, 修改的是同一部分內存.

Struct實現接口

前面提到了Struct可以實現接口, 下面我們引用一個實例:

interface IPromotion

{

 

    void promote();

 

}

 

struct Employee : IPromotion

{

 

    public string Name;

 

    public int JobGrade;

 

    public void promote()

    {

 

        JobGrade++;

 

    }

 

    public Employee(string name, int jobGrade)

    {

 

        this.Name = name;

 

        this.JobGrade = jobGrade;

 

    }

 

    public override string ToString()

    {

 

        return string.Format("{0} ({1})", Name, JobGrade);

 

    }

 

}

 

class Program

{

 

    static void Main(string[] args)

    {

 

        Employee employee = new Employee("Cool Guy", 65);

 

        IPromotion p = employee;

 

        Console.WriteLine(employee);

 

        p.promote();

 

        Console.WriteLine(employee);

 

    }

 

}

一旦增加了這個功能, 我們就可以在應用Struct之前, 給予其一些接口的定義. 使一類的struct 在形式上保持一致.

 

不同的用途

使用中在struct 和class 兩者間該選誰?

我們在編程中要實現某種數據結構時, 絕大部分情況下我們會選擇class -- 因為它的強大和特定的使命. 但是當我們要傳遞或存儲一些小數據結構時,可以考慮struct.

Net framework 下有很多已經定義好了的struct例如:

System.Drawing.Rectangle

System.Drawing.Color

System.Drawing.Point

使用時要記住struct的特性.

 

本文來自於喜樂的ASP.NET(Alex Song) 轉貼請注明出處

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