C# 为什么使用完全限定名?

C# 为什么使用完全限定名?,c#,.net,vb.net,namespaces,C#,.net,Vb.net,Namespaces,既然引入了关键字,为什么要使用why?为什么要使用完全限定名 var有效地减少了变量声明的类型。因此,可以保留完整的声明而不会使代码膨胀。这让我想知道,为什么您甚至想要声明名称空间用法 // A lot of typing, but unambiguous. System.Drawing.Point a = new System.Drawing.Point(); // using System.Drawing, Point possibly ambiguous. Point b = new P

既然引入了关键字,为什么要使用why?为什么要使用完全限定名

var
有效地减少了变量声明的类型。因此,可以保留完整的声明而不会使代码膨胀。这让我想知道,为什么您甚至想要声明
名称空间
用法

// A lot of typing, but unambiguous.
System.Drawing.Point a = new System.Drawing.Point();

// using System.Drawing, Point possibly ambiguous.
Point b = new Point();

// using System.Drawing, Point possibly ambiguous.
var c = new Point();

// Less typing, still unambiguous.
var d = new System.Drawing.Point();

这里的最佳实践是什么?

名称空间真正有用的原因只有几个:

  • 帮助区分具有相同名称的类
  • 帮助将项目“组织”成有意义的部分
  • 正如Oded提到的,这些原因本身就非常重要——虽然不常见,但歧义并非不可能,在这种情况下,使用名称空间是必要的

    了解有关名称空间的更多信息。

    使用名称空间
    1.定义范围的步骤
    2.在不同的命名空间/项目/程序集中区分相同的类名

    无论如何,var的使用都不会链接到名称空间。命名空间别名可以减少键入


    我想你的问题实际上是为什么要使用完全限定名?为什么不使用名称空间呢

    名称空间在任何
    面向对象
    语言中都非常重要。如果您有两个同名的类(在.NET framework中已经很常见),您应该如何区分它们?这就是名称空间的要点——如果在同一名称空间中有两个名称相同的类,则代码不会编译。(当然,除非是部分课程,这是一个完全不同的故事)

    在这种情况下,我经常遇到一个
    列表
    。我们在这里的一些项目中使用了
    NHibernate
    ,它有自己的
    列表
    。如果我正在实例化一个
    列表
    ,我不能只执行以下操作:

    var list = new List<string>();
    
    var list=newlist();
    
    。。因为编译器不知道我想要的是
    NHibernate.Mapping.List
    还是
    System.Collections.Generic.List


    var
    关键字对于
    类型推断非常有用,但是如果在另一端没有正确的
    使用
    语句或
    完全限定的
    名称,那么它就没有帮助了。

    这似乎不是关于名称空间,而是关于在代码内部使用静态类型。我听到的关于不使用
    var
    的主要论据扩展到当变量类型不明显时(通过浏览声明)。考虑下面的代码:

    var readyTasks = _config.GetTasks().Where(x => x.Ready);
    
    你到底怎么知道什么是
    readyTasks
    <考虑到
    Where()
    返回的内容,code>IEnumerable
    是给定的,但除此之外,从中获取类型的唯一方法是将鼠标悬停在
    var
    上,让Visual Studio为您查找。随着LINQ语句变长,枚举被插入逻辑结构(如
    foreach
    loops)中,这变得更加复杂,列表不断出现

    var
    (我就是其中之一)的支持者会反驳说,从长远来看,这是一件小事,可以减少
    var
    给你带来的麻烦。静态类型声明从来没有考虑过程序员的舒适度。它们首先是针对编译器的。因此,仅仅因为您已经习惯了这个工件,就保留它似乎没有意义。

    对于一次性测试应用程序(例如检查堆栈溢出答案),我不使用名称空间。至于其他的事,我愿意。这只是一个组织问题——如果您要重用代码,那么将其与您在同一上下文中也要重用的其他代码分开是很有帮助的。我的意思是,如果你正在使用LibraryX和LibraryY创建一个应用程序,在应用程序中区分它们是很有用的。例如,它们可能都使用相同的类名——如果不使用名称空间,这将使代码难看

    除此之外,如果您使用Visual Studio进行编码,不包含名称空间实际上需要做更多的工作—您必须修改项目,为其提供一个空的默认名称空间


    有关命名的信息,请参阅:

    重点是什么?如果存在歧义,代码将无法编译。。。只需使用
    子句,并在(通常很少)歧义情况下使用完全限定名…为什么不更进一步-为什么在2-3个字符足够像“pPx”和“s$e”的情况下使用“Point”和“Stream”这样的长名称(这样也可以在模糊处理程序上节省一大笔钱)。@Thomas,代码可能无法编译,但这并不能保证。@l33t,好吧,你能给我一个例子,说明一个歧义编译成功了吗?这是C语言中最重要的原则之一:编译器从不尝试猜测;如果有疑问,它将失败,并让您解决歧义。如果它成功了,那么你可以确定在当前范围内没有其他同名的符号。事实上,这是非常好的“东西”。我强烈反对这一点。上面的代码需要一个类型引用。有时,您必须在没有Visual Studio工作副本的情况下快速查看文本中的代码。并非总是可以使用“Hovering with var”。