C# Nullable

判斷對象是否爲null否則報錯

string? a = string.Empty;
if (a is null)
if (ReferenceEquals(a, null))
if (a == null)


public void GetUser(string name) => ArgumentNullException.ThrowIfNull(nameof(name));

var a= b??throw new ArgumentNullException("Name must not be null")

//語法糖(目前沒有上線)
public void GetUser(string name!!) => Console.WriteLine(DBNull.Value);

DBNull

一般用於判斷DB和DataTable的值是否爲null

Console.WriteLine(DBNull.Value);
Console.WriteLine(null != DBNull.Value);

public void A (object? a)
{
    Console.WriteLine(a!=null);
    Console.WriteLine(a!=DBNull.Value);
}

檢查元素是否可爲空的反射API

提供來自反射成員的可空性信息和上下文:

  • ParameterInfo 參數
  • FieldInfo 字段
  • PropertyInfo 屬性
  • EventInfo 事件
var example = new Example();
var nullabilityInfoContext = new NullabilityInfoContext();
foreach (var propertyInfo in example.GetType().GetProperties())
{
    var nullabilityInfo = nullabilityInfoContext.Create(propertyInfo);
    Console.WriteLine($"{propertyInfo.Name} property is {nullabilityInfo.WriteState}");
}

// Output:
// Name property is Nullable
// Value property is NotNull

class Example
{
    public string? Name { get; set; }
    public string Value { get; set; }
}

檢查嵌套元素是否可爲空的反射API

允許您獲取嵌套元素的可爲空的信息, 您可以指定數組屬性必須爲非空,但元素可以爲空,反之亦然。

Type exampleType = typeof(Example);
PropertyInfo notNullableArrayPI = exampleType.GetProperty(nameof(Example.NotNullableArray));
PropertyInfo nullableArrayPI = exampleType.GetProperty(nameof(Example.NullableArray));

NullabilityInfoContext nullabilityInfoContext = new();

NullabilityInfo notNullableArrayNI = nullabilityInfoContext.Create(notNullableArrayPI);
Console.WriteLine(notNullableArrayNI.ReadState);              // NotNull
Console.WriteLine(notNullableArrayNI.ElementType.ReadState);  // Nullable

NullabilityInfo nullableArrayNI = nullabilityInfoContext.Create(nullableArrayPI);
Console.WriteLine(nullableArrayNI.ReadState);                // Nullable
Console.WriteLine(nullableArrayNI.ElementType.ReadState);    // Nullable

class Example
{
    public string?[] NotNullableArray { get; set; }
    public string?[]? NullableArray { get; set; }
}

API接口報錯案例

項目中使用了<Nullable>enable</Nullable>
Api報錯,但是字段沒有標識[Required]

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "00-8d8245e63ed44d0e0a45bd96350980ee-9f6a21dba718ebd8-00",
    "errors": {
        "Name": [
            "The Name field is required."
        ]
    }
}

需要全局添加以下配置

services.AddControllers(options => options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章