C#:比组合StartsWith和两个toupper不变调用更好的方法
在我脑后的某个地方,一个微弱的声音告诉我“下面的C代码有味道” 常量C#:比组合StartsWith和两个toupper不变调用更好的方法,c#,C#,在我脑后的某个地方,一个微弱的声音告诉我“下面的C代码有味道” 常量stru ConnectionString也用于代码中的其他位置 如何去除气味?您可以使用获取StringComparisonenum值: keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.OrdinalIgnoreCase) // or use StringComparison.InvariantCultureIgnoreCase here
stru ConnectionString
也用于代码中的其他位置
如何去除气味?您可以使用获取StringComparison
enum值:
keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.OrdinalIgnoreCase) // or use StringComparison.InvariantCultureIgnoreCase here
有一个支持不区分大小写的匹配:
if (keyAttributeValue.StartsWith(STR_ConnectionString,
StringComparison.InvariantCultureIgnoreCase)
{
...
}
它还使您的代码更具可读性,因为它表达了您的意图:您真正想要的是不区分大小写的比较,这就是本文编写的内容。您并不真正想要“转换为大写的值的区分大小写的比较”。。。这正是您用来实现目标的变通方法。我已经做了一个扩展方法,在我的项目中使用StringComparison忽略case来处理这个问题
public static string StartsWithIgnoreCase(this string value, string startsWith)
{
return value.StartsWith(value, StringComparison.InvariantCultureIgnoreCase);
}
如果愿意,您可以添加空检查。如果因为您正在执行ToUpper而闻起来很难闻,那么字符串比较,可以使用startswith重载组合这些检查:
STR_ConnectionString..StartsWith(upperCaseConnectionString, StringComparison.CurrentCultureIgnoreCase);
然而,看起来您正在以自己的方式处理应用程序配置,这是您不应该做的。看总有
keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.InvariantCultureIgnoreCase)
但这不会像你所拥有的那么好。如果你需要每秒做上千次,坚持你所拥有的。如果不是,只需进行不区分大小写的匹配
也考虑
keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.OrdinalIgnoreCase)
如果代码中经常出现这种验证,那么就编写扩展方法。它闻起来好吗?还是闻起来很难闻?在我看来没问题:D+1@Shai我可能应该提到原始的代码库是.NET 1.1,但很快就会变成.NET 4,所以我在升级到.NET 4后就开始过载了。这是一种应用程序配置,但不完全是,我从一些几年前就应该大吃一惊的团队那里继承的代码:)你不想知道其余继承的代码是什么样子的。也许你会,但不是一下子。请放心,在接下来的几个月里,我将一步一步地完成主要的重构工作。我会选择这个解决方案。这个代码库使用的不是.NET 1.1 FW,但它很快就会成为.NET 4。-1您的扩展方法只是隐藏您正在使用的IgnoreCase类型。检查并了解差异,并在每种特定情况下加以考虑。@Protron我使用了
InvariantCulture
,因为OP使用了ToUpperInvariant
。你应该始终使用正确的文化。谢谢你的好链接。@cadrell0如果你不使用扩展方法,我应该说我认为你的答案是完全正确的(对于这个特殊情况)。但我认为把它放在一个扩展方法中是危险的,因为许多人会在不知道使用哪种文化的情况下重用它。因此,我更喜欢使用框架提供的StartsWith,而不使用扩展。
keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.OrdinalIgnoreCase)