c#語言入門類型和成員
前言:
作為面向對象的語言,C# 支持封裝、繼承和多態性這些概念。 類可能會直接繼承一個父類,並且可以實現任意數量的接口。 若要用方法重寫父類中的虛方法,必須使用 override
關鍵字,以免發生意外重定義。 在 C# 中,結構就像是輕量級類,是可以實現接口但不支持繼承的堆棧分配類型。 C# 提供瞭 record class
和 record struct
類型,這些類型的目的主要是存儲數據值。
一、類和對象
類 是最基本的 C# 類型。 類是一種數據結構,可在一個單元中就將狀態(字段)和操作(方法和其他函數成員)結合起來。 類為類實例(亦稱為“對象”)提供瞭定義 。 類支持 繼承 和 多形性,即 派生類 可以擴展和專門針對 基類 的機制。
新類使用類聲明進行創建。 類聲明以標頭開頭。 標頭指定以下內容:
- 類的特性和修飾符
- 類的名稱
- 基類(從基類繼承時)
- 接口由該類實現。
標頭後面是類主體,由在分隔符 { 和 } 內編寫的成員聲明列表組成。
以下代碼展示的是簡單類 Point 的聲明:
public class Point { public int X { get; } public int Y { get; } public Point(int x, int y) => (X, Y) = (x, y); }
類實例是使用 new
運算符進行創建,此運算符為新實例分配內存,調用構造函數來初始化實例,並返回對實例的引用。 以下語句創建兩個 Point
對象,並將對這些對象的引用存儲在兩個變量中:
var p1 = new Point(0, 0); var p2 = new Point(10, 20);
當無法再訪問對象時,對象占用的內存會被自動回收。 沒有必要也無法在 C# 中顯式解除分配對象。
1、類型參數
泛型類定義類型參數。 類型參數是用尖括號括起來的類型參數名稱列表。 類型參數跟在類名後面。 然後,可以在類聲明的主體中使用類型參數來定義類成員。 在以下示例中,Pair 的類型參數是 TFirst
和 TSecond
:
public class Pair<TFirst, TSecond> { public TFirst First { get; } public TSecond Second { get; } public Pair(TFirst first, TSecond second) => (First, Second) = (first, second); }
聲明為需要使用類型參數的類類型被稱為 泛型類類型。 結構、接口和委托類型也可以是泛型。 使用泛型類時,必須為每個類型參數提供類型自變量:
var pair = new Pair<int, string>(1, "two"); int i = pair.First; //TFirst int string s = pair.Second; //TSecond string
包含類型自變量的泛型類型(如上面的 Pair<int
,string>
)被稱為 構造泛型類型。
2、基類
類聲明可以指定基類。 在類名和類型參數後面加上冒號和基類的名稱。 省略基類規范與從 object
類型派生相同。 在以下示例中,Point3D
的基類是 Point
在第一個示例中,Point 的基類是 object:
public class Point3D : Point { public int Z { get; set; } public Point3D(int x, int y, int z) : base(x, y) { Z = z; } }
類繼承其基類的成員。 繼承意味著一個類隱式包含其基類的幾乎所有成員。 類不繼承實例、靜態構造函數以及終結器。 派生類可以在其繼承的成員中添加新成員,但無法刪除繼承成員的定義。 在上面的示例中,Point3D
從 Point 繼承瞭 X 和 Y 成員,每個 Point3D 實例均包含三種屬性(X、Y 和 Z)。
可以將類類型隱式轉換成其任意基類類型。 類類型的變量可以引用相應類的實例或任意派生類的實例。
例如,類聲明如上,Point 類型的變量可以引用 Point 或 Point3D:
Point a = new(10, 20); Point b = new Point3D(10, 20, 30);
二、結構
類定義可支持繼承和多形性的類型。 它們使你能夠基於派生類的層次結構創建復雜的行為。 相比之下,結構類型是較為簡單的類型,其主要目的是存儲數據值。 結構不能聲明基類型;它們從 System.ValueType
隱式派生。 不能從 struct
類型派生其他 struct
類型。 這些類型已隱式密封。
public struct Point { public double X { get; } public double Y { get; } public Point(double x, double y) => (X, Y) = (x, y); }
三、接口
接口定義瞭可由類和結構實現的協定*。 定義接口來聲明在不同類型之間共享的功能。 例如,System.Collections.Generic.IEnumerable<T>
接口定義瞭一個遍歷集合(如數組)中所有項的一致方法。 接口可以包含方法、屬性、事件和索引器。 接口通常不提供所定義成員的實現,僅指定必須由實現接口的類或結構提供的成員。
接口可以采用 多重繼承。 在以下示例中,接口 IComboBox
同時繼承自 ITextBox
和 IListBox
。
interface IControl { void Paint(); } interface ITextBox : IControl { void SetText(string text); } interface IListBox : IControl { void SetItems(string[] items); } interface IComboBox : ITextBox, IListBox { }
類和結構可以實現多個接口。 在以下示例中,類 EditBox
同時實現 IControl
和 IDataBound
。
interface IDataBound { void Bind(Binder b); } public class EditBox : IControl, IDataBound { public void Paint() { } public void Bind(Binder b) { } }
當類或結構實現特定接口時,此類或結構的實例可以隱式轉換成相應的接口類型。 例如:
EditBox editBox = new(); IControl control = editBox; IDataBound dataBound = editBox;
四、枚舉
枚舉類型定義瞭一組常數值。 以下 enum 聲明瞭定義不同根蔬菜的常數:
public enum SomeRootVegetable { HorseRadish, Radish, Turnip }
還可以定義一個 enum
作為標志組合使用。 以下聲明為四季聲明瞭一組標志。
可以隨意搭配季節組合,包括 All 值(包含所有季節):
[Flags] public enum Seasons { None = 0, Summer = 1, Autumn = 2, Winter = 4, Spring = 8, All = Summer | Autumn | Winter | Spring }
以下示例顯示瞭前面兩個枚舉的聲明:
var turnip = SomeRootVegetable.Turnip; var spring = Seasons.Spring; var startingOnEquinox = Seasons.Spring | Seasons.Autumn; var theYear = Seasons.All;
五、可為 null 的類型
任何類型的變量都可以聲明為“不可為 null
”或“可為 null
”。 可為 null 的變量包含一個額外的 null 值,表示沒有值。 可為 null 的值類型(結構或枚舉)由 System.Nullable<T>
表示。 不可為 null 和可為 null 的引用類型都由基礎引用類型表示。 這種區別由編譯器和某些庫讀取的元數據體現。 當可為 null 的引用在沒有先對照 null 檢查其值的情況下取消引用時,編譯器會發出警告。 當對不可為 null 的引用分配瞭可能為 null 的值時,編譯器也會發出警告。 以下示例聲明瞭“可為 null 的 int”,並將其初始化為 null。 然後將值設置為 5。 該示例通過“可為 null 的字符串” ** 演示瞭同一概念。
int? optionalInt = default; optionalInt = 5; string? optionalText = default; optionalText = "Hello World.";
六、元組
C# 支持元組,後者提供瞭簡潔的語法來將多個數據元素分組成一個輕型數據結構。
通過聲明 ( 和 ) 之間的成員的類型和名稱來實例化元組,如下例所示:
(double Sum, int Count) t2 = (4.5, 3); Console.WriteLine($"Sum of {t2.Count} elements is {t2.Sum}."); //Output: //Sum of 3 elements is 4.5.
元組為具有多個成員的數據結構提供瞭一種替代方法
到此這篇關於c#語言入門類型和成員的文章就介紹到這瞭,更多相關c#類型和成員內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java 枚舉類和自定義枚舉類和enum聲明及實現接口的操作
- Java實例講解枚舉enum的實現
- Java基礎之枚舉Enum類案例詳解
- Java淺析枚舉類的使用
- C語言自定義類型詳解(結構體、枚舉、聯合體和位段)