string vs System.String,int vs System.Int32:另一个Alias vs Type Name问题

时间:2010-10-01 09:54:52

标签: c# .net code-conversion

我经常看到源代码,其中language的关键字被完整的类型名称替换: System.StringSystem.Int32System.GUID

此外,执行此操作的人在任何地方都会写出完整的类型名称,这使得源代码充满了这样的声明:

System.Collections.Generic.List<System.Reflection.PropertyInfo> list = System.Collections.Generic.List<System.Reflection.PropertyInfo>(newSystem.Reflection.PropertyInfo[] { ... });

当我问他们为什么这样做时,我得到了广泛的答案:“这有助于我避免类型名称冲突”,“它看起来更专业”,“我的VS插件自动为我做”等。< / p>

据我所知,如果您在整个源代码文件中使用类型一次,有时编写完整类型名称可以帮助您避免编写不必要的using。有时您需要明确声明一个类型,一个很好的例子是线程Timer和WinForms Timer

但是如果你完整的数据库调用来源,你仍然写System.Data.SqlClient.SqlCommand而不是'SqlCommand',对我来说这看起来有点奇怪。

你怎么看?我是对的还是我只是不明白?

谢谢!

P.S。另一种现象是写if (0 != variable)而不是if (variable != 0)

7 个答案:

答案 0 :(得分:6)

if (0 == variable)是一个C ++约定,用于防止意外编写if (variable = 0),这在C ++中是有效的,但不能达到预期效果。它在C#中完全不必要,因为错误的版本无法编译,所以你应该使用其他版本,因为它读得更好。

就个人而言,我喜欢尽可能少地写作,所以除非有命名空间冲突,否则我永远不会完全符合条件。

对于string vs String,我总是使用别名(string / int)而不是完整的类名,但它纯粹是一种惯例 - 有没有运行时差异。

答案 1 :(得分:2)

我坚决反对“它看起来更专业”,坦白说它看起来与我相反。

也就是说,如果我要在整个源文件中使用命名空间的单个成员,我可能会在那里使用全名而不是using

支持0 != x超过x != 0等确实有一些优势,取决于等于和其他一些事情的覆盖。在其他一些语言中更常见,因此可能是宿醉。特别常见的是人们倾向于首先将null放在首位,因为这种方式不太可能变为将null传递给相等覆盖(同样,在其他语言中更常见的是真正的问题)。它也可以避免由于拼写错误而意外分配,但在C#中这很少是一个问题(除非您使用的类型是bool)。

答案 2 :(得分:1)

这有点主观,但除非您的编码标准另有说明,否则我认为删除命名空间总是更好,因为它不那么宽松,便于阅读。如果存在名称空间冲突,请使用较短的别名,这意味着什么。

关于你的最后一点,如果你比较name.Equals(“Paul”)和“Paul”.Equals(name)。除非name为null,否则它们都会做同样的事情。在这种情况下,第一个失败,出现空异常,而第二个(正确?)返回false。

答案 3 :(得分:1)

对于原始数据类型:此处有重复的问题 - C#, int or Int32? Should I care?

对于非原始数据类型:给出的答案是有效的,尤其是“它有助于避免类型名称冲突”

对于if (0 != variable):变量是要在表达式中进行比较的主题,它应该先行。所以,我更喜欢if (variable != 0)

答案 4 :(得分:1)

我没有发现任何令人信服的理由。添加using语句更好。

两个小例外:

  • 在生成的代码中,您可能会看到冗余的名称空间前缀,但这没关系,因为此代码不会缩进以进行编辑。
  • 有时,当依赖于32位的类型时,显式写Int32是有帮助的。

答案 5 :(得分:1)

使代码尽可能可读!另见:http://en.wikipedia.org/wiki/KISS_principle

“它看起来很专业”是一个非常糟糕的论点。

顺便说一句,如果您的代码中充满了SQL语句,那么您可能还想重构它。

答案 6 :(得分:1)

关于string vs String。我尝试使用string,就像在任何编程语言中一样使用字符串。但是当它是一个对象(或者我指的是String类)时,我尝试使用String