C#字符串在switch case与if比较时是否需要用ToLower()/ToUpper()转大小写?
代码合理性分析
你给出的代码首先存在两处可直接导致编译失败的语法问题:
- 方法定义缺少返回值类型,无返回值需加
void修饰,即public void somefun(Classabc clsabc, string emptype, string id) - switch分支的
case :"AnyInput":多了一个多余的冒号,修正后应为case "AnyInput":
针对你关心的大小写转换问题,分两种场景判断:
不需要转大小写的场景
如果emptype的取值完全是你内部系统可控的,比如是代码中定义的常量、枚举转换得到的字符串、内部模块间约定好固定大小写的传参,那你的判断逻辑完全合理,不需要额外调用ToLower()/ToUpper():
- 这种场景下固定大小写的匹配性能更高,没有多余的字符串转换开销
- 完全不存在匹配失败的风险,你的理解是正确的:既然能直接用常量做case匹配,就没必要加多余的转换逻辑,也不违反任何编程规则。
需要处理大小写的场景
如果emptype来自不可控的外部输入,比如用户输入的内容、第三方接口返回、前端用户提交的参数,那你当前的写法存在匹配失败的风险:比如外部传入anyinput/ANYINPUT/Anyinput都会匹配不上对应分支。
这种场景下也不推荐使用ToLower()/ToUpper()做转换,原因有两个:
- 不同语言的区域性设置会导致非ASCII字符的大小写转换结果不符合预期,比如土耳其语中小写
i转大写会变成İ而非普通的I,很容易出现匹配bug - 额外的字符串转换会生成新的字符串对象,带来不必要的性能开销
更推荐的写法是用内置的不区分大小写比较逻辑:
- if判断写法:
if(emptype.Equals("AnyInput", StringComparison.OrdinalIgnoreCase)) { // 逻辑代码 }
- switch写法(C# 7.0及以上版本支持):
switch(emptype) { case string s when s.Equals("AnyInput", StringComparison.OrdinalIgnoreCase): // 逻辑代码 break; case string s when s.Equals("StringInput", StringComparison.OrdinalIgnoreCase): // 逻辑代码 break; }
内容的提问来源于stack exchange,提问作者rajnish kumar
相关产品推荐
相关产品推荐

