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

c#7.0-OpenSystem.Type分享

时间:2023-04-10 16:51:35 C#

c#7.0:OpenSystem.Type没有现有的问题可以回答这个问题。在c#7中,我可以直接在System.Type上切换吗?当我尝试:switch(Type){casetypeof(int):break;它告诉我typeof(int)需要是一个常量表达式。是否有一些合成糖可以让我避免casenameof(int):并直接比较相同的类型?由于名称空间的原因,case语句中的nameof(T)不太正确。因此,虽然名称冲突可能不适用于int,但它适用于其他比较。换句话说,我试图比这更直接:switch(Type.Name){casenameof(Int32):casenameof(Decimal):this.value=Math.Max(Math.Min(0,Maximum),最低限度);//强制最小中断;(已经链接的)新模式匹配功能允许这样做。通常,您打开一个值:switch(this.value){caseintintValue:this.value=Math.Max(Math.Min(intValue,Maximum),Minimum);休息;casedecimaldecimalValue:this.value=Math.Max(Math.Min(decimalValue,Maximum),Minimum);休息;但是你可以用它来解包一个类型,如果你只有一个:switch(type){Math.Max(Math.Min(this.value,Maximum),Minimum);休息;请注意,这不是函数的用途,它变得不如传统的if...elseif...elseif...else链,而传统链无论如何都是它编译的结果。我不推荐使用这样的模式匹配。从Paulustrious的想法开始,开启一个常量,但以最易读为目标:Typetype=GetMyType();switch(true){casebool_whentype==typeof(int):break;casebool_whentype==typeof(double):break;casebool_whentype==typeof(string):break;默认值:中断;}可读性是主观的。很久以前我在VB中做过类似的事情,所以我习惯了这种形式(但是bool_在VB中不需要所以它不存在)。不幸的是bool_在c#中是必需的。我使用的是c#7.0,我认为切换常量在早期的编译器中可能不受支持,但我不确定,所以如果你愿意,请尝试一下。我认为S/O代码格式化程序还不知道什么时候发生,这很有趣。当您需要案例变量时,您当然不想这样做,比如子类化。但对于任意布尔表达式,它更适合,例如:switch(true){casebool_whenextruder.Temperature300:HomeYAxis();休息;默认值:StartPrintJob();休息;有些人会争辩说这比如果更好。.else更糟。我唯一能说的是switch强制执行一条路径并且不可能破坏switch语句本身,但是可以省略else并无意中将if..else分成多个语句,可能会执行两个“分支”事故。开启Type其实只是一个随意的开关,因为我们真正开启的是变量的属性。除非并且直到我们可以做casetypeof(int)(对于不是常量表达式的情况),如果我们不想使用字符串常量,在类型名称的情况下,我们有这样的东西,而不是在框架。我找到了一个简单有效的方法。它需要C#V7才能运行。switch("")表示所有情况都会满足when子句。它使用when子句来查看类型。列表参数=newList();//newActionparameters=newList{newAction(()=>parameters.Count.ToString()),(double)3.14159,(int)42,"M-Stringtheory",newSystem.Text.StringBuilder("这是一个stringBuilder"),null,};字符串parmStrings=string.Empty;整数指数=-1;foreach(参数中的对象参数){index++;输入type=param?.GetType()??类型(ArgumentNullException);switch(""){casestringanyNamewhentype==typeof(Action):parmStrings=$"{parmStrings}{(paramasAction).ToString()}";休息;casestringegStringBuilderwhentype==typeof(System.Text.StringBuilder):parmStrings=$"{parmStrings}{(paramasSystem.Text.StringBuilder)},";休息;casestringegIntwhentype==typeof(int):parmStrings=$"{parmStrings}{param.ToString()},";休息;casestringegDoublewhentype==typeof(double):parmStrings=$"{parmStrings}{param.ToString()},";休息;case字符串egString当类型==typeof(string):parmStrings=$"{parmStrings}{param},";休息;casestringegNullwhentype==typeof(ArgumentNullException):parmStrings=$"{parmStrings}parameter[{index}]isnull";休息;默认值:抛出新的System.InvalidOperationException();};这使得parmStrings包含...System.Action3.14159,42,M-Stringtheory,ThisisastringBuilder,parameter[5]isnullHereisanalternative,whichdoesnotcompileduetomissingclasses:以上是C#学习教程:c#7.0:打开System.Type分享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——bool?runOnUI=queuedAction.RunOnUI;//N=null,T=trueF=FalseboolisOnUI=Statics.CoreDispatcher.HasThreadAccess;boolisFF=queuedAction.IsFireAndForget;//只是让switch语句更容易阅读if(false==queuedAction.IsFireAndForget)IsOtherTaskRunning=true;/*在下面的case语句中,字符串名称类似于noFF_TN*编译器忽略字符串名称。我在这里使用它们来表示*case语句中的逻辑:(FF=FireAndForget,T=true,F=false,N=null,*表示“随便”)**isFF_**=FireAndForgetQueuedAction*noFF_**=不是FireAndForget所以等待任务完成(而不是完成)*****_T*=我们已经在UI线程上*****_F*=我们不在UI线程上*****_*T=在UI线程上运行。*****_*F=不要在UI线程上运行*****_*N=不关心所以在当前线程上运行**最后一个字符是“布尔值?”代表RunOnUI。它有*三个值,每个值都有不同的含义*/boolisTask;switch("ignore"){/*在当前线程上将其作为操作(而非任务)运行*/casestringnoFF_TTwhen!isFF&&isOnUI&&runOnUI==true:casestringisFF_TNwhenisFF&&isOnUI&&!runOnUI==null:casestringisFF_FNwhenisFF&&!isOnUI&&runOnUI==null:casestringisFF_TTwhenisFF&&isOnUI&&runOnUI==true:casestringisFF_FFwhenisFF&&!isOnUI&&runOnUI==false:isTask=false;queuedAction.ActionQA(queuedAct离子);//作为一个动作运行,而不是作为一个任务中断;/*创建一个任务,启动它*/casestringisFF_TFwhenisFF&&isOnUI==true&&runOnUI==false:casestringnoFF_TNwhen!isFF&&isOnUI==true&&runOnUI==null://queuedAction.ActionQA(queuedAction),queuedAction,cancellationTokenSource.Token).Start();休息;/*在UI上运行,不要等待*/casestringisFF_FTwhenisFF&&!isOnUI&&runOnUI==true:isTask=true;Statics.RunOnUI(()=>queuedAction.ActionQA(queuedAction),asTaskAlways:true);休息;/*在UI上作为任务运行并等待*/casestringnoFF_FTwhen!isFF&&!isOnUI&&runOnUI==true:isTask=true;Statics.RunOnUI(()=>queuedAction.ActionQA(queuedAction),asTaskAlways:true);休息;默认值:抛出新的LogicException(“未知案例”);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: