1. 程式人生 > 資訊 >微軟 Xbox:正評估與動視暴雪關係,因後者職場醜聞指控

微軟 Xbox:正評估與動視暴雪關係,因後者職場醜聞指控

結構體是值型別資料結構。它使得一個單一變數可以儲存各種資料型別的相關資料。struct 關鍵字用於建立結構體。

結構體是用來代表一個記錄。


struct Books
{
public string title;
public string author;
};

public class testStructure
{
public static void Main(string[] args)
{

Books Book1; /* 宣告 Book1,型別為 Books */

/* book 1 詳述 */
Book1.title = "C Programming";
Book1.author = "Nuha Ali";

/* 列印 Book1 資訊 */
Console.WriteLine( "Book 1 title : {0}", Book1.title);
Console.WriteLine("Book 1 author : {0}", Book1.author);

Console.ReadKey();

}
}

執行後的結果為

Book 1 title : C Programming
Book 1 author : Nuha Ali
類與結構的選擇

首先明確,類的物件是儲存在堆空間中,結構儲存在棧中。堆空間大,但訪問速度較慢,棧空間小,訪問速度相對更快。故而,當我們描述一個輕量級物件的時候,結構可提高效率,成本更低。當然,這也得從需求出發,假如我們在傳值的時候希望傳遞的是物件的引用地址而不是物件的拷貝,就應該使用類了。

C# 結構的特點
您已經用了一個簡單的名為 Books 的結構。在 C# 中的結構與傳統的 C 或 C++ 中的結構不同。C# 中的結構有以下特點:

結構可帶有方法、欄位、索引、屬性、運算子方法和事件。
結構可定義建構函式,但不能定義解構函式。但是,您不能為結構定義無參建構函式。無參建構函式(預設)是自動定義的,且不能被改變。
與類不同,結構不能繼承其他的結構或類。
結構不能作為其他結構或類的基礎結構。
結構可實現一個或多個介面。
結構成員不能指定為 abstract、virtual 或 protected。
當您使用 New 操作符建立一個結構物件時,會呼叫適當的建構函式來建立結構。與類不同,結構可以不使用 New 操作符即可被例項化。
如果不使用 New 操作符,只有在所有的欄位都被初始化之後,欄位才被賦值,物件才被使用。
介面、繼承、多型、重寫、虛方法、抽象方法&抽象類、密封類

介面 interface
接口裡面規定了一些規則、方法,但是介面不提供預設實現。(C#3.0之後,介面內也可以提供預設實現)

繼承某個介面的話就要實現該接口裡的所有方法。

繼承 :
類的定義處,用冒號加父類的形式表示類的繼承。子類可以使用父類裡面的非private標記的方法和屬性,也可以重寫父類帶override/virtual或父類所繼承的介面的方法。

子類可以擁有隻屬於自己(不屬於父類)的方法和屬性。靜態類或者靜態成員無法繼承或重寫。

多型
子類可以隱式轉換成父類,由子類變換得到的父類可以顯式重新轉換為對應的子類。子類轉換為父類後,子類原有屬性和方法不會丟失,只是無法訪問。

重寫 overrite
子類想要重新實現一個父類裡面已經實現了的方法,就用overrite一個同名方法,然後在{ }裡面實現,如果需要呼叫父類中被override的方法,需要用"base.方法名"。

虛方法 virtual
類對於有virtual方法提供預設的實現,並且允許子類重寫。(有點類似於上文已經提供了預設實現的介面)

換句話說,父類中的虛方法一定要有預設實現,子類可以選擇是否重寫。

抽象方法,介面,標記為virtual的方法可以被重寫(override),實方法不可以。

抽象方法&抽象類 abstract
當你不想實現某些方法的時候可以用abstract把方法設定為抽象方法,同時要把該方法所在的類設定為抽象類(因為抽象方法必須存在於抽象類中)。

那麼抽象類中有兩種成員:已經實現了的方法等成員、沒有實現的方法(即抽象方法)。

所以抽象類不能例項化。

抽象類本身不可以例項化,只能通過某個繼承該抽象類的非抽象子類來例項化,再隱式轉化成該抽象類,該抽象類才得以運用。

密封類 sealed
如果不想自己寫的類被別人繼承,就用sealed規定成密封類。

索引器(Indexer)
索引器的行為的宣告在某種程度上類似於屬性(property)。就像屬性(property),您可使用 get 和 set 訪問器來定義索引器。但是,屬性返回或設定一個特定的資料成員,而索引器返回或設定物件例項的一個特定值。換句話說,它把例項資料分為更小的部分,並索引每個部分,獲取或設定每個部分


using System;
namespace IndexerApplication
{
class IndexedNames
{
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames()
{
for (int i = 0; i < size; i++)
namelist[i] = "N. A.";
}
public string this[int index]
{
get//只讀
{
string tmp;

if( index >= 0 && index <= size-1 )
{
tmp = namelist[index];
}
else
{
tmp = "";
}

return ( tmp );
}
set//只寫
{
if( index >= 0 && index <= size-1 )
{
namelist[index] = value;
}
}
}

static void Main(string[] args)
{
IndexedNames names = new IndexedNames();
names[0] = "Zara";
names[1] = "Riz";
names[2] = "Nuha";
names[3] = "Asif";
names[4] = "Davinder";
names[5] = "Sunil";
names[6] = "Rubic";
for ( int i = 0; i < IndexedNames.size; i++ )
{
Console.WriteLine(names[i]);
}
Console.ReadKey();
}
}
}

當上面的程式碼被編譯和執行時,它會產生下列結果:


Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.