C#.Net築基-類型系統②常見類型

来源:https://www.cnblogs.com/anding/p/18176136
-Advertisement-
Play Games

結構體 struct 是一種用戶自定義的值類型,常用於定義一些簡單(輕量)的數據結構。對於一些局部使用的數據結構,優先使用結構體,效率要高很多。 ...


image.png

01、結構體類型Struct

結構體 struct 是一種用戶自定義的值類型,常用於定義一些簡單(輕量)的數據結構。對於一些局部使用的數據結構,優先使用結構體,效率要高很多。

  • 可以有構造函數,也可以沒有。因此初始化時可以new,也可以用預設default。但當給欄位設置了初始值時,則必須有顯示的構造函數。
  • 結構體中可以定義欄位、屬性、方法,不能使用終結器。
  • 結構體可繼承介面,並實現介面,但不能繼承其他類、結構體。
  • 結構體是值類型,被分配在棧上面,因此在參數傳遞時為值傳遞。

⁉️結構體始終都是分配在棧上嗎?—— 不一定,當結構體是類的成員時,則會隨對象一起分配在堆上。同時當結構體上有引用類型欄位時,該欄位只存儲引用對象的地址,引用對象還是分配在堆上。

void Main()
{
	Point p1 = default;
	//Point p1 = default(Point);
	Point p2 = new Point(1, 2);
	p1.X = 100;
	p2.X = 100;
}
public struct Point
{
	public int X;
	public int Y;

	public Point(int x, int y)
	{
		X = x;
		Y = y;
	}
}

1.1、只讀結構體與只讀函數

readonly struct申明一個只讀的結構體,其所有欄位、屬性都必須是只讀的。

public readonly struct Point
{
	public readonly int X,Y;
}

用在方法上,該方法中不可修改任何欄位值。這隻能用在結構體中,結構體不能繼承,不知道這個特性有什麼用?

public struct Point
{
	public int X;
	public int Y;

	public readonly int GetValue()
	{
		X--;   //Error:不可修改
		return X + Y;
	}
}

1.2、Ref 結構體

ref 結構類型ref struct申明,該結構體只能存儲在棧上,因此任何會導致其分配到堆上的行為都不支持,如裝箱、拆箱,作為類的成員等都不支持。
Ref 結構體 可用於一些高性能場景,System.SpanReadOnlySpan 都是 readonly ref struct結構體。

public ref struct Point
{
	public int X,Y;
}

02、枚舉Enum

枚舉類型 是由基礎值類型(byte、int、long等)組成的一組命名常量的值類型,用enum來申明定義。常用於一些有固定值的類別申明,如性別、方向、數據類型等。

  • 枚舉成員預設是int,可以修改為其他整數類型,如byteshortuintlong等。
  • 枚舉項可設置值,也可省略,或者部分設置值。值預設是從0開始,並按順序依次遞增。
  • 枚舉變數的預設值始終是0
  • 枚舉本質上就是命名常量,因此可以與值類型進行相互轉換(強制轉換)。
  • 特性Description常用來定義枚項在UI上的顯示內容,使用反射獲取。
public enum UserType : int  //常量類型,可以修改為其他整數類型
{
    [Description("普通會員")]
	Default,
	VIP = 10,
	SupperVIP,  //繼續前一個,值為11
}
void Main()
{
	var t1 = UserType.Default;
	Console.WriteLine(t1.ToString()); //輸出名稱:Default
	Console.WriteLine((int)t1);       //輸出值:0
    Console.WriteLine($"{t1:F}");     //輸出名稱:Default
	Console.WriteLine($"{t1:D}");     //輸出值:0
	var t2 = (UserType)0;
	int t3 = (int)UserType.Default;
	Console.WriteLine(t1 == t2); //True
}

2.1、Enum 類API

System.Enum 類型是所有枚舉類型的抽象基類,提供了一些API方法用於枚舉的操作,基本都是靜態方法。Enum 類型還可以作為泛型約束使用。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 相關參考 https://leejjon.medium.com/how-to-allow-cross-origin-requests-in-a-jax-rs-microservice-d2a6aa2df484 https://stackoverflow.com/questions/28065963/ ...
  • 配置 NGINX 和 NGINX Plus 作為 Web 伺服器 設置虛擬伺服器 在 NGINX Plus 配置文件中,必須包含至少一個 server 指令來定義一個虛擬伺服器。 當 NGINX Plus 處理請求時,首先選擇將服務於該請求的虛擬伺服器。 http { server { # 伺服器配 ...
  • title: Django與前端框架協作開發實戰:高效構建現代Web應用 date: 2024/5/22 20:07:47 updated: 2024/5/22 20:07:47 categories: 後端開發 tags: DjangoREST 前端框架 SSR渲染 SPA路由 SEO優化 組件庫 ...
  • 在使用Wrapper構建條件時,經常因為需要構建的條件過多需要寫半個多小時,還容易粗心寫錯欄位,所以就想搞個可以直接自動構建QueryWrapper的工具類。 ...
  • 今天使用Thinkphp5做非同步任務傳遞where參數時遇到一個問題: 有一段如下代碼: $where['jst.supplier'] = ['exp', Db::raw('>0 or jst.is_supplier=1')]; 在使用swoole做非同步任務時需要把where參數傳遞給非同步任務處理, ...
  • 前言 市面上關於認證授權的框架已經比較豐富了,大都是關於單體應用的認證授權,在分散式架構下,使用比較多的方案是--<應用網關>,網關里集中認證,將認證通過的請求再轉發給代理的服務,這種中心化的方式並不適用於微服務,這裡討論另一種方案--<認證中心>,利用jwt去中心化的特性,減輕認證中心的壓力,有理 ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 在小公司中,往往沒有一個前後端分離的大型團隊,去各司其職的負責構建web應用程式。面對比較簡單的需求,可能所謂團隊只有一個人,既要開發前端又要開發後端。 如果能有一項技術,能夠前後端通吃,並且具備非常高的開發效率,那就非常適合小公司的小型項目的小型甚至一人團隊來使用了。 aspdotnet就是這樣高 ...
一周排行
    -Advertisement-
    Play Games
  • 一個自定義WPF窗體的解決方案,借鑒了呂毅老師的WPF製作高性能的透明背景的異形視窗一文,併在此基礎上增加了滑鼠穿透的功能。可以使得透明窗體的滑鼠事件穿透到下層,在下層窗體中響應。 ...
  • 在C#中使用RabbitMQ做個簡單的發送郵件小項目 前言 好久沒有做項目了,這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作,之前在我的個人博客裡面回覆評論和友鏈申請是會通過發送郵件來通知對方的,不過當時只是簡單的進行了非同步操作。 那麼這次來使用RabbitMQ去統一發送郵件,我的想法是通過 ...
  • 當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...