当前位置: 首页 > 编程语言 > C#

C#6.0空传播运算符和属性赋值共享

时间:2023-04-10 13:43:34 C#

C#6.0空传播运算符和属性赋值这个问题已经过彻底检查,以便进行彻底的解释。我注意到C#6.0中null传播运算符的局限性似乎很差,因为您不能在已传播的对象上调用属性设置器(尽管您可以在已传播的对象上调用属性获取器)。正如您将从生成的IL(我已将其镜像到C#中)中看到的那样,没有任何东西限制通过null传播调用属性设置器的能力。首先,我创建了一个简单的类,包括具有公共getter/setter访问权限的Java风格的Get/Set方法和属性。publicclassPerson{publicPerson(stringname,DateTimebirthday){Name=name;}公共字符串名称{得到;放;}publicvoidSetName(stringname){Name=name;}publicstringGetName(){返回名称;我在下面的测试类中测试了null传播的能力。公共类程序{publicstaticvoidMain(string[]args){Personperson=newPerson("JoeBloggs",DateTime.Parse("01/01/1991"));//此行不起作用-请参阅下面记录的错误person?.Name="JohnSmith";person?.SetName("JohnSmith");stringname=person?.Name;}}赋值的左侧必须是变量、属性或索引器。您可能会注意到通过调用SetName(...)设置名称的Java方法有效,您可能还会注意到获取null传播属性的值也有效。让我们看看从这段代码生成的C#:publicstaticvoidMain(string[]args){Personperson=newPerson("JoeBloggs",DateTime.Parse("01/01/1991"));if(person!=null){person.SetName("JohnSmith");}stringarg_33_0=(person!=null)?人名:空;请注意,当针对SetName方法使用时,null传播转换为直接的if语句,并且在对Name属性使用getter时,使用三元运算符获取Name或null的值。我在这里注意到的一件事是使用if语句和使用三元运算符之间的行为差??异:使用setter时,使用if语句有效,而使用三元运算符则无效。publicstaticvoidMain(string[]args){Personperson=null;if(person!=null){person.Name="JohnSmith";}person.Name=(person!=null)?“约翰·史密斯”:空;}在此示例中,我使用if语句和三元运算符来检查person是否为null,然后尝试分配给它的Name属性。if语句按预期工作;正如预期的那样,使用三元运算符的语句失败,并且您调用的对象为空。在我看来,限制来自于C#6.0将null传播转换为if语句或三元表达式的能力。如果它被设计为仅使用if语句,则属性分配将通过null传播进行。到目前为止,我还没有看到令人信服的论据为什么这不可能,所以我仍在寻找答案!你不是唯一一个!SLaks问这个问题为什么我不能这样写代码?Process.GetProcessById(2)?.Exited+=delegate{};之后只是“按设计”关闭?.运算符从不产生左值,所以这是设计使然。有人评论说这对属性设置器和事件处理程序都有好处也许可以在请求中添加一个属性设置器:Object?.Prop=false;它作为C#7的功能请求重新打开。您不能以这种方式使用空传播运算符。该运算符允许在计算表达式时传播空值。它不能像错误提示的那样用作赋值的目标。您需要坚持使用普通的旧空检查:if(a!=null){a.Value=someValue;尝试一下...使用系统;namespaceTestCon{classProgram{publicstaticvoidMain(){Personperson=null;//Personperson=newPerson(){Name="Jack"};//使用“if”空检查。if(person!=null){Console.WriteLine(person.Name);person.Name="简";Console.WriteLine(person.Name);}//使用三元空检查。字符串参数=(person!=null)?person.Name="John":arg=null;//还记得“?”之后的第一条语句吗?为真时会发生什么。“:”后为假。(只说“john”是不够的)//Console.WriteLine(person.Name);if(arg==null){Console.WriteLine("arg为null");}Console.WriteLine("按任意键退出。");控制台.ReadKey();}}publicclassPerson{publicstringName{get;放;以上就是C#学习教程:C#6.0Null传播运算符和属性赋值分享的全部内容,如果对你有用还需要进一步了解C#学习教程,希望大家多多关注.本文收集自网络,不代表立场。如果涉及及侵权请点击维权联系管理员删除如需转载请注明出处: