可空类型标记符(?)
说明:
- 可空类型标记符
?
用于指示某个值类型(如int
、float
等)可以为null
。这是c# 2.0引入的一个特性,用于处理数据库查询、json解析等场景中可能出现的空值。
示例代码:
int? nullableint = 5; int? nullableintwithnull = null; if (nullableint.hasvalue) { console.writeline(nullableint.value); // 输出: 5 } if (!nullableintwithnull.hasvalue) { console.writeline("the value is null."); // 输出: the value is null. }
空值传播操作符(?.)
说明:
- 空值传播操作符
?.
用于在访问可能为null
的对象的成员之前进行空检查。如果对象为null
,则不会尝试访问其成员,而是直接返回null
。
示例代码:
string str = null; int? length = str?.length; // length 为 null,因为 str 为 null person person = null; string jobtitle = person?.jobtitle; // jobtitle 为 null,因为 person 为 null person = new person { jobtitle = "software engineer" }; jobtitle = person?.jobtitle; // jobtitle 为 "software engineer"
条件(三元)运算符(?:)
说明:
- 条件运算符
?:
是c#中的三元运算符,用于根据条件选择两个值之一。其语法为condition ? expression1 : expression2
。
示例代码:
int x = 10; int y = 5; int max = x > y ? x : y; // max 为 10 console.writeline("最大值: " + max);
空值合并操作符(??)
说明:
- 空值合并操作符
??
用于在第一个操作数为null
时返回第二个操作数的值,否则返回第一个操作数的值。这常用于提供默认值以避免null
引发的异常。
示例代码:
string name = null; string displayname = name ?? "匿名用户"; // displayname 为 "匿名用户" string username = "developerdave"; displayname = username ?? "newbie"; // displayname 为 "developerdave",因为 username 不为 null console.writeline(displayname);
空值合并赋值运算符(??=)
说明:
- 空值合并赋值运算符
??=
是c# 8.0及更高版本中引入的一个特性,它结合了空值合并运算符(??
)和赋值运算符(=
)的功能。这个运算符用于将右侧的值赋给左侧的变量,但仅当左侧的变量为null
时。如果左侧的变量不为null
,则不会更改其值。这提供了一种更简洁的方式来为可能为null
的变量提供默认值或更新它们的值,而无需编写额外的if
语句。
示例代码:
string firstname = null; firstname ??= "未知"; // 如果 firstname 是 null,则将其设置为 "未知" console.writeline(firstname); // 输出: 未知 firstname = "john"; firstname ??= "未知"; // firstname 不是 null,所以不会更改其值 console.writeline(firstname); // 输出: john // 示例使用可空类型 int? age = null; age ??= 30; // 如果 age 是 null,则将其设置为 30 console.writeline(age.hasvalue ? age.value.tostring() : "null"); // 输出: 30 age = 25; age ??= 30; // age 不是 null,所以不会更改其值 console.writeline(age.hasvalue ? age.value.tostring() : "null"); // 输出: 25 // 示例使用类对象的属性 person person = null; person ??= new person { name = "默认名称" }; // 如果 person 是 null,则创建新实例并赋值 if (person != null) { console.writeline(person.name); // 如果 person 是新创建的实例,则输出: 默认名称 } person = new person { name = "john doe" }; person.name ??= "默认名称"; // person.name 不是 null,所以不会更改其值 console.writeline(person.name); // 输出: john doe
在上面的示例中,??=
运算符首先检查左侧的变量(或属性)是否为null
。如果是,则将其设置为右侧的值;如果不是,则保持其当前值不变。这种操作对于初始化可能为null
的变量或在某些条件下更新它们非常有用。
请注意,最后一个示例中尝试使用??=
来更新person
对象的name
属性可能不会按预期工作,因为??=
是专门为变量赋值设计的,而不是用于属性的。在属性上使用??=
会导致编译错误,除非该属性是特殊的(如可空值类型的自动实现属性)。
到此这篇关于c# ?的使用小结的文章就介绍到这了,更多相关c# ?使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论