C# ?. 运算符 是意思

zhengyingcan 2018-10-12 11:50:55
List<ARoleMenu> roles = TableList.Where(x => x.Pid == role?.Id).ToList();
btn.Text = btnRole?.Name;

前面是 问号,后面是小数点, ?. 是什么意思呢,代码如上,谢谢高人指点。
...全文
1168 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
前面的实例不为null则访问属性/方法,否则返回null(方法没有返回值则是void)
Anglee米粒 2018-10-18
  • 打赏
  • 举报
回复
原来如此,学习了
SoulRed 2018-10-16
  • 打赏
  • 举报
回复
这个貌似是C# 的语法糖,简化判断为空,相当于if(v!=null){}
注意需要C#高版本才支持
良朋 2018-10-16
  • 打赏
  • 举报
回复
相当于vb.net的IIf

CStr=IIf(testMe > 1000, "Large", "Small")

stisom 2018-10-15
  • 打赏
  • 举报
回复
为了避免访问对象成员时的空引用,可以使用类似 _person?.name 获取name, 不同于_person.name, 当_person为null的时候,前者返回null,而后者抛出空引用异常。
bellediao 2018-10-14
  • 打赏
  • 举报
回复
是不是?:啊
这是问号表达式。
int c = (a > b ? 1 : 0);
意思就是说,如果a大于b,那么c就为1,否则就为0
threenewbee 2018-10-14
  • 打赏
  • 举报
回复
不能简单地理解为语法糖,这个写法是非常有用的。 要知道,到目前为止linq to db的表达式树还只能支持单行表达式,不能支持代码块,所以没有这东西,用if去写是写不了的(当然?:应该是可以的,但是繁琐多了)
  • 打赏
  • 举报
回复
4.6还是4.7新语法糖 对应
int? length;
string demo=null;
if(demo!=null)
{
length=demo.Length;
}
//上面太复杂,直接可以
length=demo?.Length
stherix 2018-10-12
  • 打赏
  • 举报
回复
?.意义是 如果前面的实例不为null则访问属性/方法,否则返回null(方法没有返回值则是void) 要注意的是 如果访问的属性/字段是值类型T(string除外),那么?.返回的类型将是T?,而不是T
E次奥 2018-10-12
  • 打赏
  • 举报
回复
首先说明这个问号和点本来就不是一起的; 当没有问号的时候直接点就是当前对象下的。。。(方法、属性等);加了问号表示当前对象不为null时再调用当前对象下的属性,防止由于对象为null导致的空指针;
jt_zhang 2018-10-12
  • 打赏
  • 举报
回复
等价于 btn.Text = btnRole == null?null:btnRole.Name;
姓小名白丶 2018-10-12
  • 打赏
  • 举报
回复
新的语法特性 假设 db.student.firsordefault() 这个方法可能会返回NULL 而你要取的是这一条中的Name 如果你直接这么写 db.student.firsordefault().Name 当遇到student为NUll的时候 代码执行会直接跑出异常 如果没有trycatch可能就直接崩了
然而当你用这种写法的时候db.student.firsordefault()?.Name 当出现Student为Null的时候,你可以理解为它就不会去取Name了,因为实体都是NULL 还取个鸡儿的Name 而且不会抛异常 这样子。


关于这个呢,你可以安装一个resharper 你会发现 这是个很神奇的东西,它会提示你可以优化的代码片段,你点击并且选择以后它会自己帮你去优化你的代码,当然有些优化其实是不必要的,但是大部分优化还是很有用的。
wanghui0380 2018-10-12
  • 打赏
  • 举报
回复
这是新版C#的语法糖,等价与早期C#的

if(XXX!=null)
XXX.yyy();


目的简化程序员代码敲击次数,保证逻辑顺畅,同时减少那个著名的微软诅咒“你的对象不存在”(写C#的单身狗们,微软也不愿意诅咒你,木有对象)
全栈极简 2018-10-12
  • 打赏
  • 举报
回复
btnRole?.Name; 其中?.表示 btnRole对象不为空的话就调用它的Name属性,否则就是null. 是C#6.0的语法糖,简化了以前要判断btnRole是否为null的代码。
正怒月神 2018-10-12
  • 打赏
  • 举报
回复
btnRole?.Name 等于 btnRole如果是null,直接返回null 否则返回btn.Role.Name
MXHai123 2018-10-12
  • 打赏
  • 举报
回复
这就是可空类型,你去搜C#可空类型
蓝之羽520 2018-10-12
  • 打赏
  • 举报
回复
三目运算符,前面条件为真,则走冒号前面的内容,否则走冒号后面的代码
游北亮 2018-10-12
  • 打赏
  • 举报
回复
就是语法糖,减少你的代码量,比如: btn.Text = btnRole?.Name; 等于 btn.Text = btnRole==null ? null: btnRole.Name; 还有: string b = null; var a = b?? "xxx"; 等效于: var a = b ? "xxx" : b;

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧