C#新語法

目錄

頂級語句(C#9.0)

using

全局using指令(C#10.0)

using資源管理問題

using聲明(C#8.0)

using聲明陷阱

錯誤寫法

正確寫法

文件范圍的命名空間聲明(C#10.0)

可空引用類型(C#8.0)

使用

使用!抑制警告

init

record記錄類型(C#9.0)

?record的原理及深入

record深入

with拷貝


頂級語句(C#9.0)

  1. 直接在C#文件中直接編寫入口方法的代碼,不用類,不用Main。經典寫法仍然支持。
  2. 同一個項目中只能有一個文件具有頂級語句。
  3. 頂級語句中可以直接使用await語法,也可以聲明函數

using

全局using指令(C#10.0)

  1. 將 global 修飾符添加到 using 前,這個命名空間就應用到整個項目,不用重復using。
  2. 通常創建一個專門用來編寫全局using代碼的C#文件。
  3. 如果csproj中啟用了<ImplicitUsings>enable</ImplicitUsings>,編譯器會自動隱式增加對于System、System.Linq等常用命名空間的引入,不同各類型項目引入的命名空間也不一樣。

using資源管理問題

實現了IDisposible接口的對象可以用using進行管理。

問題:如果一段代碼中有很多非托管資源需要被釋放的話,代碼中就會存在著多個嵌套的using語句。

using聲明(C#8.0)

在實現了Idisposable/IAsyncDisposable接口的類型的變量聲明前加上using,當代碼執行離開變量的作用域時,對象就會被釋放。

using聲明陷阱

錯誤寫法
using var outSteam = File.OpenWrite("e:/1.txt");
using var writer = new StreamWriter(outSteam);
writer.WriteLine("Hello");
string s = File.ReadAllText("e:/1.txt");
Console.WriteLine(s);
正確寫法
using (var outSteam = File.OpenWrite("e:/1.txt"))
using (var writer = new StreamWriter(outSteam))
{writer.WriteLine("Hello");
}
string s = File.ReadAllText("e:/1.txt");
Console.WriteLine(s);{using var outSteam = File.OpenWrite("e:/1.txt");using var writer = new StreamWriter(outSteam);writer.WriteLine("Hello");
}
string s = File.ReadAllText("e:/1.txt");
Console.WriteLine(s);

文件范圍的命名空間聲明(C#10.0)

在之前版本的C#中,類型必須定義在namespace中。

namespace NewGrammar;
class Book
{public int Id { get; set; }public string Name { get; set; }
}

可空引用類型(C#8.0)

C#數據類型分為值類型引用類型兩種,值類型的變量不可以為空,而引用類型變量可以為空。

問題:如果不注意檢查引用類型變量是否可空,就有可能造成程序中出現NullReferenceException異常。

使用

  1. csproj中<Nullable>enable</Nullable>啟用可空引用類型檢查。
  2. 在引用類型后添加“?”修飾符來聲明這個類型是可空的。對于沒有添加“?”修飾符的引用類型的變量,如果編譯器發現存在為這個變量賦值null的可能性的時候,編譯器會給出警告信息。
class Book
{public int Id { get; set; }public string? Name { get; set; }
}

使用!抑制警告

如果程序員確認被訪問的變量、成員確實不會出現為空的情況,也可以在訪問可空的變量、成員的時候加上!來抑制編譯器的警告。不要濫用。

init

僅在對象構造期間為屬性或索引器元素賦值,一旦初始化對象,將無法更改。

class Pig
{public int id { get; init; }
}

record記錄類型(C#9.0)

C#中的==運算符默認是判斷兩個變量指向的是否是同一個對象,即使兩個對象內容完全一樣,也不相等。可以通過重寫Equals方法、重寫==運算符等來解決這個問題,不過需要開發人員編寫非常多的額外代碼。
2、在C#9.0中增加了記錄(record)類型的語法,編譯器會為我們自動生成Equals、GetHashcode等方法。

namespace SelfReferecingOrganizationalStructureTree;record Book(int Id, string Name);class Program
{static void Main(string[] args){Book b1=new Book(1,"a1");Book b2=new Book(1,"a1");Book b3=new Book(2,"a1");Console.WriteLine(b1.ToString());Console.WriteLine(b1==b2);Console.WriteLine(b2==b3);Console.WriteLine(object.ReferenceEquals(b1, b2));}
}

?record的原理及深入

  1. 編譯器會根據Book類型中的屬性定義,自動為Book類型生成包含全部屬性的構造方法。注意,默認情況下,編譯器會生成一個包含所有屬性的構造方法,因此,我們編寫new Book()、new Book(“a1”)這兩種寫法都是不可以的。也會生成ToString方法和Equals等方法。
  2. 通過反編譯看背后原理。避免反編譯器的優化,需要把反編譯器生成的代碼改成C#8.0的語法。結論:record就是普通的一個類。
  3. record數據類型為我們提供了為所有屬性賦值的構造方法,所有屬性都是只讀的,而且對象可以進行值相等性比較,并且提供了可讀性強的ToString()返回值。在需要編寫一些不可變類并且需要進行對象值比較的對象時候,record可以幫我們把代碼的編寫難度大大降低。
record深入
  1. 可以實現部分屬性是只讀的、而部分屬性是可以讀寫。
    record Book(int Id, string Name)
    {public string? Author { get; set; }
    }class Program
    {static void Main(string[] args){Book b1 = new Book(1, "計算機網絡");b1.Author = "小明";Console.WriteLine(b1.ToString());}
    }
  2. 默認生成的構造方法的行為不能修改,我們可以為類型提供多個構造方法,然后其他構造方法通過this調用默認的構造方法。
    record Book(int Id, string Name)
    {public string? Author { get; set; }public Book(int Id, string Name, string Author) : this(Id, Name){this.Author = Author;}
    }
  3. 也推薦使用只讀屬性的類型。這樣的所有屬性都為只讀的類型叫做“不可變類型”,可以讓程序邏輯簡單,減少并發訪問、狀態管理等的麻煩。
with拷貝
  1. record也是普通類,變量的賦值是引用的傳遞。這是和結構體不同之處。
  2. 生成一個對象的副本,這個對象的其他屬性值與原對象的相同,只有一個或者少數幾個屬性改變。
  3. 麻煩的做法:Book b1 = new Book(1, "計算機網絡", "小明");
    用with關鍵字簡化:Book b2 = b1 with { Id = 2, Name = "操作系統" }; 創建的也是拷貝。
static void Main(string[] args)
{Book b1 = new Book(1, "計算機網絡", "小明");Book b2 = b1 with { Id = 2, Name = "操作系統" };Console.WriteLine(b1);Console.WriteLine(b2);
}

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

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

相關文章

基于dlib/face recognition人臉識別推拉流實現

目錄 一.環境搭建 二.推拉流代碼 三.人臉檢測推拉流 一.環境搭建 1.下載RTSP服務器MediaMTX與FFmpeg FFmpeg是一款功能強大的開源多媒體處理工具,而MediaMTX則是一個輕量級的流媒體服務器。兩者結合,可以實現將本地視頻或者實時攝像頭畫面推送到RTSP流,從而實現視頻…

Couchbase UI: Analytics

Couchbase 的 Analytics 頁面是用于執行分析查詢的部分&#xff0c;允許用戶對存儲在 Couchbase 中的數據進行復雜的分析和聚合。Analytics 提供了 SQL-like 查詢語言&#xff08;N1QL for Analytics&#xff09;&#xff0c;使得用戶能夠輕松地執行數據分析任務。以下是關于 C…

梯度下降優化算法-Adam

Adam&#xff08;Adaptive Moment Estimation&#xff09;是一種結合了動量法&#xff08;Momentum&#xff09;和 RMSProp 的自適應學習率優化算法。它通過計算梯度的一階矩&#xff08;均值&#xff09;和二階矩&#xff08;未中心化的方差&#xff09;來調整每個參數的學習率…

論文筆記(六十三)Understanding Diffusion Models: A Unified Perspective(六)(完結)

Understanding Diffusion Models: A Unified Perspective&#xff08;六&#xff09;&#xff08;完結&#xff09; 文章概括指導&#xff08;Guidance&#xff09;分類器指導無分類器引導&#xff08;Classifier-Free Guidance&#xff09; 總結 文章概括 引用&#xff1a; …

【PySide6快速入門】信號與槽的使用

文章目錄 前言什么是信號與槽信號與槽的功能最簡單的信號與槽控件連接信號與信號的連接總結 前言 在 PySide6 中&#xff0c;信號與槽機制是核心概念之一&#xff0c;它是 Qt 庫中事件通信的基礎。通過信號與槽&#xff0c;開發者能夠實現不同組件之間的解耦&#xff0c;從而使…

GOGOGO 枚舉

含義&#xff1a;一種類似于類的一種結構 作用&#xff1a;是Java提供的一個數據類型&#xff0c;可以設置值是固定的 【當某一個數據類型受自身限制的時候&#xff0c;使用枚舉】 語法格式&#xff1a; public enum 枚舉名{…… }有哪些成員&#xff1f; A、對象 public …

AWTK 骨骼動畫控件發布

Spine 是一款廣泛使用的 2D 骨骼動畫工具&#xff0c;專為游戲開發和動態圖形設計設計。它通過基于骨骼的動畫系統&#xff0c;幫助開發者創建流暢、高效的角色動畫。本項目是基于 Spine 實現的 AWTK 骨骼動畫控件。 代碼&#xff1a;https://gitee.com/zlgopen/awtk-widget-s…

[免費]基于Python的Django博客系統【論文+源碼+SQL腳本】

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的基于Python的Django博客系統&#xff0c;分享下哈。 項目視頻演示 【免費】基于Python的Django博客系統 Python畢業設計_嗶哩嗶哩_bilibili 項目介紹 隨著互聯網技術的飛速發展&#xff0c;信息的傳播與…

如何將電腦桌面默認的C盤設置到D盤?詳細操作步驟!

將電腦桌面默認的C盤設置到D盤的詳細操作步驟&#xff01; 本博文介紹如何將電腦桌面&#xff08;默認為C盤&#xff09;設置在D盤下。 首先&#xff0c;在D盤建立文件夾Desktop&#xff0c;完整的路徑為D:\Desktop。winR&#xff0c;輸入Regedit命令。&#xff08;或者單擊【…

C++ 寫一個簡單的加減法計算器

************* C topic&#xff1a;結構 ************* Structure is a very intersting issue. I really dont like concepts as it is boring. I would like to cases instead. If I want to learn something, donot hesitate to make shits. Like building a house. Wh…

excel如何查找一個表的數據在另外一個表是否存在

比如“Sheet1”有“張三”、“李四”“王五”三個人的數據&#xff0c;“Sheet2”只有“張三”、“李四”的數據。我們通過修改“Sheet1”的“民族”或者其他空的列&#xff0c;修改為“Sheet2”的某一列。這樣修改后篩選這個修改的列為空的或者為出錯的&#xff0c;就能找到兩…

MySQL 基礎學習(2): INSERT 操作

在這篇文章中&#xff0c;我們將專注于 MySQL 中的 INSERT 操作&#xff0c;深入了解如何高效地向表中插入數據&#xff0c;并探索插入操作中的一些常見錯誤與解決方案。 一、基礎 INSERT 語法 在 MySQL 中&#xff0c;INSERT 操作用于向表中插入新記錄&#xff0c;基本語法如…

CVE-2023-38831 漏洞復現:win10 壓縮包掛馬攻擊剖析

目錄 前言 漏洞介紹 漏洞原理 產生條件 影響范圍 防御措施 復現步驟 環境準備 具體操作 前言 在網絡安全這片沒有硝煙的戰場上&#xff0c;新型漏洞如同隱匿的暗箭&#xff0c;時刻威脅著我們的數字生活。其中&#xff0c;CVE - 2023 - 38831 這個關聯 Win10 壓縮包掛…

論文閱讀(二):理解概率圖模型的兩個要點:關于推理和學習的知識

1.論文鏈接&#xff1a;Essentials to Understand Probabilistic Graphical Models: A Tutorial about Inference and Learning 摘要&#xff1a; 本章的目的是為沒有概率圖形模型背景或沒有深入背景的科學家提供一個高級教程。對于更熟悉這些模型的讀者&#xff0c;本章將作為…

記錄 | 基于Docker Desktop的MaxKB安裝

目錄 前言一、MaxKBStep 1Step2 二、運行MaxKB更新時間 前言 參考文章&#xff1a;如何利用智譜全模態免費模型&#xff0c;生成大家都喜歡的圖、文、視并茂的文章&#xff01; MaxKB的Github下載地址 參考視頻&#xff1a;【2025最新MaxKB教程】10分鐘學會一鍵部署本地私人專屬…

Go反射指南

概念&#xff1a; 官方對此有個非常簡明的介紹&#xff0c;兩句話耐人尋味&#xff1a; 反射提供一種讓程序檢查自身結構的能力反射是困惑的源泉 第1條&#xff0c;再精確點的描述是“反射是一種檢查interface變量的底層類型和值的機制”。 第2條&#xff0c;很有喜感的自嘲…

第26篇 基于ARM A9處理器用C語言實現中斷<二>

Q&#xff1a;基于ARM A9處理器怎樣編寫C語言工程&#xff0c;使用按鍵中斷將數字顯示在七段數碼管上呢&#xff1f; A&#xff1a;基本原理&#xff1a;主程序需要首先調用子程序set_A9_IRQ_stack()初始化IRQ模式的ARM A9堆棧指針&#xff1b;然后主程序調用子程序config_GIC…

基于GS(Gaussian Splatting)的機器人Sim2Real2Sim仿真平臺

項目地址&#xff1a;RoboGSim 背景簡介 已有的數據采集方法中&#xff0c;遙操作&#xff08;下左&#xff09;是數據質量高&#xff0c;但采集成本高、效率低下&#xff1b;傳統仿真流程成本低&#xff08;下右&#xff09;&#xff0c;但真實度&#xff08;如紋理、物理&…

「 機器人 」利用沖程對稱性調節實現仿生飛行器姿態與方向控制

前言 在仿生撲翼飛行器中,通過改變沖程對稱性這一技術手段,可以在上沖與下沖兩個階段引入不對稱性,進而產生額外的力或力矩,用于實現俯仰或其他姿態方向的控制。以下從原理、在仿生飛行器中的應用和典型實驗示例等方面進行梳理與闡述。 1. 沖程對稱性原理 1.1 概念:上沖與…

MongoDB部署模式

目錄 單節點模式&#xff08;Standalone&#xff09; 副本集模式&#xff08;Replica Set&#xff09; 分片集群模式&#xff08;Sharded Cluster&#xff09; MongoDB有多種部署模式&#xff0c;可以根據業務需求選擇適合的架構和部署方式。 單節點模式&#xff08;Standa…