Возможно ли использовать библиотеку в методе, но не вне метода?

#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 на уровне файлов или псевдонимов пространства имен в случае конфликтов имен.