Handling Nullable Reference Types in Modern C#
The reference type cannot be nulled by default after enabling the nullable context. 1. Use string? to explicitly allow null, which is applicable to database fields, API optional properties, etc. 2. Enable the project file or use #nullable enable for a single file. 3. Use [MaybeNull] and [MemberNotNull] to avoid misjudgment. 4. Use null check or ! operator to assist the compiler inferring the non-null state of the variables, thereby discovering potential null values in advance and improving code robustness.
In modern C#, the core of dealing with nullable reference types is to use the compiler to help us discover potential null values in advance. C# 8 introduces two concepts: nullable context and nullable annotation, allowing developers to more clearly express whether variables are allowed to be null, and warns that may make errors.

Let’s start from several common usage scenarios to see how to better use this feature.

Understand the design philosophy of default non-empty
After nullable enable
is enabled, all reference types are "non-empty" by default. That is, a declaration like string name;
the compiler will think you intend to make it always have a value. If you try to assign a value to null or use it without initialization, you will receive a warning.
This is actually a "safety first" design idea. for example:

- If you accidentally write
string? name = null;
and then usename.Length
directly, the compiler will remind you that something might be wrong here. - In turn, if the variable is defined as
string name = null!;
, the compiler will markname.Length
as a potential risk even if you forcefully bypass the initialization check.
This mechanism is not a mandatory mistake, but a gentle reminder that encourages you to write more robust code.
Use ?
Clearly indicate that the allowable is empty
When you really need a variable that can be null, add a question mark after the type, such as string? description;
. This way the compiler will no longer make "non-empty" assumptions about it.
Common applicable scenarios include:
- Fields that may be missing in database query results
- API returns optional attributes
- Method to return null when cache misses
At this time, before accessing .Value
or calling a method, it is best to do a null check first. For example:
if (user.Email is not null) { SendEmail(user.Email); }
Or use the null merge operator to simplify the logic:
var displayName = user.Name ?? "Anonymous";
Ways to enable and configure nullable contexts
To actually enable this mechanism, you need to set <nullable>enable</nullable>
in the project file, or you can add #nullable enable
at the top of a single file.
Some projects may not have this option enabled at the beginning. At this time, you can gradually enable it, first enable the new file, and slowly migrate the old code. You can also set to warnings
mode, generating only warnings without changing semantic behavior.
Also, if you have some special fields that do want to preserve the rationality of null, but don't want to be reminded every time, you can use features such as [MaybeNull]
or [NotNullIfNotNull]
to tell the compiler your intentions.
Tips to avoid misjudgment
Sometimes the compiler makes inaccurate judgments, especially when you make some complex logical judgments, you can help it understand in the following ways:
- After using
null
check, local variables will be automatically inferred as non-null - For attributes or fields, you can add
[MemberNotNull]
to tell the compiler that some members will not be null after a certain method is executed - If you are sure that somewhere will not be empty, but don't want to turn off the entire warning, you can use the
!
operator:name!.Length
However, these are all "trust yourself" operations. It is recommended to use them only when it is really necessary, otherwise it may cover up real hidden dangers.
Basically that's it. After mastering these points, you will find that the code becomes clearer and easier to avoid NullReferenceException at runtime.
The above is the detailed content of Handling Nullable Reference Types in Modern C#. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

The difference between multithreading and asynchronous is that multithreading executes multiple threads at the same time, while asynchronously performs operations without blocking the current thread. Multithreading is used for compute-intensive tasks, while asynchronously is used for user interaction. The advantage of multi-threading is to improve computing performance, while the advantage of asynchronous is to not block UI threads. Choosing multithreading or asynchronous depends on the nature of the task: Computation-intensive tasks use multithreading, tasks that interact with external resources and need to keep UI responsiveness use asynchronous.

The history and evolution of C# and C are unique, and the future prospects are also different. 1.C was invented by BjarneStroustrup in 1983 to introduce object-oriented programming into the C language. Its evolution process includes multiple standardizations, such as C 11 introducing auto keywords and lambda expressions, C 20 introducing concepts and coroutines, and will focus on performance and system-level programming in the future. 2.C# was released by Microsoft in 2000. Combining the advantages of C and Java, its evolution focuses on simplicity and productivity. For example, C#2.0 introduced generics and C#5.0 introduced asynchronous programming, which will focus on developers' productivity and cloud computing in the future.

Methods to convert XML to JSON include: writing scripts or programs in programming languages (such as Python, Java, C#) to convert; pasting or uploading XML data using online tools (such as XML to JSON, Gojko's XML converter, XML online tools) and selecting JSON format output; performing conversion tasks using XML to JSON converters (such as Oxygen XML Editor, Stylus Studio, Altova XMLSpy); converting XML to JSON using XSLT stylesheets; using data integration tools (such as Informatic

C# multi-threaded programming is a technology that allows programs to perform multiple tasks simultaneously. It can improve program efficiency by improving performance, improving responsiveness and implementing parallel processing. While the Thread class provides a way to create threads directly, advanced tools such as Task and async/await can provide safer asynchronous operations and a cleaner code structure. Common challenges in multithreaded programming include deadlocks, race conditions, and resource leakage, which require careful design of threading models and the use of appropriate synchronization mechanisms to avoid these problems.

How to build applications using .NET? Building applications using .NET can be achieved through the following steps: 1) Understand the basics of .NET, including C# language and cross-platform development support; 2) Learn core concepts such as components and working principles of the .NET ecosystem; 3) Master basic and advanced usage, from simple console applications to complex WebAPIs and database operations; 4) Be familiar with common errors and debugging techniques, such as configuration and database connection issues; 5) Application performance optimization and best practices, such as asynchronous programming and caching.

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

The advantage of multithreading is that it can improve performance and resource utilization, especially for processing large amounts of data or performing time-consuming operations. It allows multiple tasks to be performed simultaneously, improving efficiency. However, too many threads can lead to performance degradation, so you need to carefully select the number of threads based on the number of CPU cores and task characteristics. In addition, multi-threaded programming involves challenges such as deadlock and race conditions, which need to be solved using synchronization mechanisms, and requires solid knowledge of concurrent programming, weighing the pros and cons and using them with caution.

.NETFramework is a software framework, and C# is a programming language. 1..NETFramework provides libraries and services, supporting desktop, web and mobile application development. 2.C# is designed for .NETFramework and supports modern programming functions. 3..NETFramework manages code execution through CLR, and the C# code is compiled into IL and runs by CLR. 4. Use .NETFramework to quickly develop applications, and C# provides advanced functions such as LINQ. 5. Common errors include type conversion and asynchronous programming deadlocks. VisualStudio tools are required for debugging.
