網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言:
作為面向?qū)ο蟮恼Z(yǔ)言,C# 支持封裝、繼承和多態(tài)性這些概念。 類(lèi)可能會(huì)直接繼承一個(gè)父類(lèi),并且可以實(shí)現(xiàn)任意數(shù)量的接口。 若要用方法重寫(xiě)父類(lèi)中的虛方法,必須使用 override
關(guān)鍵字,以免發(fā)生意外重定義。 在 C# 中,結(jié)構(gòu)就像是輕量級(jí)類(lèi),是可以實(shí)現(xiàn)接口但不支持繼承的堆棧分配類(lèi)型。 C# 提供了 record class
和 record struct
類(lèi)型,這些類(lèi)型的目的主要是存儲(chǔ)數(shù)據(jù)值。
一、類(lèi)和對(duì)象
類(lèi) 是最基本的 C# 類(lèi)型。 類(lèi)是一種數(shù)據(jù)結(jié)構(gòu),可在一個(gè)單元中就將狀態(tài)(字段)和操作(方法和其他函數(shù)成員)結(jié)合起來(lái)。 類(lèi)為類(lèi)實(shí)例(亦稱(chēng)為“對(duì)象”)提供了定義 。 類(lèi)支持 繼承 和 多形性,即 派生類(lèi) 可以擴(kuò)展和專(zhuān)門(mén)針對(duì) 基類(lèi) 的機(jī)制。
新類(lèi)使用類(lèi)聲明進(jìn)行創(chuàng)建。 類(lèi)聲明以標(biāo)頭開(kāi)頭。 標(biāo)頭指定以下內(nèi)容:
- 類(lèi)的特性和修飾符
- 類(lèi)的名稱(chēng)
- 基類(lèi)(從基類(lèi)繼承時(shí))
- 接口由該類(lèi)實(shí)現(xiàn)。
標(biāo)頭后面是類(lèi)主體,由在分隔符 { 和 } 內(nèi)編寫(xiě)的成員聲明列表組成。
以下代碼展示的是簡(jiǎn)單類(lèi) Point 的聲明:
public class Point { public int X { get; } public int Y { get; } public Point(int x, int y) => (X, Y) = (x, y); }
類(lèi)實(shí)例是使用 new
運(yùn)算符進(jìn)行創(chuàng)建,此運(yùn)算符為新實(shí)例分配內(nèi)存,調(diào)用構(gòu)造函數(shù)來(lái)初始化實(shí)例,并返回對(duì)實(shí)例的引用。 以下語(yǔ)句創(chuàng)建兩個(gè) Point
對(duì)象,并將對(duì)這些對(duì)象的引用存儲(chǔ)在兩個(gè)變量中:
var p1 = new Point(0, 0); var p2 = new Point(10, 20);
當(dāng)無(wú)法再訪(fǎng)問(wèn)對(duì)象時(shí),對(duì)象占用的內(nèi)存會(huì)被自動(dòng)回收。 沒(méi)有必要也無(wú)法在 C# 中顯式解除分配對(duì)象。
1、類(lèi)型參數(shù)
泛型類(lèi)定義類(lèi)型參數(shù)。 類(lèi)型參數(shù)是用尖括號(hào)括起來(lái)的類(lèi)型參數(shù)名稱(chēng)列表。 類(lèi)型參數(shù)跟在類(lèi)名后面。 然后,可以在類(lèi)聲明的主體中使用類(lèi)型參數(shù)來(lái)定義類(lèi)成員。 在以下示例中,Pair 的類(lèi)型參數(shù)是 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); }
聲明為需要使用類(lèi)型參數(shù)的類(lèi)類(lèi)型被稱(chēng)為 泛型類(lèi)類(lèi)型。 結(jié)構(gòu)、接口和委托類(lèi)型也可以是泛型。 使用泛型類(lèi)時(shí),必須為每個(gè)類(lèi)型參數(shù)提供類(lèi)型自變量:
var pair = new Pair<int, string>(1, "two"); int i = pair.First; //TFirst int string s = pair.Second; //TSecond string
包含類(lèi)型自變量的泛型類(lèi)型(如上面的 Pair<int
,string>
)被稱(chēng)為 構(gòu)造泛型類(lèi)型。
2、基類(lèi)
類(lèi)聲明可以指定基類(lèi)。 在類(lèi)名和類(lèi)型參數(shù)后面加上冒號(hào)和基類(lèi)的名稱(chēng)。 省略基類(lèi)規(guī)范與從 object
類(lèi)型派生相同。 在以下示例中,Point3D
的基類(lèi)是 Point
在第一個(gè)示例中,Point 的基類(lèi)是 object:
public class Point3D : Point { public int Z { get; set; } public Point3D(int x, int y, int z) : base(x, y) { Z = z; } }
類(lèi)繼承其基類(lèi)的成員。 繼承意味著一個(gè)類(lèi)隱式包含其基類(lèi)的幾乎所有成員。 類(lèi)不繼承實(shí)例、靜態(tài)構(gòu)造函數(shù)以及終結(jié)器。 派生類(lèi)可以在其繼承的成員中添加新成員,但無(wú)法刪除繼承成員的定義。 在上面的示例中,Point3D
從 Point 繼承了 X 和 Y 成員,每個(gè) Point3D 實(shí)例均包含三種屬性(X、Y 和 Z)。
可以將類(lèi)類(lèi)型隱式轉(zhuǎn)換成其任意基類(lèi)類(lèi)型。 類(lèi)類(lèi)型的變量可以引用相應(yīng)類(lèi)的實(shí)例或任意派生類(lèi)的實(shí)例。
?例如,類(lèi)聲明如上,Point 類(lèi)型的變量可以引用 Point 或 Point3D:
Point a = new(10, 20); Point b = new Point3D(10, 20, 30);
二、結(jié)構(gòu)
類(lèi)定義可支持繼承和多形性的類(lèi)型。 它們使你能夠基于派生類(lèi)的層次結(jié)構(gòu)創(chuàng)建復(fù)雜的行為。 相比之下,結(jié)構(gòu)類(lèi)型是較為簡(jiǎn)單的類(lèi)型,其主要目的是存儲(chǔ)數(shù)據(jù)值。 結(jié)構(gòu)不能聲明基類(lèi)型;它們從 System.ValueType
隱式派生。 不能從 struct
類(lèi)型派生其他 struct
類(lèi)型。 這些類(lèi)型已隱式密封。
public struct Point { public double X { get; } public double Y { get; } public Point(double x, double y) => (X, Y) = (x, y); }
三、接口
接口定義了可由類(lèi)和結(jié)構(gòu)實(shí)現(xiàn)的協(xié)定*。 定義接口來(lái)聲明在不同類(lèi)型之間共享的功能。 例如,System.Collections.Generic.IEnumerable<T>
接口定義了一個(gè)遍歷集合(如數(shù)組)中所有項(xiàng)的一致方法。 接口可以包含方法、屬性、事件和索引器。 接口通常不提供所定義成員的實(shí)現(xiàn),僅指定必須由實(shí)現(xiàn)接口的類(lèi)或結(jié)構(gòu)提供的成員。
接口可以采用 多重繼承。 在以下示例中,接口 IComboBox
同時(shí)繼承自 ITextBox
和 IListBox
。
interface IControl { void Paint(); } interface ITextBox : IControl { void SetText(string text); } interface IListBox : IControl { void SetItems(string[] items); } interface IComboBox : ITextBox, IListBox { }
類(lèi)和結(jié)構(gòu)可以實(shí)現(xiàn)多個(gè)接口。 在以下示例中,類(lèi) EditBox
同時(shí)實(shí)現(xiàn) IControl
和 IDataBound
。
interface IDataBound { void Bind(Binder b); } public class EditBox : IControl, IDataBound { public void Paint() { } public void Bind(Binder b) { } }
當(dāng)類(lèi)或結(jié)構(gòu)實(shí)現(xiàn)特定接口時(shí),此類(lèi)或結(jié)構(gòu)的實(shí)例可以隱式轉(zhuǎn)換成相應(yīng)的接口類(lèi)型。 例如:
EditBox editBox = new(); IControl control = editBox; IDataBound dataBound = editBox;
四、枚舉
枚舉類(lèi)型定義了一組常數(shù)值。 以下 enum 聲明了定義不同根蔬菜的常數(shù):
public enum SomeRootVegetable { HorseRadish, Radish, Turnip }
還可以定義一個(gè) enum
作為標(biāo)志組合使用。 以下聲明為四季聲明了一組標(biāo)志。
可以隨意搭配季節(jié)組合,包括 All 值(包含所有季節(jié)):
[Flags] public enum Seasons { None = 0, Summer = 1, Autumn = 2, Winter = 4, Spring = 8, All = Summer | Autumn | Winter | Spring }
以下示例顯示了前面兩個(gè)枚舉的聲明:
var turnip = SomeRootVegetable.Turnip; var spring = Seasons.Spring; var startingOnEquinox = Seasons.Spring | Seasons.Autumn; var theYear = Seasons.All;
五、可為 null 的類(lèi)型
任何類(lèi)型的變量都可以聲明為“不可為 null
”或“可為 null
”。 可為 null 的變量包含一個(gè)額外的 null 值,表示沒(méi)有值。 可為 null 的值類(lèi)型(結(jié)構(gòu)或枚舉)由 System.Nullable<T>
表示。 不可為 null 和可為 null 的引用類(lèi)型都由基礎(chǔ)引用類(lèi)型表示。 這種區(qū)別由編譯器和某些庫(kù)讀取的元數(shù)據(jù)體現(xiàn)。 當(dāng)可為 null 的引用在沒(méi)有先對(duì)照 null 檢查其值的情況下取消引用時(shí),編譯器會(huì)發(fā)出警告。 當(dāng)對(duì)不可為 null 的引用分配了可能為 null 的值時(shí),編譯器也會(huì)發(fā)出警告。 以下示例聲明了“可為 null 的 int”,并將其初始化為 null。 然后將值設(shè)置為 5。 該示例通過(guò)“可為 null 的字符串” ** 演示了同一概念。
int? optionalInt = default; optionalInt = 5; string? optionalText = default; optionalText = "Hello World.";
六、元組
C# 支持元組,后者提供了簡(jiǎn)潔的語(yǔ)法來(lái)將多個(gè)數(shù)據(jù)元素分組成一個(gè)輕型數(shù)據(jù)結(jié)構(gòu)。
通過(guò)聲明 ( 和 ) 之間的成員的類(lèi)型和名稱(chēng)來(lái)實(shí)例化元組,如下例所示:
(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.
元組為具有多個(gè)成員的數(shù)據(jù)結(jié)構(gòu)提供了一種替代方法
原文鏈接:https://docs.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/types
相關(guān)推薦
- 2022-07-09 flutter封裝單選點(diǎn)擊菜單工具欄組件_Android
- 2023-11-19 psutil cpu_percent如何使用;python如何測(cè)試cpu的使用率
- 2022-12-31 Android權(quán)限機(jī)制深入分析講解_Android
- 2022-04-03 帶你理解C語(yǔ)言中的漢諾塔公式_C 語(yǔ)言
- 2021-12-15 Android中Intent組件的入門(mén)學(xué)習(xí)心得_Android
- 2022-01-05 npm ERR! code ENOENT npm ERR! syscall open npm ERR
- 2023-06-02 Pandas計(jì)算元素的數(shù)量和頻率的方法(出現(xiàn)的次數(shù))_python
- 2023-04-08 C#以太網(wǎng)Sockets服務(wù)器設(shè)計(jì)實(shí)現(xiàn)_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支