#c#
#c#
Вопрос:
Например:
private void MethodName()
{
Using System.OI;
}
Мне нужна эта библиотека только в этом одном методе. Могу ли я как-нибудь это сделать?
Причина, по которой у меня ее нет, заключается в том, что она создает неоднозначные ссылки.
Комментарии:
1. Вам не нужно использовать
using
. Вы можете просто полностью определить символы из этого пространства имен:System.OI.Foo = new System.OI.Foo();
2. какова ваша мотивация, чтобы иметь возможность это сделать? например, вы пытаетесь контролировать потребление памяти? (если да, вы могли бы динамически загружать и выгружать библиотеку .dll) … если вы объясните свою цель, вы можете получить ответ, который вам нужен. Обратите внимание, что у каждого решения есть свои плюсы и минусы, например, если вы загружаете / выгружаете библиотеку несколько раз, вы можете получить нежелательный и невыносимый удар по производительности.
3. @gerryLowry Это не имеет никакого отношения к тому, находится ли библиотека классов в памяти. Это просто вопрос неоднозначных ссылок на типы. Например, если у него есть отдельная библиотека со своим собственным
File
типом (ситуация, с которой я столкнулся сам), то это может вызвать проблемы, не имея каких-либо средств устранения неоднозначности типа.4. @Servy упс, слепота с моей стороны; я пропустил последнее предложение Augs о неоднозначных ссылках. FWIW, комментарий Джона Сондерса выше, и вашего ответа FQN ниже должно быть достаточно для случая Augs. Кроме того, часто полезно показывать своим коллегам фактическую нарушающую строку кода.
Ответ №1:
При использовании данного типа вообще нет необходимости использовать using
оператор. Вы можете просто использовать полное имя, когда хотите использовать тип:
var lines = System.IO.File.ReadLines("temp.txt");
using
Оператор является просто синтаксическим сахаром, чтобы избежать необходимости делать это для каждого отдельного использования типа.
Ответ №2:
Используйте частичные классы. Создайте два исходных файла для одного и того же класса, один из которых импортирует System.Ввод-вывод (и содержит ваш специальный метод) и тот, который этого не делает (и содержит все остальные методы).
using System.IO;
public partial class MyClass
{
private void MethodName()
{
...
}
}
Комментарии:
1. 1 Очень умный, если разрешены частичные классы!
2. Это намного больше работы, чем необходимо для решения проблемы.
3. @Servy, это зависит от того, сколько раз ему нужно пространство имен. Если его много (но ему все равно нужно избегать
using
директивы), это было бы намного чище.4. @BradleyDotNET В большинстве случаев псевдоним типа / пространства имен все равно будет лучше, чем это. Перенос кода в другой файл, подобный этому, является довольно значительным сдерживающим фактором для удобства чтения. Также имейте в виду, что VS может добавлять полное имя от вашего имени, так что между этим и эффективным использованием вывода типов вы действительно можете сократить фактический объем работы, который он на вас возлагает.
Ответ №3:
Эта строка из MSDN заставляет меня подозревать, что нет:
Область действия директивы using ограничена файлом, в котором она появляется.
Обратите внимание, что в нем не указана область видимости. Однако вы всегда можете ссылаться на объект без using
директивы:
public void MyMethod()
{
System.IO.StreamWriter myWriter;
}
Идея частичного класса — еще один умный способ обойти проблему. Вот документация, на которую я ссылаюсь: MSDN
Ответ №4:
В то время как большинство ответов здесь об избежании using
оператора и полного имени типа, я хочу прокомментировать этот:
Мне нужна эта библиотека только в этом одном методе. Могу ли я как-нибудь это сделать?
В .Net добавление using
или добавление ссылки на библиотеку не означает, что эта библиотека вообще будет загружена. Библиотека загружается в домен приложения во время выполнения только тогда, когда она действительно используется.
Таким образом, добавление using в файл никому не повредит; выполнение определенного метода загрузит необходимые библиотеки, если потребуется.
Как только библиотека загружена в домен приложения — она никогда не будет выгружена.
Так что, скорее всего, вам не понадобится то, что вы просите, просто используйте using на уровне файлов или псевдонимов пространства имен в случае конфликтов имен.