C#:比组合StartsWith和两个toupper不变调用更好的方法

C#:比组合StartsWith和两个toupper不变调用更好的方法,c#,C#,在我脑后的某个地方,一个微弱的声音告诉我“下面的C代码有味道” 常量stru ConnectionString也用于代码中的其他位置 如何去除气味?您可以使用获取StringComparisonenum值: keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.OrdinalIgnoreCase) // or use StringComparison.InvariantCultureIgnoreCase here

在我脑后的某个地方,一个微弱的声音告诉我“下面的C代码有味道”

常量
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)