我应该同意禁止我的C#项目中的“使用”指令吗?

时间:2008-10-18 09:39:12

标签: c# .net

我的同事坚持在代码中明确指定命名空间而不是使用using directive。换句话说,每次在代码中出现此类型时,他都希望为每种类型使用完全限定名称。像

这样的东西
public class MyClass
{
    public static void Main()
    {
        System.Console.WriteLine("Foo");
    }
}

而不是:

using System;
public class MyClass
{
    public static void Main()
    {
        Console.WriteLine("Foo");
    }
}

你可以想象后果。

他给的职业选手:

  1. 将代码复制并粘贴到其他源文件中更简单。
  2. 它更具可读性(您可以立即看到名称空间)。
  3. 我的缺点:

    1. 我必须写更多
    2. 代码的可读性较差(我猜这是一个非常不可信的代码)
    3. 没有人这样做!
    4. 您如何看待这个?

25 个答案:

答案 0 :(得分:65)

如果你需要复制和粘贴代码,以便实际拥有完全合格的类型,那么你就会遇到更大的问题。

另外,您是否计划记住每个类所在的命名空间,以便能够完全限定它?

答案 1 :(得分:48)

对于稍微不同的答案:LINQ。

扩展方法只能通过“using”语句获得。因此,查询语法或流畅的界面使用正确的“使用”语句。

即使没有LINQ,我也会说使用“使用”......推断你能用更少的字符理解的越多越好。有些名称空间很深,但没有为代码添加任何值。

还有其他扩展方法(不仅仅是LINQ)会受到同样的影响;当然,你可以使用静态类,但流畅的界面更具表现力。

答案 2 :(得分:37)

我怎么看待这个?

我认为一个想出这样一个想法的人,以及以他的方式证明这一点的人,很可能会对C#语言和.NET开发产生许多其他根本性的误解。

答案 3 :(得分:23)

当你的同事说“复制粘贴代码”时,他失去了所有可信度。

答案 4 :(得分:19)

我发现没有使用“using”指令的最大问题不在于实例化和类的定义。它是将值传递给在命名空间中定义的函数。比较这两段代码(VB.Net,因为这就是我所知道的,但是你得到了图片)。

Module Module1

    Sub Main()
        Dim Rgx As New System.Text.RegularExpressions.Regex("Pattern", _
            System.Text.RegularExpressions.RegexOptions.IgnoreCase _
            Or System.Text.RegularExpressions.RegexOptions.Singleline _
            Or System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace)


        For Each result As System.Text.RegularExpressions.Match In Rgx.Matches("Find pattern here.")
            'Do Something
        Next
    End Sub

End Module

这个

Imports System.Text.RegularExpressions

Module Module1

    Sub Main()
        Dim Rgx As New Regex("Pattern", _
            RegexOptions.IgnoreCase _
            Or RegexOptions.Singleline _
            Or RegexOptions.IgnorePatternWhitespace)


        For Each result As Match In Rgx.Matches("Find pattern here.")
            'Do Something
        Next
    End Sub

End Module

在这样的情况下,使用大量枚举,以及在for循环中内联声明变量,减少范围,在vb.Net的情况下不使用“using”或“imports”,可能导致非常糟糕的可读性。

答案 5 :(得分:9)

通过复制和粘贴更容易移动代码只是non sequitur,很可能是潜在危险做法的警告信号。代码的结构和易读性不应该由易于编辑决定。

如果有的话,它会使代码的可读性和特定性降低 - 我个人对标准对象所处的位置并不感兴趣,它类似于以完整的名字对你的同事说话,并以工作场所的街道地址为前缀。

然而,有时候,它偶尔会使代码更具可读性,因此硬性规则和快速规则不适用,只是常识。

答案 6 :(得分:6)

因为我们在C#中有一个工具用于自动设置using语句,按Ctrl + dot - 我看不出有任何理由不使用它。另一个“酷”的事情是:

想想你有两个命名空间:

ConsoleNamespace1

ConsoleNamespace2

两者都有一个Console类。现在,您可以使用一行代码更改对ConsoleNamespace2的所有引用 - 这很酷。

我的建议:如果可以,请使用using,如果必须,请使用{{1}}。我不认为完全一个,如果更容易阅读。了解你的框架,这永远不会成为问题。

答案 7 :(得分:4)

同样值得注意的是像ReSharper这样的工具(为什么你还没有使用它?)会自动为你添加适当的“使用”线。

答案 8 :(得分:3)

您使用“使用”的原因之一是它告诉任何人阅读源代码您的课程将要做的事情。例如,使用System.IO告诉读者您正在进行I / O操作。

答案 9 :(得分:1)

你也可以使用别名......:

using diagAlias = System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            diagAlias.Debug.Write("");
        }
    }
}

答案 10 :(得分:1)

我已经编码了25年。使用是必不可少的,应始终使用,是一种很好的编码实践。但是,任何优秀的开发人员都应该有一个代码库。包含完全限定的命名空间时,共享代码片段会更容易。

评论COPY& PASTE是一种糟糕的技术,通常来自那些没有花时间构建强大的代码存储库并且没有停下来真正理解通用代码是经过测试的代码的开发人员。完全限定的命名空间我认为这是代码存储库中的必需品,或者你试图确定命名空间来自何处。

答案 11 :(得分:1)

如果您反复复制和粘贴代码,那么是否指向创建要包含在每个项目中的标准DLL?

我曾经使用过这两种方法的项目,并且不得不说“使用”语句对我有意义,它减少了代码,使其更具可读性,编译器最终会优化右边的代码办法。你可能遇到问题的唯一一次是你有两个具有相同名称的命名空间的类,那么你必须使用完全限定的名称......但那是例外而不是规则。

答案 12 :(得分:1)

“你的同事说”复制粘贴代码“的那一刻,他失去了所有可信度。”同上。

“德米特法则说......”同上

...我补充道。这很荒谬,不使用using语句。得到ReSharper,找到一些方法来教这个人如何做,如果它似乎没有生效 - 根据给出的理由,是时候开始寻找一个不同的工作。只是与不使用使用语句这样的概念相关的相关性是可怕的。如果这是规则之一,那么你将被困16小时工作。没有人知道你接下来将面临的常识和逻辑的其他类型的侮辱。

说真的,甚至不应该使用像ReSharper这样的工具。浪费金钱,购买ReSharper,进行代码清理,然后重新制作可用的软件。 :)那是我的2美分。

答案 13 :(得分:1)

我认为使用Visual Studio中的IntelliSense功能并使用某些第三方产品(如ReSharper),我们不再关心是否使我们的代码完全合格。复制和粘贴代码时,解析命名空间不再耗费时间。

答案 14 :(得分:1)

在您的计算机上安装ReSharper。坐下来,让它引导你的同事正义。说真的,有更大的战斗,但如果需要超过两分钟的时间来尝试教育,这是一种可以避免的编码器。

答案 15 :(得分:1)

我的一般规则是,如果我要使用来自特定命名空间的项目多次,它会获得一个using指令。但是我不想使用指令来混淆文件的顶部,我只使用一次或两次。

答案 16 :(得分:1)

哦,小伙子。一步可能是教你的同事关于ctrl。它将自动为您使用语句插入。

答案 17 :(得分:0)

你真的想以这种方式维护代码吗?即使使用intellisense,所有打字也不会有效。

答案 18 :(得分:0)

而不是'copy-n-paste',我称之为'copy-n-rape',因为代码在通过此过程时被滥用了99.9%。那么,这就是我同事对这种方法的第一理由的答案。

另外,像Resharper这样的工具会在你将代码添加到你的代码中时在顶部添加using语句(所以即使你像'copy-n-rape'代码一样,你可以轻松地这样做)

除了个人偏好之外,我认为你的理由比他更有价值,所以即使假设它们都是有效点,我仍然建议在顶部写下使用陈述。我不会把它变成'禁令',因为我认为编码标准是指导而不是规则。根据你的团队规模,可能很难强制执行这样的事情(或缩进或缩进样式等多少空间)。

使其成为一个准则,以便所有其他开发人员可以随意使用较短版本重新命名完全限定名称,并且随着时间的推移,代码库将符合指南。留意那些花时间做工作的人,简单地将一种风格的所有事件都改变为另一种风格 - 因为如果你没有做任何其他事情,那就不会很有效率。

答案 19 :(得分:0)

我建议反对你同事的提议。对我来说,如果你没有一个很长的命名空间,那么阅读代码会容易得多。想象一下:

Namespace1.Namespace2.Namespace3.Type var = new Namespace1.Namespace2.Namespace3.Type(par1, par2, par3);

而不是:

Type var = new Type(par1, par2, par3);

关于复制粘贴 - 你会有Shift + Alt + F10,它会添加命名空间,所以它应该不是问题。

答案 20 :(得分:0)

他可能会对某些事情有所了解。例如,在我工作的公司,我们有很多代码生成类,所以我们所有代码生成的类都使用类的完全限定名称,以避免任何潜在的冲突。

使用我们拥有的所有标准.NET类,我们只使用using语句。

答案 21 :(得分:0)

在像.NET这样的系统中,命名空间中有类型,你必须做出决定:是名称的命名空间部分,还是类型的组织工具?

有些系统会选择第一个选项。然后,您的using指令可以缩短您最常使用的名称。

在.NET中,它是后者。例如,考虑System.Xml.Serialization.XmlSerializationReader。观察命名空间和类型之间的重复。那是因为在这个模型中,类型名称必须是唯一的,甚至跨名称空间。

如果我没记错的话,你可以在这里找到CLR团队所描述的内容:http://blogs.msdn.com/kcwalina/archive/2007/06/01/FDGLecture.aspx

  

将代码复制并粘贴到其他源文件中更简单。

是的,但如果您复制/粘贴了大量代码,那么您可能做错了。

  

它更具可读性(您可以立即看到命名空间)

查看命名空间并不重要,因为至少在您遵循Microsoft的指导原则时,类型名称已经是唯一的;命名空间并没有真正为您提供有用的信息。

答案 22 :(得分:0)

我是一个倾向于完全限定命名空间的人。当我使用我不熟悉/长时间没有使用的组件时,我会这样做。我帮助我记住该命名空间中的内容,以便下次我正在寻找它/相关课程。

这也有助于我知道我是否已经在项目中有适当的引用。就像我写出System.Web.UI但找不到Extensions那样我知道我忘了/谁设置了项目忘了放入ASP.NET AJAX引用。

我这样做的时间越来越少,因为我正在使用快捷方式来限定一个类(Ctrl +。)。如果您输入班级名称(正确套装)并按下该快捷键,您可以轻松完全质量/添加使用声明。

对于StringBuilder来说很棒,我似乎从来没有System.Text,所以我只输入StringBuilder - > Ctrl +。我们去了,我添加了使用。

答案 23 :(得分:0)

事实上,Visual Studio在几乎每个文件的顶部都包含了很多using语句这一事实,它提示using语句被认为是一种良好的做法吗?

答案 24 :(得分:0)

Law of Demeter表示您应该只使用一个点

  

对于许多使用点作为字段标识符的现代面向对象语言,法律可简单地称为“仅使用一个点”。也就是说,代码“a.b.Method()”打破了“a.Method()”所不具备的规律。

当然,这并不总是实用的。但长串的点分隔标识符违反了公认的惯例。

编辑:这个答案似乎有争议。我把Law of Demeter主要作为一种风格指南,这里的大多数回复似乎都同意限制点数是一个好主意。在我看来,jQuery(和JavaScript)会遇到可读性问题,部分原因是因为过多的点遍布任何非平凡的程序。