C# 中的強大運算符

C# 中鮮為人知的強大運算符

C# 還提供了一些"冷門"但功能強大的運算符,這些運算符在特定場景下能極大簡化代碼并提高效率。

1. 空合并賦值運算符 ??=

// 傳統寫法
if (variable == null)
{variable = defaultValue;
}// 使用 ??=
variable ??= defaultValue;

功能
當變量為 null 時,將右側的值賦給它

實際應用

// 延遲初始化
private List<Item> _items;
public List<Item> Items => _items ??= new List<Item>();// 配置默認值
void LoadSettings()
{_qualityLevel ??= QualityLevel.High;_resolution ??= new Resolution(1920, 1080);
}

2. 空條件運算符 ?.?[]

// 安全訪問成員
string name = user?.Profile?.Name;// 安全訪問索引器
int? firstScore = scores?[0];// 安全調用方法
user?.Validate();

功能
在訪問成員、調用方法或訪問索引器時,如果對象為 null,則返回 null 而不是拋出異常

實際應用

// Unity 中安全訪問組件
Rigidbody rb = go?.GetComponent<Rigidbody>();// 安全訪問字典值
var config = settings?.GetSection("Graphics")?["Resolution"];

3. 范圍運算符 ..

int[] numbers = { 0, 1, 2, 3, 4, 5 };
var slice = numbers[1..4]; // [1, 2, 3]
var allButFirst = numbers[1..]; // [1, 2, 3, 4, 5]
var lastThree = numbers[^3..]; // [3, 4, 5]

功能
創建數組或集合的切片視圖

實際應用

// 處理部分數據
ProcessFrames(videoFrames[10..20]);// 獲取子字符串
string domain = email[(email.IndexOf('@') + 1)..];

4. 索引運算符 ^

int[] numbers = { 0, 1, 2, 3, 4, 5 };
int last = numbers; // 5
int secondLast = numbers; // 4

功能
從集合末尾開始索引

實際應用

// 獲取路徑最后部分
string fileName = path.Split('/');// 檢查最后幾個元素
if (samples[^3..].All(s => s > threshold))
{// 最后三個樣本都超過閾值
}

5. 模式匹配中的 isswitch 表達式

// is 模式匹配
if (obj is string { Length: > 5 } s)
{Console.WriteLine($"長字符串: {s}");
}// switch 表達式
var message = input switch
{int i when i > 0 => "正數",int i when i < 0 => "負數",int => "零",_ => "非數字"
};

功能
強大的類型檢查和值提取

實際應用

// Unity 組件處理
void ProcessComponent(Component comp)
{switch (comp){case Rigidbody rb:rb.velocity = Vector3.zero;break;case Renderer rend when rend.material != null:rend.material.color = Color.red;break;case null:Debug.LogWarning("組件丟失");break;}
}

6. 棄元運算符 _

// 忽略不需要的輸出參數
_ = int.TryParse("123", out _);// 忽略不需要的返回值
_ = Task.Run(() => BackgroundProcess());// 模式匹配中忽略部分值
if (point is (0, _))
{// X坐標為0的所有點
}

功能
明確表示忽略某個值

實際應用

// Unity 事件處理
button.onClick.AddListener(_ => 
{// 不需要事件參數PlaySound();
});// 解構忽略部分值
var (x, _, z) = GetPosition();

7. 命名參數和可選參數

void ConfigureServer(string host, int port = 8080, bool ssl = false)
{// ...
}// 調用時
ConfigureServer("example.com", ssl: true);

功能
提高代碼可讀性并簡化重載

實際應用

// Unity 實例化對象
Instantiate(prefab, position: spawnPoint.position,rotation: Quaternion.identity,parent: transform
);// 創建顏色
var color = new Color(r: 0.5f, g: 0.7f, b: 1f);

8. 插值字符串 $

string name = "Alice";
int age = 30;
string message = $"{name} is {age} years old";

功能
更簡潔的字符串格式化

高級用法

// 格式控制
$"Price: {price:C2}" // 貨幣格式// 表達式計算
$"Area: {width * height}"// 對齊
$"{"Name",-10} {"Age",5}"

9. 聯合 switch 表達式

var result = operation switch
{"add" => a + b,"sub" => a - b,"mul" => a * b,"div" when b != 0 => a / b,_ => throw new InvalidOperationException()
};

功能
更簡潔的模式匹配語法

實際應用

// Unity 狀態處理
currentState = input switch
{InputType.Jump when isGrounded => PlayerState.Jumping,InputType.Attack => PlayerState.Attacking,InputType.Dash when canDash => PlayerState.Dashing,_ => currentState
};

10. 委托合并運算符 +-

event Action OnEvent;void Subscribe()
{OnEvent += Handler1;OnEvent += Handler2;
}void Unsubscribe()
{OnEvent -= Handler1;
}

功能
管理事件訂閱

實際應用

// Unity 事件管理
button.onClick.AddListener(OnClick);
// ...
button.onClick.RemoveListener(OnClick);// 多播委托
Action multiAction = MethodA;
multiAction += MethodB;
multiAction(); // 調用 MethodA 和 MethodB

實用技巧:組合使用運算符

// 安全訪問并設置默認值
string username = user?.Profile?.Name ?? "Guest";// 安全訪問數組元素
int? score = scores?[index] ?? 0;// 模式匹配與空檢查
if (obj is Player { Health: > 0 } player)
{player.Respawn();
}

這些運算符雖然相對"冷門",但在實際開發中能極大提升代碼的簡潔性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89878.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用window字體替換zabbix 默認的字體

我們先需要在windows系統下的C:\Windows\Fonts目錄&#xff0c;找到一個喜歡的字體&#xff0c;我選擇的是微軟雅黑。復制到其它路徑下&#xff0c;選取一個msyh.ttc。到服務器上。要把msyh.ttc改為msyh.ttf才可以。不然最后中英文都不顯示[roothadoop105.yinzhengjie.com ~]# …

MySQL 17 如何正確地顯示隨機消息?

假設有一個場景&#xff0c;一個英語學習APP首頁有一個隨機顯示單詞的功能&#xff0c;用戶每次訪問首頁的時候&#xff0c;都會隨機滾動顯示三個單詞。 已知表里有10000條記錄&#xff0c;來看看隨機選擇3個單詞有什么方法&#xff0c;又存在什么問題。 建表語句&#xff1a…

7-Zip 曝出兩個可導致拒絕服務的中危漏洞

研究人員在全球使用最廣泛的開源文件壓縮軟件7-Zip中新發現兩個漏洞&#xff08;CVE-2025-53816和CVE-2025-53817&#xff09;。這兩個漏洞影響7-Zip 25.0.0之前的所有版本&#xff0c;雖然不能實現遠程代碼執行&#xff0c;但可能引發內存損壞和拒絕服務&#xff08;Denial of…

史上最簡單Conda+Ollama+Open-Webui安裝方法!

史上最簡單CondaOllamaOpen-Webui安裝方法 一、安裝Anaconda 1、到Anaconda官網下載conda_24.10.1 鏈接&#xff1a;https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Windows-x86_64.exe 2.雙擊安裝包&#xff0c;開始安裝 選擇All Users 切記安裝路徑不要選C盤&am…

Python-數據庫概念-pymysql-元編程-SQLAlchemy-學習筆記

序 欠4前年的一份筆記 &#xff0c;獻給今后的自己。 數據庫 概念 數據庫&#xff1a;按照數據結構來組織、存儲、管理數據的倉庫。 誕生 計算機的發明是為了做科學計算的&#xff0c;而科學計算需要大量的數據輸入和輸出。 早期&#xff0c;可以使用打孔卡片的孔、燈泡的亮滅來…

Linux入門篇學習——借助 U 盤或 TF 卡拷貝程序到開發板上

借助 U 盤或 TF 卡拷貝程序到開發板上我們已經學習了怎么在 ubuntu 和 windows 上互傳文件&#xff0c;那么怎么把 ubuntu 或 win 上的程序拷貝到開發板呢&#xff0c;這里給大家介紹第一種方法&#xff0c;使用 U 盤或者 TF 卡來完成&#xff0c;如果大家使用的是 U 盤&#x…

【親測有效】防檢測插件playwright_stealth 2.X版本快速使用

這里寫自定義目錄標題核心方法apply_stealth_syncuse_sync和use_async一. playwright_stealth 2.0以上版本1.同步方法2.異步方法3.實例二.playwright_stealth 2.0以下版本playwright-stealth 是一個用于 Playwright 的庫&#xff0c;旨在幫助自動化腳本避開一些檢測機制&#x…

docker安裝與簡單項目上手

1.docker安裝 系統版本為almalinux9.6 首先添加一下docker的軟件安裝源&#xff08;源選擇的阿里云&#xff0c;只要是rhel的系統都適用&#xff0c;無論是rockylinux還是almalinux還是紅帽企業版&#xff09; dnf config-manager --add-repo https://mirrors.aliyun.com/doc…

計算機網絡基礎:從協議到通信全解析(大致框架)

本節重點&#xff1a;1.了解網絡發展背景&#xff0c;對局域網/廣域網的概念有基本認識2.了解網絡協議的意義&#xff0c;重點理解TCP/IP五層結構模型3.學習網絡傳輸的基本流程&#xff0c;理解封裝和解包分用一、計算機網絡發展背景&#xff1a;人與人之間是需要協同工作的&am…

PDF 編輯器:多文件合并 拆分 旋轉 順序隨便調 加水印 密碼鎖 頁碼背景

各位打工人、學生黨們&#xff0c;你們是不是也遇到過這種情況&#xff0c;領導甩來一個PDF讓你改&#xff0c;結果你搗鼓半天&#xff0c;發現這玩意兒根本動不了&#xff0c;簡直想原地爆炸&#xff01;別急別急&#xff0c;今天就給你們安利一個辦公軟件——PDF編輯器&#…

【軟件基礎學習配置那些事 4-3】3ds Max2026 菜單欄常用命令-----文件、視圖、編輯、工具、組

3ds Max學習的筆記小知識&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;后續都會補充添加&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;個人的一些學習筆記&#xff0c;如有不對&#xff0c;歡迎訂正&am…

網絡爬蟲的介紹

網絡爬蟲庫網絡爬蟲通俗來講就是使用代碼將HTML網頁的內容下載到本地的過程。爬取網頁主要是為了獲取網中的關鍵信息&#xff0c;例如網頁中的數據、圖片、視頻等。Python語言中提供了多個具有爬蟲功能的庫&#xff0c;下面將具的介紹。urlib庫:是Python自帶的標準庫&#xff0…

C# 編程實戰進階:字符串與字符串數組 (3)

目錄 1、給定一個整數數組 nums&#xff0c;將數組中的元素向右輪轉 k 個位置&#xff0c;其中 k 是非負數。 2、無重復字符的最長字符串 &#xff0c;給定一個字符串 s 請你找出其中不含有重復字符的最長字符串的長度。 3、給定兩個字符串 s 和 t &#xff0c;它們只包含小…

Python趣味算法:百錢百雞問題——雙重循環優化與算法效率分析

如何用Python解決中國古代數學難題?本文從暴力枚舉到高效優化,帶你領略算法之美,效率提升100倍! 看在每天堅持分享有趣知識的份上,點個關注吧(づ ̄ 3 ̄)づ 關注是我更新的動力 ̄︶ ̄? ̄︶ ̄?) 作者會分享更多涉及到各種編程語言的有趣知識!(^?^●)?? 目錄 …

JAVA_TWO-初識Java2

1.IDEA管理Java程序的結構2.idea編譯后的class文件在哪在工程out文件夾下。3.idea一些快捷鍵4.導入模塊File→New→Module from Existing Sources → 添加后綴.iml文件5.注釋單行注釋 //多行注釋 /* 注釋內容1注釋內容2 */文檔注釋 /** 注釋內容 */ &#xff08;文檔注釋內容可…

二、Dify 版本升級教程(LInux-openeuler)

首先&#xff0c;你需要先按照好dify&#xff0c;然后才能升級&#xff0c;本文教程是基與Docker Compose 如果你還沒有安裝&#xff0c;可以看看這個教程。 一、Dify 私有部署、本地安裝教程&#xff08;LInux-openeuler&#xff09;_dify1.5版本部署-CSDN博客 安裝完成后&a…

Java 大視界 -- Java 大數據在智能安防門禁系統中的多生物特征融合識別與權限管理(280)

??親愛的朋友們,熱烈歡迎來到 青云交的博客!能與諸位在此相逢,我倍感榮幸。在這飛速更迭的時代,我們都渴望一方心靈凈土,而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識,也期待你毫無保留地分享獨特見解,愿我們于此攜手成長,共赴新程!?? 本博…

【Tools】Ubuntu24.04安裝詳細教程

00. 目錄 文章目錄00. 目錄01. Ubuntu 24.04簡介02. Ubuntu 24.04下載03. Ubuntu 24.04虛擬機創建04. Ubuntu 24.04安裝步驟05. Ubuntu 24.04常用軟件06. 附錄01. Ubuntu 24.04簡介 Ubuntu 24.04 LTS&#xff08;代號“Noble Numbat”&#xff09;是Canonical于2024年4月25日發…

linux基礎入門Ubuntu 22.04 系統中添加、刪除和授予用戶 sudo權限

在 Ubuntu 中&#xff0c;sudo 允許授權用戶以 root 級別權限執行任務&#xff0c;即使他們不知道 root 用戶密碼。這對于執行管理任務非常重要&#xff0c;因為它可以避免直接使用 root 用戶&#xff0c;從而減少系統被誤操作的風險&#xff0c;同時在企業生產中由于ubuntu系統…

npm : 無法加載文件 C:\Program Files\nodejs\npm.ps1

問題描述使用git bash, cmd運行npm都可以&#xff0c;但是用Power Shell運行npm&#xff0c;卻報錯&#xff1a;npm : 無法加載文件 C:\Program Files\nodejs\npm.ps1&#xff0c;因為在此系統上禁止運行腳本。有關詳細信息&#xff0c;請參閱 https:/go.microsoft.com/fwlink/…