Когда я должен использовать блоки “использования” в C#? [дубликат]

$sql = "DELETE FROM `users` WHERE `username` = '$id'"

В противном случае, $id будет рассматриваться как столбец таблицы users.

70
задан 2 revs 6 February 2010 в 14:46
поделиться

14 ответов

Когда SomeType реализации класса IDisposable .

91
ответ дан 2 revs, 2 users 67% 24 November 2019 в 13:13
поделиться

Я также добавил бы, что используют using() оператор, если что-то реализует IDispose и также если это что-то, от чего Вы хотите избавиться, держится за Неуправляемые ресурсы как соединения с базой данных и дескрипторы файлов.

, Если это - обычный объект с, говорят List<T>, где T похож Customer объект, который содержит имена и адрес, затем Вы не должны. Сборщик "мусора" достаточно умен для управления этим для Вас. Но сборщик "мусора" НЕ возвратит соединения с пулом соединения или закроет дескрипторы файлов.

0
ответ дан Chris 24 November 2019 в 13:13
поделиться

Другие люди уже упомянули о "IDisposable".

, Но один из протестов при использовании "использования" оператора то, что, любые исключения, выданные в рамках "использования", не будут пойманы, даже мысль "SomeType" будет расположена независимо.

Так в следующем отрывке,

using (SomeType t = new SomeType()){
    throw new Exception("thrown within using");
}

throw new Exception("thrown within using"); не должен быть игнорирован.

0
ответ дан 2 revs, 2 users 87% 24 November 2019 в 13:13
поделиться

Одна ситуация состоит в том, когда Вы хотите сделать что-то в начале блока кода и затем отменить его в конце блока, безусловно (даже если существует бросок).

ctor для доступного класса, который Вы создаете (и называете в рамках использования) выполнил бы действие, и затем Расположить метод отменит то действие. Это обычно, как я использую его.

0
ответ дан Allen Rice 24 November 2019 в 13:13
поделиться

Возможно, стоит упомянуть, что базовая причина добавления “using” lo C# languge следует: некоторые ресурсы могут быть достаточно дефицитными, что doesn’t имеет смысл ожидать GC для вызова IDisposable. Например, соединения с БД. Если Вы используете, судить/ловить/наконец Вас, won’t заканчиваются с повисшим соединением, но соединение оставят, зависая, пока GC doesn’t не умрет, и это может требовать времени (если Вы не закрываете его явно). При использовании "использования" (извините игру слов), Вы сразу выпустите соединение, даже если Вы забыли закрывать его и даже если некоторое исключение произошло в блоке использования.
Другая причина, как предыдущее сообщение упоминает, состоит в том, что программисты не всегда используют наконец для чистки. Не используя наконец в случае исключения Вы заканчиваете с утечкой resources†¦

1
ответ дан 2 revs 24 November 2019 в 13:13
поделиться

Основное правило: * Оператор Use USING, когда объекты реализует интерфейс IDisposable.

Этот интерфейс предоставляет Расположить метод, который должен высвободить средства объекта. Если этот метод не будет вызван затем, то объект будет оставаться в памяти настолько долго, как CLR хочет выполнить сборку "мусора". Если использование программиста оператор USING затем на конце, объект будет расположен, и все ресурсы, будет бесплатным.

очень важно, что все ресурсы, которые больше не используются быть свободными как можно скорее.

Для получения дополнительной информации об этом просто посещают эту ссылку: microsoft

1
ответ дан rpf 24 November 2019 в 13:13
поделиться

Один определенный экземпляр, в котором необходимо быть тщательным использованием using блок, с Сервисным Клиентом WCF .

, Как отмечено в эта статья MSDN, перенося клиент WCF (который действительно реализует IDisposable) в using блок мог замаскировать любые ошибки, которые приводят к клиенту, оставляемому в неработающем состоянии (как тайм-аут или проблема связи). Короче говоря, когда Dispose() назван, клиент Close() огни метода, но броски и ошибка, потому что это находится в неработающем состоянии. Исходное исключение затем маскируется вторым исключением. Не хороший.

существуют различные обходные решения там, включая одно в самой статье MSDN. Другие могут быть найдены в IServiceOriented и blog.davidbarret.net .

я предпочитаю последний метод, сам.

2
ответ дан Eric King 24 November 2019 в 13:13
поделиться

Если Вы хотите сводное правило. В любое время объект с помощью IDisposable, где у Вас не было бы выгоды, используйте использование. Используя, по существу, этот шаблон:

try
{
  //instantiate and use object
}
finally
{
  //dispose object
}

, Если Вам не нужна выгода, использование может сохранить Вас ввод, который является хорошей вещью.

2
ответ дан 2 revs, 2 users 73% 24 November 2019 в 13:13
поделиться

Пример:

        using(SqlConnection MyConnection = new SqlConnection("Connection string"))
        {
            MyConnection.Open();

            //...

            // 1. SQLConnection is a type that implements IDisposable
            // 2. So you can use MyConnection in a using statement
            // 3. When using block finishes, it calls Dispose method of 
            // SqlConnection class
            // 4. In this case, it will probably close the connection to 
            // the database and dispose MyConnection object

        }

можно создать собственные объекты, который реализует IDisposable:

public class MyOwnObjectThatImplementsIDisposable : IDisposable
{

    //... some code

    public void Dispose()
    {
        // Put here the code you want to be executed when the
        // using statement finish.
    }
}

, Таким образом, Вы могли использовать объект типа MyOwnObjectThanImplementsIDisposable в операторе использования:

        using(MyOwnObjectThatImplementsIDisposable MyObject = new MyOwnObjectThatImplementsIDisposable)
        {

            // When the statement finishes, it calls the 
            // code you´ve writed in Dispose method
            // of MyOwnObjectThatImplementsIDisposable class
        }

Hope это помогает

4
ответ дан Javier 24 November 2019 в 13:13
поделиться

Когда SomeType реализует IDisposable.

, Который является ключом к разгадке Вас разработчик, что SomeType использует неуправляемые ресурсы, которые должны быть очищены.

4
ответ дан mbeckish 24 November 2019 в 13:13
поделиться

Я вижу, что много других ответов указало, когда Вы должны иметь using оператор. Я хочу обратиться, когда конкретно должен не , имеют using оператор:

, Если необходимо использовать объект за пределами объема текущей функции, не имейте using блок. Хорошим примером является метод фабрики, который возвращает соединение с базой данных или метод, который должен возвратить datareader. В любом из тех случаев при создании объекта с using оператор, он был бы расположен перед методом, возвращенным, и поэтому не применимый вне метода.

Теперь, Вы все еще хотите быть уверены , что те объекты расположены, таким образом, Вы все еще могли бы хотеть using оператор где-нибудь. Просто не включайте его в метод, где объект на самом деле создается. Вместо этого можно перенести сам вызов функции в using оператор.

12
ответ дан Joel Coehoorn 24 November 2019 в 13:13
поделиться

Используйте using каждый раз, когда тип реализует IDisposable , если Вы не собираетесь перенести его в try / catch блок так или иначе, затем Вы могли бы также (в зависимости от того, какой взгляд Вы предпочитаете), используют finally блок.

13
ответ дан bdukes 24 November 2019 в 13:13
поделиться

Некоторым объектам нужно некоторое действие, которое будет взято, когда Вы закончили с ними. Обычно это вызвано тем, что объект использует некоторый ресурс, от которого нужно избавиться. Например, если у Вас будет объект файла класса Файл, и этот объект открывает файл от файловой системы, то файл в файловой системе должен будет быть закрыт снова.

, Если Вы просто оставили объект файла и забыли называть файл. Близко () это не было бы убрано вплоть до Сборщика "мусора" (GC), работал и решил, что ничто все еще не использовало объект файла. Когда выполнения Сборщика "мусора" нужно оставить Общеязыковой среде выполнения (CLR) решить. Если GC не работает долгое время после окончания с файлом файл мог остаться открытым потенциально в течение долгого времени. Это может создать большую проблему, если существует много объектов файла, или если что-то хочет открыть файл, но не можете, потому что файл возражает, что Вы уехали, все еще бродит вокруг.

Для решения этой проблемы C# имеет интерфейс IDisposable. Этому назвали один метод, Располагают. Классы, которые требуют некоторой очистки, реализуют, это Располагает метод. Это дает Вам стандартный путь к чистке любых объектов то использование ресурсы. Существует много классов, которые должны иметь, Располагают названный. Проблема с этим состоит в том, что код покрыт вызовами для Расположения, и они хитры для следования, потому что место, где Вы new'ed объект и вызов Располагаете для чистки его, отличается. Так, необходимо было осмотреть код много и стараться очень для проверки были вызовы для Расположения в правильном месте.

Для решения этой проблемы C# представил ключевое слово 'использования'. Можно поместить ключевое слово 'использования' вокруг, где Вы новый объект, и это удостоверяется, Располагают, будет назван на нем для Вас. Это гарантирует, что Располагают, будет назван что бы ни случилось..., даже если будет исключение, выданное в теле оператора использования.

Так, необходимо использовать 'использование', когда Вы хотите быть уверенными объект, который выделяет ресурсы, будет очищен.

<час>

использование может только использоваться для объектов, которые объявляются на стеке, т.е. в функции. Это не работает на объекты, которые объявляются как члены класса. Для них необходимо звонить, Располагают себя. Вам, вероятно, придется реализовать, Располагают в Вашем классе так, чтобы в мог звонить, Располагают на любых членских объектах, которые что он имеет, которые требуют его.

<час>

Общие объекты, которым нужно использование, обратились к ним: Файлы, Соединения с базой данных, Графические объекты, такие как Pen и Brush.

<час>

Иногда это также используется, когда Вы хотите, чтобы две операции произошли вместе. Например, если Вы хотите записать оператор журнала, когда блок кода вводится и когда он выходит, Вы могли записать класс журнала, который Вы могли использовать как это:

using( Log log = new Log("Doing stuff") )
{
    // Stuff
}

конструктор для класса журнала мог быть заставлен выписать сообщение, и Расположить метод мог также выписать его. Реализуйте финализатор (~Log), чтобы утверждать, не становится ли Расположить метод названным, чтобы гарантировать, что 'использование' помнят вокруг 'нового Журнала'.

92
ответ дан Scott Langham 24 November 2019 в 13:13
поделиться

В этом контексте using оператор удобен для типов та реализация IDisposable. Когда блок кода выходит из объема using, оператор, Dispose() называют неявно. Это - хорошая привычка при работе с объектами, которые Вы хотите расположить сразу после использования.

2
ответ дан Dave Swersky 24 November 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: