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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示