Код IL не отражает C # using
Производительность во время исполнения
Есть ли польза от использования
директивы, используемые таким образом в
вложенные пространства имен? типа памяти
управление или JIT-компилятор?
Поскольку вы спрашиваете о производительности во время выполнения, рассмотрим, что происходит под исходным кодом.
Если вы посмотрите на скомпилированный код IL с помощью инструмента Microsoft IL Diassembler (как мы делаем здесь), вы увидите, что все имена классов полностью определены, независимо от того, как программист использовал 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
s и namespace
s в исходном коде, может быть больше или меньше ключевых слов, которые можно найти вокруг. Компилятор должен видеть их все и обрабатывать их все, но в целом производительность компиляции будет незначительной для чего-то такого тривиального по сравнению со всеми вещами, которые компилятор должен сделать для создания готового продукта.
Преимущества времени проектирования
пространства имен - это организационная техника, а using
- это способ управления ими на уровне исходного кода (и указания компилятору, как вы их используете, чтобы он мог соответствующим образом скомпилировать программу). Когда источник C # указывает using System.Web.UI;
, ничего не импортируется, и размер файла не увеличивается (поскольку на сборку уже ссылаются); вместо этого using
просто применяет более короткий синтаксис к содержимому этого пространства имен изнутри области, в которой используется using
, будь то во всей области файла или объявленной области пространства имен внутри файл.
Преимущество для программиста заключается в уменьшении неоднозначных конфликтов имен классов между несколькими пространствами имен using
s, если они используются разумно.
Организация пространств имен исходного кода по-разному представлена в скомпилированном коде IL (как видно из приведенного выше примера).