在C#类的设计中,可选属性指的是实例创建时可以不显式赋值,或者允许赋值为空值的属性,这类属性在处理非必填字段、可选配置等场景时非常实用。不同的实现方式对应不同的业务需求,需要结合具体场景选择。

使用可空类型定义可选属性
可空类型是C#中定义可选属性最常用的方法之一,通过在值类型后添加?标记,允许该类型的变量赋值为null,引用类型本身默认支持null赋值,因此也可以直接作为可选属性使用。
值类型可空属性的定义示例如下:
public class UserInfo
{
// 引用类型本身可为空,属于可选属性
public string? NickName { get; set; }
// 值类型添加?后变为可空类型,属于可选属性
public int? Age { get; set; }
// 不可空的值类型属性,必须赋值
public int UserId { get; set; }
}
当使用可空类型定义可选属性时,访问属性值前需要先判断是否为null,避免空引用异常。
使用默认值定义可选属性
如果不想让属性支持null值,也可以为属性设置默认值,这样实例创建时如果没有显式赋值,属性会自动使用默认值,也属于可选属性的一种实现方式。
设置默认值的示例如下:
public class UserConfig
{
// 设置默认值为0,不赋值时自动使用0
public int MaxLoginCount { get; set; } = 0;
// 设置默认值为空字符串,不赋值时自动使用空字符串
public string AvatarUrl { get; set; } = string.Empty;
// 设置默认值为false,不赋值时自动使用false
public bool IsVip { get; set; } = false;
}
这种方式的属性不会出现null值,适合不需要区分未赋值和赋值为默认值的场景。
使用属性初始化器定义可选属性
还可以在类实例化时通过属性初始化器为可选属性赋值,属性本身不设置默认值,只有在使用初始化器时才赋值,不使用则保持默认行为。
初始化器的使用示例如下:
public class Product
{
public string ProductName { get; set; } = string.Empty;
// 可选属性,不强制赋值
public string? Description { get; set; }
// 可选属性,不强制赋值
public decimal? DiscountPrice { get; set; }
}
// 实例化时只赋值必填属性
var product1 = new Product
{
ProductName = "无线鼠标"
};
// 实例化时同时赋值可选属性
var product2 = new Product
{
ProductName = "机械键盘",
Description = "青轴机械键盘",
DiscountPrice = 199.99m
};
不同实现方式的对比
三种可选属性的实现方式适用场景不同,具体对比如下:
| 实现方式 | 适用场景 | 注意事项 |
|---|---|---|
| 可空类型 | 需要明确区分未赋值和赋值为默认值的场景 | 访问前需要判断null,避免空引用异常 |
| 默认值 | 不需要区分未赋值和默认值的场景 | 属性不会出现null值,无法判断用户是否显式赋值为默认值 |
| 属性初始化器 | 实例化时按需赋值可选属性 | 属性本身无默认值,依赖实例化时的赋值操作 |
可选属性的使用建议
- 如果属性确实可能不存在值,优先使用可空类型,明确标记属性可以接受null值。
- 如果属性一定会有值,只是有合理的默认值,使用默认值方式更合适,避免不必要的null判断。
- 在方法接收包含可选属性的类实例时,如果需要使用可选属性的值,先判断是否为null或者使用null条件运算符访问。
合理选择可选属性的实现方式,可以让类的设计更符合业务需求,同时减少不必要的空值判断逻辑,提升代码的可维护性。
C#_类可选属性nullable_typedefault_valueproperty_definition修改时间:2026-06-21 10:15:16