C# 8通過(guò)引入可空引用類型減少空引用異常。 1. 可在項(xiàng)目文件中全局啟用,2. 也可在單個(gè)文件中使用#nullable指令啟用,3. 或通過(guò)編譯器參數(shù)啟用。啟用後引用類型默認(rèn)非空,需顯式添加?以允許為空。處理警告時(shí)應(yīng)優(yōu)先修復(fù)實(shí)際空值問(wèn)題,使用null-forgiving操作符或模式匹配進(jìn)行空值檢查。
C# 8 introduced nullable reference types as a way to help developers catch potential null reference exceptions at compile time, rather than at runtime. In earlier versions of C# (and many other languages), reference types could always be null by default, which often led to NullReferenceException errors in real-world applications.

With nullable reference types enabled, reference types are treated as non-nullable by default , and you have to explicitly declare when a reference type can be null. This adds a layer of safety and clarity to your code.
How to enable nullable reference types
There are a few ways to enable nullable reference types depending on your project and preference.

1. Enable globally in the project file
The most common and recommended way is to enable nullable reference types for the entire project by editing the .csproj
file:
<PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> </PropertyGroup>
This enables nullable reference types across all files in the project. It's simple and effective for new or existing projects.

2. Enable per file using a directive
If you want to control it on a per-file basis, you can use the #nullable
directive at the top of a .cs
file:
#nullable enable
This is useful during migration or if you want to gradually adopt the feature in legacy code.
3. Enable via compiler options
You can also enable the feature via compiler options when building from the command line:
csc /nullable Program.cs
This is less common unless you're compiling manually or in specific CI/CD scenarios.
Understanding the basics of nullable reference types
Once enabled, the compiler treats all reference types like string
, object
, or custom classes as non-nullable by default . If you want a reference type to allow nulls, you must explicitly add a ?
after the type:
string name = null; // Warning: Cannot assign null to non-nullable reference string? name = null; // OK: This string can be null
This distinction helps you write safer code by making nullability part of the type system.
Key behaviors:
- Assigning
null
to a non-nullable reference type generates a compiler warning. - You can suppress warnings using null-forgiving operator (
!
), likename!.Length
, but use this sparingly. - You can annotate APIs to help tools and analyzers understand null expectations better.
How to deal with warnings and common patterns
Enabling nullable reference types might cause a lot of warnings in existing codebases. Here's how to handle them effectively.
Fix actual issues
Start by reviewing the warnings and fixing actual null violations. For example:
string user = GetUser(); // Warning: May return null int length = user.Length; // Warning: Possible null reference
If GetUser()
can return null, update it to return string?
, and handle the null case properly:
string? user = GetUser(); if (user != null) { int length = user.Length; // Safe access }
Use null-forgiving operator when appropriate
Sometimes the compiler can't infer that a value isn't null, but you know it isn't. In those cases, you can use the null-forgiving operator:
string user = GetUser()!;
Use this only when you're certain the value won't be null, or you risk reintroducing runtime errors.
Use pattern matching and null checks
Take advantage of pattern matching and built-in null checks to write cleaner and safer code:
if (GetUser() is string { } user) { Console.WriteLine(user.Length); }
This combines null checking and assignment in a single line.
Summary
Enabling nullable reference types in C# 8 helps reduce null-related bugs by making non-null the default for reference types. You can enable it globally, per file, or via compiler flags. Once enabled, the compiler will warn you when you try to assign null to non-nullable references, and you can use ?
to indicate nullable ones.
Fixing warnings often means updating method return types, using null checks, or applying the null-forgiving operator where appropriate.
基本上就這些。
以上是什麼是C#8可無(wú)用的參考類型,如何啟用它們?的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

自定義特性(CustomAttributes)是C#中用於向代碼元素附加元數(shù)據(jù)的機(jī)制,其核心作用是通過(guò)繼承System.Attribute類來(lái)定義,並在運(yùn)行時(shí)通過(guò)反射讀取,實(shí)現(xiàn)如日誌記錄、權(quán)限控制等功能。具體包括:1.CustomAttributes是聲明性信息,以特性類形式存在,常用於標(biāo)記類、方法等;2.創(chuàng)建時(shí)需定義繼承自Attribute的類,並用AttributeUsage指定應(yīng)用目標(biāo);3.應(yīng)用後可通過(guò)反射獲取特性信息,例如使用Attribute.GetCustomAttribute();

在C#中設(shè)計(jì)不可變對(duì)象和數(shù)據(jù)結(jié)構(gòu)的核心是確保對(duì)象創(chuàng)建後狀態(tài)不可修改,從而提升線程安全性和減少狀態(tài)變化導(dǎo)致的bug。 1.使用readonly字段並配合構(gòu)造函數(shù)初始化,確保字段僅在構(gòu)造時(shí)賦值,如Person類所示;2.對(duì)集合類型進(jìn)行封裝,使用ReadOnlyCollection或ImmutableList等不可變集合接口,防止外部修改內(nèi)部集合;3.使用record簡(jiǎn)化不可變模型定義,默認(rèn)生成只讀屬性和構(gòu)造函數(shù),適合數(shù)據(jù)建模;4.創(chuàng)建不可變集合操作時(shí)推薦使用System.Collections.Imm

處理大量數(shù)據(jù)時(shí),C#可通過(guò)流式處理、並行異步和合適的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)高效。 1.使用流式處理逐條或分批讀取,如StreamReader或EFCore的AsAsyncEnumerable,避免內(nèi)存溢出;2.合理使用並行(Parallel.ForEach/PLINQ)與異步(async/await Task.Run),控制並發(fā)數(shù)量並註意線程安全;3.選擇高效數(shù)據(jù)結(jié)構(gòu)(如Dictionary、HashSet)和序列化庫(kù)(如System.Text.Json、MessagePack),減少查找時(shí)間和序列化開(kāi)銷。

反射是C#中用於運(yùn)行時(shí)動(dòng)態(tài)分析和修改程序結(jié)構(gòu)的功能,核心作用包括獲取類型信息、動(dòng)態(tài)創(chuàng)建對(duì)象、調(diào)用方法及檢查程序集。常見(jiàn)應(yīng)用場(chǎng)景有:1.自動(dòng)綁定數(shù)據(jù)模型,如將字典數(shù)據(jù)映射到類實(shí)例;2.實(shí)現(xiàn)插件系統(tǒng),通過(guò)加載外部DLL並調(diào)用其接口;3.支持自動(dòng)化測(cè)試與日誌記錄,如執(zhí)行特定特性方法或自動(dòng)記錄日誌。使用時(shí)需注意性能開(kāi)銷、封裝性破壞和調(diào)試?yán)щy等問(wèn)題,優(yōu)化方式包括緩存類型信息、使用委託提高調(diào)用效率及生成IL代碼等。合理利用反射可提升系統(tǒng)的靈活性與通用性。

在ASP.NETCore中創(chuàng)建自定義中間件,可通過(guò)編寫(xiě)類並註冊(cè)實(shí)現(xiàn)。 1.創(chuàng)建包含InvokeAsync方法的類,處理HttpContext和RequestDelegatenext;2.在Program.cs中使用UseMiddleware註冊(cè)。中間件適用於日誌記錄、性能監(jiān)控、異常處理等通用操作,與MVC過(guò)濾器不同,其作用於整個(gè)應(yīng)用,不依賴控制器。合理使用中間件可提升結(jié)構(gòu)靈活性,但應(yīng)避免影響性能。

寫(xiě)好C#代碼的關(guān)鍵在于可維護(hù)性和可測(cè)試性。合理劃分職責(zé),遵循單一職責(zé)原則(SRP),將數(shù)據(jù)訪問(wèn)、業(yè)務(wù)邏輯和請(qǐng)求處理分別由Repository、Service和Controller承擔(dān),提升結(jié)構(gòu)清晰度和測(cè)試效率。多用接口和依賴注入(DI),便于替換實(shí)現(xiàn)、擴(kuò)展功能和進(jìn)行模擬測(cè)試。單元測(cè)試應(yīng)隔離外部依賴,使用Mock工具驗(yàn)證邏輯,確保快速穩(wěn)定執(zhí)行。規(guī)范命名和拆分小函數(shù),提高可讀性和維護(hù)效率。堅(jiān)持結(jié)構(gòu)清晰、職責(zé)分明、測(cè)試友好的原則,能顯著提升開(kāi)發(fā)效率和代碼質(zhì)量。

使用LINQ時(shí)應(yīng)遵循以下要點(diǎn):1.在聲明式數(shù)據(jù)操作如過(guò)濾、轉(zhuǎn)換或聚合數(shù)據(jù)時(shí)優(yōu)先使用LINQ,避免在有副作用或性能關(guān)鍵的場(chǎng)景強(qiáng)制使用;2.理解延遲執(zhí)行特性,源集合修改可能導(dǎo)致意外結(jié)果,需根據(jù)需求選擇延遲或立即執(zhí)行;3.注意性能與內(nèi)存開(kāi)銷,鍊式調(diào)用可能產(chǎn)生中間對(duì)象,性能敏感代碼可改用循環(huán)或Span;4.保持查詢簡(jiǎn)潔易讀,複雜邏輯拆分為多個(gè)步驟,避免過(guò)度嵌套和混合多種操作。

泛型約束用於限制類型參數(shù)以確保特定行為或繼承關(guān)係,協(xié)變則允許子類型轉(zhuǎn)換。例如,whereT:IComparable確保T可比較;協(xié)變?nèi)鏘Enumerable允許IEnumerable轉(zhuǎn)為IEnumerable,但僅限讀取,不可修改。常見(jiàn)約束包括class、struct、new()、基類和接口,多約束用逗號(hào)分隔;協(xié)變需用out關(guān)鍵字且只適用於接口和委託,與逆變(in關(guān)鍵字)不同。注意協(xié)變不支持類,不能隨意轉(zhuǎn)換,且約束影響靈活性。
