使用String.ToUpperInvariant()对字符串进行规范化

Kev*_*cht 10 c# sql-server asp.net code-analysis asp.net-membership

我目前在SQL Server数据库中以小写形式存储规范化版本的字符串.例如,在我的Users表中,我有一个UserName和一个LoweredUserName字段.根据上下文,我使用T-SQL的LOWER()函数或C#的String.ToLower()方法生成用户名的小写版本以填充LoweredUserName字段.根据Microsoft的指南Visual Studio的代码分析规则CA1308,我应该使用C#的String.ToUpperInvariant()而不是ToLower().根据微软的说法,这既是性能问题也是全球化问题:转换为大写是安全的,而转换为小写可能会导致信息丢失(例如,土耳其语'I'问题).

如果我转而使用ToUpperInvariant进行字符串规范化,我也必须更改我的数据库模式,因为我的模式基于Microsoft的ASP.NET成员资格框架(请参阅此相关问题),该模式将字符串规范化为小写.

微软是不是通过告诉我们在C#中使用大写规范化而自相矛盾,而它在Membership表和程序中自己的代码是使用小写规范化吗?我应该将所有内容切换到大写规范化,还是继续使用小写归一化?

Jos*_*rke 7

根据CA1308,这样做的原因是一些字符不能从大写到小写的往返转换.重要的是你总是向一个方向移动,所以如果你的标准总是移到小写,那么就没有理由改变它.

  • 我喜欢这种方法.如果从头开始,遵循推荐的标准始终是最好的做法,因为没有其他动机可以做到,但是在进行现有维护时,通常只需要切换,因为它是这样说的.您需要有令人信服的证据证明您的项目将在开始进行此类改革之前从变更中受益 - 也许当您开始处理土耳其语并遇到问题时? (4认同)

And*_*are 4

回答你的第一个问题,是的,微软有点不一致。要回答您的第二个问题,在您确认这会导致应用程序出现瓶颈之前,请勿切换任何内容。

想想你可以在你的项目上取得多少进展,而不是浪费时间切换一切。您的开发时间比您从此类更改中获得的节省更有价值。

记住:

过早的优化是编程中万恶(或至少是大部分)的根源。——唐纳德·高德纳

  • @Kevin,土耳其/阿塞拜疆语无点 I 问题仍然是一个特殊情况,无论使用哪种方法(它们将大写的 i 改为 ï 和 ı 改为 I),尽管小写对于 SS 来说是不明确的(应该是 ss 还是 ß),但这也是不完美的(有些拼字法仍为大写 ß 至 SZ)。不过还是比较好。更好的方法是使用 Unicode 大小写折叠规则以及 i 和 ı 的突厥语开关,但它仍然不完美,只能针对每个区域设置:( (5认同)