12

我目前在我的 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 Membership框架(请参阅此相关问题),它将字符串规范化为小写。

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

4

3 回答 3

9

根据CA1308,这样做的原因是某些字符无法从大写转换为小写。重要的是你总是朝着一个方向移动,所以如果你的标准是总是移动到小写,那么没有理由改变它。

于 2009-04-21T17:44:09.307 回答
4

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

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

记住:

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

于 2009-04-21T17:38:03.457 回答
-2

继续使用小写规范化。只有在出现大问题时才进行更改以符合 Microsoft 标准。

这是不幸的,但值得。可悲的是,微软的“标准”往往没有得到很好的考虑,而且有些不一致。他们的经验表明,除非有令人信服的理由,否则最好在有效的同时坚持有效的方法。请注意,这通常不适用于非 Microsoft 技术;但微软“标准”的随意性使得它们值得回避。

编辑:我应该在这里澄清一下;从长期经验来看,我对微软的评价很低。他们的标准。正如评论中所指出的,我没有特别提到“除微软之外的其他所有人”。这只是来自我的个人经验。您的里程可能会有很大差异。这个答案应该被认为只是我的意见。很抱歉没有在前面说得更清楚。

于 2009-04-21T17:44:14.783 回答