if语句中的赋值我有一个类Animal及其子类Dog。我经常发现自己在编写以下代码:if(animalisDog){Dogdog=animalasDog;狗.名字;...}对于变量Animal动物;.有没有一些语法允许我写这样的东西:if(Dogdog=animalasDog){dog.Name;...}下面的答案是几年前写的,并且一直在更新。从C#7开始,您可以使用模式匹配:if(animalisDogdog){//Usedoghere}请注意,dog仍在if语句后的范围内,但未显式分配。不,不。不过写起来更符合惯用语:Dogdog=animalasDog;if(dog!=null){//Usedog}鉴于“asifbyif”几乎总是以这种方式使用,因此有一个运算符可以做到这两部分更有意义。这目前不在C#6中,但如果实施模式匹配建议,则可能成为C#7的一部分。问题是您不能在if语句1的条件部分声明变量。我能想到的最接近的是://EVILEVILEVIL。不使用。for(Dogdog=animalasDog;dog!=null;dog=null){...}这太烦人了......(我刚刚试过了,它有效。但请不要那样做.哦,你可以用var声明dog。)当然你可以写一个扩展方法:publicstaticvoidAsIf(thisobjectvalue,Actionaction)whereT:class{Tt=valueasT;如果(t!=null){动作(t);}}然后使用:animal.AsIf(dog=>{//在这里使用dog});或者,您可以将两者结合起来:publicstaticvoidAsIf(thisobjectvalue,Actionaction)whereT:class{//EVILEVILEVILfor(vart=valueasT;t!=null;t=null){action(吨);您还可以使用不带lambda表达式的扩展方法来代替for循环:publicstaticIEnumerableAsOrEmpty(thisobjectvalue){Tt=valueasT;if(t!=null){yieldreturnt;}}then:foreach(Dogdoginanimal.AsOrEmpty()){//使用dog}1你可以在if语句中赋值,但我很少这样做。这与声明变量不同。虽然我在读取数据流时一段时间内这样做并不是特别不寻常。例如:串线;while((line=reader.ReadLine())!=null){...}这些天我通常更喜欢使用允许我使用foreach(stringlinein...)的包装器,但我将上面的内容视为非常惯用的模式。在一个条件下产生副作用通常是不好的,但替代方案通常涉及代码重复,当您了解模式时很容易做到这一点。失败时返回null。Dogdog=animalasDog;if(dog!=null){//dostuff}你可以给变量赋值,只要它已经存在。您还可以限定变量的范围,以允许稍后在同一方法中再次使用该变量名(如果这是一个问题)。publicvoidTest(){varanimals=newAnimal[]{newDog(),newDuck()};foreach(varanimalinanimals){{//假设publicclassAnimal{}publicclassDog:Animal{privatestring_name;publicstringName{get{return_name;}设置{_name=值;Console.WriteLine("名字现在是"+_name);}}}publicclassDuck:Animal{publicvoidFly(){Console.WriteLine("Flying");}}获取输出:NameisnowScopeyFlying测试中的变量赋值模式也用于从流中读取字节块,例如:intbytesRead=0;while((bytesRead=fs.Read(buffer,0,buffer.Length))>0){//...}但是,上面使用的变量范围的模式并不是特别常见的代码模式,如果我看到它到处使用,我会寻找一种方法来重构它。是否有一些语法允许我写这样的东西:if(Dogdog=animalasDog){...dog...}?可能会出现在C#6.0中。此功能称为“声明表达式”。有关详细信息,请参阅https://roslyn.codeplex.com/discussions/565640。建议的语法是:if((vari=oasint?)!=null){...i...}elseif((vars=oasstring)!=null){...s。..}elseif...更一般地说,提议的特征是局部变量声明可以用作表达式。这种if语法只是更一般性质的一个很好的结果。我发现自己经常编写和使用的一种扩展方法是publicstaticTResultIfNotNull(thisTobj,Funcfunc){if(obj!=null){returnfunc(obj);}返回默认值(TResult);在这种情况下可以使用哪种方式stringname=(animalasDog).IfNotNull(x=>x.Name);那么name如果是狗就是狗的名字,否则为null。*我不知道这是否有效。它从来都不是分析的瓶颈。反对这里的谷物,但也许你一开始就做错了。检查对象的类型几乎总是一种代码味道。在你的例子中,不是所有的动物都有名字吗?然后只调用Animal.name而不检查它是否是狗。或者,反转该方法,以便您调用Animal上的方法,该方法根据Animal的具体类型执行不同的操作。另请参阅:多态性。较短的语句vardog=animalasDogif(dog!=null)dog.Name...;这里有一些额外的脏代码(不像Jon的那么脏,但是:-))依赖于修改基类。我认为它抓住了意图,可能会遗漏这个:classAnimal{publicAnimal(){Name="animal";}publicListIfIs(){if(thisisT)returnnewList{this};否则返回新列表();}公共字符串名称;}classDog:Animal{publicDog(){Name="dog";}publicstringBark{get{返回“ruff”;}}}classProgram{staticvoidMain(string[]args){varanimal=newAnimal();foreach(Dogdoginanimal.IfIs()){Console.WriteLine(dog.Name);Console.WriteLine(dog.Bark);}控制台.ReadLine();如果多个as-ifs必须一个接一个地执行(并且不能使用多态性),请考虑使用SwitchOnType构造。问题(使用语法)不是赋值,因为C#中的赋值运算符是一个有效的表达式。相反,它是必需的语句,因为语句就是语句。如果我必须编写类似的代码,有时(取决于更大的上下文)我会编写这样的代码:Dogdog;if((dog=animalasDog)!=null){//usedog}上面的语法有优点(更接近要求的语法)因为:在if之外使用dog会导致编译错误,因为它没有赋值别处。(也就是说,不要在其他地方分配dog。)这种方法也可以很好地扩展到if/elseif/...(只要选择适当的分支就需要那么多;这就是我在这种形式下必须做的大案例为了写它。)避免重复is/as。(但它也是用Dogdog=...形式完成的。)与“惯用语”没有什么不同。(只是不要忘记:保持条件的形式一致并保持简单。)要真正将狗与世界其他地方隔离开来,您可以使用一个新块:{Dogdog=...;//或者按照上面的方法在`if`中赋值}Bite(dog);//哎呀!无法从上面的快乐编码访问狗。另一个带有扩展方法的EVIL解决方案:)publicclassTester{publicstaticvoidTest(){Animala=newAnimal();//什么都不打印foreach(Dogdina.Each()){Console.WriteLine(d.Name);}Dogdd=newDog();//打印狗IDforeach(Dogdogindd.Each()){Console.WriteLine(dog.ID);}}}publicclassAnimal{publicAnimal(){Console.WriteLine("Animalconstructed:"+this.ID);}私人字符串_id{得到;放;}publicstringID{get{return_id??(_id=Guid.NewGuid().ToString());}}publicboolIsAlive{get;放;}}publicclassDog:Animal{publicDog():base(){}publicstringName{get;放;}}publicstaticclassObjectExtensions{publicstaticIEnumerableEach(thisobjectSource)whereT:class{Tt=SourceasT;if(t==null)yieldbreak;收益回报t;我个人更喜欢干净的方式:Dogdog=animalasDog;if(dog!=null){//dostuff}if语句不允许,但for循环允许。For(Dogdog=animalasDog;dog!=null;dog=null){dog.Name;...}如果它的工作原理不是很明显,这里是对这个过程的逐步解释:...}}IDK如果这对任何人有帮助,但你总是可以尝试使用TryParse来分配你的变量。下面是一个例子:}else{Console.WriteLine("无法解析值");}控制台.ReadLine();}staticintAdd(intvalue1,intvalue2){returnvalue1+value2;}total变量将在if语句之前声明。我刚刚编写了if语句来创建一行看起来像您感兴趣的代码。它只是帮助压缩代码一点,我觉得它更具可读性,尤其是在嵌套赋值时:以上就是C#学习教程:if语句中的赋值的全部内容,如果对大家有用还需要了解更多关于C#希望大家多多关注教程---vardog=animalasDog;if(dog!=null){Console.WriteLine("ParentDogName="+dog.name);varpurebred=dog.Puppy作为纯种;if(purebred!=null){Console.WriteLine("PurebredPuppyName="+purebred.Name);}varmutt=dog.PuppyasMongrel;if(mutt!=null){Console.WriteLine("MongrelPuppyName="+mutt.Name);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
