是的,我通常使用'using'指令,如下所示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AwesomeLib
{
//awesome award winning class declarations making use of Linq
}
我最近看过像
这样的例子using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AwesomeLib
{
//awesome award winning class declarations making use of Linq
namespace DataLibrary
{
using System.Data;
//Data access layers and whatnot
}
}
当然,我知道我可以将USING放在我的命名空间声明中。如果您的命名空间位于同一个根目录(它们是有组织的),这样的事情对我来说是有意义的。
System;
namespace 1 {}
namespace 2
{
System.data;
}
但嵌套命名空间呢?就个人而言,我会将所有USING声明留在顶部,您可以轻松找到它们。相反,看起来它们遍布源文件。
在嵌套命名空间中以这种方式使用的USING指令是否有益处?比如内存管理还是JIT编译器?
答案 0 :(得分:13)
using
运行时效果
使用是否有益 以这种方式使用的指令 嵌套命名空间? 如记忆 管理或JIT编译器?
因为您询问的是运行时性能,所以请看一下源代码下面发生的事情。
如果你用Microsoft's IL Diassembler tool查看已编译的IL代码(正如我们在这里所做的那样),无论程序员如何使用using
,你都会看到所有的类名都是完全合格的。源代码。
在下面编译的IL代码示例中,虽然using
位于原始C#源代码文件中,但没有看到“快捷方式”机制。例如,IL描述了一个长extends [System.Web]System.Web.UI.Page
,而C#将使用: Page
和using System.Web.UI;
(两个单独的语句)。
// ***** Compiled MSIL CODE ****
// Notice all fully qualified classes throughout.
//
.class public auto ansi beforefieldinit WebApplication1.process
extends [System.Web]System.Web.UI.Page
{
.field family class [System.Web]System.Web.UI.HtmlControls.HtmlForm form1
.method family hidebysig instance void
Page_Load(object sender,
class [mscorlib]System.EventArgs e) cil managed
{
// Code size 95 (0x5f)
.maxstack 4
.locals init ([0] string strName,
[1] string strTime)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: call instance class [System.Web]System.Web.HttpRequest [System.Web]System.Web.UI.Page::get_Request()
IL_0007: ldstr "name"
IL_000c: callvirt instance string [System.Web]System.Web.HttpRequest::get_Item(string)
在编译的IL中,所有类都是完全限定的。
这意味着在运行时基于设计时using
语句没有性能优势或缺点。
编译时间
根据您对源代码中using
和namespace
的分散情况,可能会有更多或更少的关键字悬而未决。编译器必须全部查看它们并对它们进行处理,但总体而言,编译性能对于这个微不足道的事情来说可以忽略不计,与编译器制作成品所需要做的事情相比。
设计时间优势
命名空间是一种组织技术,using
是一种在源代码级别管理它们的方式(并指示编译器如何使用它们,以便它可以相应地编译程序)。当C#source指定using System.Web.UI;
时,不会导入任何内容,并且文件大小不会变大(因为已经引用了程序集);相反, using
只是在使用using
的范围内对该命名空间的内容实施更短的语法,无论是在整个文件范围内还是在文件中声明了命名空间范围。
程序员的好处是减少多个命名空间using
之间的模糊类名冲突,如果它们被明智地使用的话。
源代码命名空间的组织在编译的IL代码中表示不同(如上例所示)。
答案 1 :(得分:3)
当您在不需要System.Data
的范围内时,如果智能感知不会触发System.Data
成员只是为了弄乱您正在寻找的其他内容,那就更好了
关于某些性能问题 - 我认为您更喜欢使用它并不重要...
答案 2 :(得分:3)
生成的中间语言没有任何好处。由于CIL是JIT编译器的输入,因此它也不受影响。
由于您正在谈论最佳实践:最佳做法是每个文件只有一个类,因此您只有一个名称空间。
答案 3 :(得分:1)
- 在命名空间中放置using-alias指令可以消除编译器在冲突类型之间的混淆。
- 在单个文件中定义多个名称空间时,在名称空间元素中放置using指令可用作范围引用和别名。
醇>
答案 4 :(得分:0)
using子句仅有助于使代码更易于维护,它们不会影响代码AFAIK的性能。
这同样适用于命名空间 - 您可以将所有类放在全局命名空间中,并将它们命名为Class1,Class2等,并且您的代码也可以执行。但维持这将是一场噩梦!
所以他们都在那里帮助你,编码员,他们不会影响编译的代码。