15个C# Null检查最佳实践

在 C# 应用程序中,解决 C# Null Check 异常是一个普遍的挑战,可能会导致运行时故障和代码中断。为了强化您的代码库并保证无缝操作,必须掌握 C# Null 检查的细微差别。本文深入探讨了多种方法,提倡推荐方法,并为每种 C# Null Check 技术提供说明性示例。加入我们,我们将深入探讨处理 null 场景的有效策略,确保 C# 代码的稳健性和无错误性。

1.传统的空检查:
在访问对象之前使用if语句检查是否为 null。

string myString = GetStringValue();
if (myString != null)
{
    // Perform operations on myString
    Console.WriteLine(myString.Length);
}

2. 空条件运算符(?.):
该运算符在 C# 6.0 中引入,允许您仅在对象非 null 时访问成员和元素,从而简化了 null 检查。

string myString = GetStringValue();
int? stringLength = myString?.Length;
Console.WriteLine($"String Length: {stringLength}");

3. 空合并运算符 (??):
当遇到空引用时,使用此运算符提供默认值。

string myString = GetStringValue();
string result = myString ?? "Default Value";
Console.WriteLine(result);

4. 具有空合并的空条件(?. 和 ??):
组合两个运算符可实现简洁且富有表现力的空检查。

string myString = GetStringValue();
int stringLength = myString?.Length ?? 0;
Console.WriteLine($"String Length: {stringLength}");

5. 与 switch 语句进行模式匹配(C# 7.0 及更高版本):
利用模式匹配来检查 switch 语句中是否为 null。

object myObject = GetObjectValue();
switch (myObject)
{
    case string myString:
        Console.WriteLine($"String Value: {myString}");
        break;
    case null:
        Console.WriteLine(
"Object is null");
        break;
    default:
        Console.WriteLine(
"Unexpected type");
        break;
}

6. String.IsNullOrWhitespace:
使用静态方法专门检查 null 或空字符串String.IsNullOrWhitespace。

string myString = GetStringValue();
if (!string.IsNullOrWhiteSpace(myString))
{
    Console.WriteLine($"String Value: {myString}");
}

7. 空对象模式:
使用特殊的“空对象”实例设计您的类,这使您可以避免显式的空检查。

public class MyObject
{
    public virtual void DoSomething()
    {
        // Implementation for non-null object
    }
}
 
public class NullMyObject : MyObject
{
    public override void DoSomething()
    {
       
// Implementation for null object
    }
}
 
// Usage
MyObject myObject = GetObjectValue() ?? new NullMyObject();
myObject.DoSomething();

8. 条件调用(委托):
仅当对象不为 null 时才使用条件调用来执行方法。

Action myAction = GetAction();
myAction?.Invoke();

9. 方法参数的ArgumentNullException:
显式抛出一个ArgumentNullException不应为 null 的 for 方法参数。

public void MyMethod(string input)
{
    if (input == null)
    {
        throw new ArgumentNullException(nameof(input), "Input cannot be null");
    }
 
   
// Rest of the method logic
}

10. 代码合同(需要):
利用代码契约来表达先决条件,提供契约来确保非空值。

using System.Diagnostics.Contracts;
 
public void MyMethod(string input)
{
    Contract.Requires(input != null);
 
    // Rest of the method logic
}

11. 使用空合并进行对象初始化:
在对象初始化期间使用 null 合并来提供属性的默认值。

MyClass myObject = new MyClass
{
    MyProperty = GetPropertyValue() ?? DefaultValue
};

12. 空条件委托调用:
调用委托时应用空条件运算符。

Action myAction = GetAction();
myAction?.Invoke();

13. 空对象工厂方法:
实现一个工厂方法,根据条件返回空对象或实际对象。

public class ObjectFactory
{
    public static MyObject CreateObject(bool condition)
    {
        return condition ? new MyObject() : NullObject.Instance;
    }
}

14.动态类型空检查:
dynamic使用动态对象时,利用该类型进行运行时 null 检查。

dynamic myDynamicObject = GetDynamicObject();
if (myDynamicObject != null)
{
    // Access dynamic object properties or methods
}

using System.Diagnostics.Contracts;
 
public string GetNonNullString()
{
    Contract.Ensures(Contract.Result<string>() != null);
 
    // Method logic returning a non-null string
}

总之
掌握 C# 中空检查的艺术是编写健壮且防错代码的一个重要方面。通过探索从传统检查到更新的语言功能和设计模式的各种方法,开发人员可以灵活地根据特定场景定制策略。选择正确的空检查方法有助于提高代码的可读性、可维护性以及针对空引用异常的整体恢复能力。拥抱这些不同的技术,了解它们的优势,并提升您的编码实践,以确保更安全、更高效的 C# 应用程序开发体验。