Какой цели служит слово «использование», если оно используется следующим образом?

Какой цели служит слово «использование», если оно используется следующим образом: -

ОДИН ПРИМЕР (ОТВЕТ- @richj - ИСПОЛЬЗОВАЛ ЭТОТ КОД ДЛЯ РЕШЕНИЯ ПРОБЛЕМЫ, СПАСИБО)

private Method(SqlConnection connection)
{
    using (SqlTransaction transaction = connection.BeginTransaction())
    {
        try
        {
            // Use the connection here
            ....

            transaction.Commit();
        } 
        catch
        {
            transaction.Rollback();
            throw;
        }
    }
}

ДРУГОЙ ПРИМЕР, НАЙДЕННЫЙ МНЕ ВО ВРЕМЯ ЧТЕНИЯ НА САЙТЕ ПОДДЕРЖКИ MICROSOFT

public static void ShowSqlException(string connectionString)
{
    string queryString = "EXECUTE NonExistantStoredProcedure";
    StringBuilder errorMessages = new StringBuilder();

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(queryString, connection);
        try
        {
            command.Connection.Open();
            command.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            for (int i = 0; i < ex.Errors.Count; i++)
            {
                errorMessages.Append("Index #" + i + "\n" +
                    "Message: " + ex.Errors[i].Message + "\n" +
                    "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                    "Source: " + ex.Errors[i].Source + "\n" +
                    "Procedure: " + ex.Errors[i].Procedure + "\n");
            }
            Console.WriteLine(errorMessages.ToString());
        }
    }
}

Я делаю вверху страницы, используя system.data.sqlclient и т. Д., Так почему это использование вещи в середине кода,

Что, если я его пропущу (я знаю, что код будет работать), но какую функциональность я потеряю


person user287745    schedule 17.06.2010    source источник
comment
comment
Тот факт, что ваш пост содержит КОМАНДЫ SQL, не означает, что вам нужно кричать ...   -  person bruceboughton    schedule 17.06.2010


Ответы (5)


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

Находясь (обычно) в верхней части файла, он объявляет об импорте пространства имен. См. «Директива использования».

using System.Collections;

namespace XYZ
{
}

При объявлении внутри функции он объявляет ограниченное время жизни и, возможно, область действия (если объявляется одновременно) для переменной, так что ее интерфейс IDisposable автоматически вызывается после закрытия блока. См. «Заявление об использовании».

public void MyMethod()
{
    using (var conn = new SqlConnection(...))
    {
         // Do stuff
    }
}

Эквивалентен:

public void MyMethod()
{
    SqlConnection conn;
    try
    {
        conn = new SqlConnection(...);
        // Do stuff
    }
    finally
    {
        conn.Dispose();
    }
}
person Reddog    schedule 17.06.2010
comment
все ответы полезны, ваш - тот, который мне нравится, один вопрос. ? Могу ли я использовать уловку с этим, используя using (var conn = new SqlConnection (...)) {// Делать что-то} в зависимости от того, как он скомпилирован, я предполагаю, что использование улова снаружи выдаст ошибку, а что, если его использование внутри? это сработает, как будто попробуй поймать наконец! примечание: - мне нужно перехватывать исключения и отображать их на экране response.write ......... - person user287745; 17.06.2010
comment
и я отмечу твой ответ как ответ, когда ты ответишь на этот вопрос :-) спасибо - person user287745; 17.06.2010
comment
Немного смущает ваш вопрос, но вот и все - исключения все равно будут пузыриться, пока их не поймают да. Использование statemtnt просто позволит вам ограничить время жизни переменной conn. Вы можете поместить свой блок try / catch внутри блока using, если хотите, или вы можете поместить блок using внутри вашего try / catch. Единственное, что ограничивает последнее, - это то, что у вас не будет доступа к conn в блоках catch / finally [не то, чтобы они вам все равно понадобились]. - person Reddog; 17.06.2010

Когда вы выйдете из блока using (), ваше соединение будет закрыто или будут выполнены аналогичные действия по очистке. Это достигается путем вызова метода Dispose () объекта.

person ThiefMaster    schedule 17.06.2010
comment
+1. Также это называется оператором using по сравнению с конструкцией пространства имен using, которая называется директивой using. - person sharptooth; 17.06.2010
comment
Он также помещает этот вызов в блок finally, так что он все равно будет вызываться в случае возникновения исключения. - person Ed S.; 17.06.2010

Прямо из MSDN:

using (Font font1 = new Font("Arial", 10.0f)) 
{
  byte charset = font1.GdiCharSet;
}

эквивалентно:

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

Это более короткий и лаконичный способ сказать: я хочу использовать эту вещь, которую я создаю, для самых разных замечательных вещей, и я хочу, чтобы фреймворк очистил мою игровую площадку, когда я закончу с ней.

Обычно он используется с классами, которые выделяют ресурсы (потоки, соединения с базой данных ...), потому что вы можете забыть или пренебречь освобождением этих ресурсов, когда закончите с ними. С using вы не соглашаетесь с управлением ресурсами, и очень вероятно, что вы не потеряете ресурсы.

P.S. Другой using (как в using System.Web) - это директива using, я говорю о выражении using .

person SWeko    schedule 17.06.2010
comment
Любой ответ, который фактически ссылается на руководство, заслуживает одобрения. - person Josh Davis; 17.06.2010

За кулисами он помещает ваш код в блок try / finally, а в блоке finally вызывается IDiposable.Dispose (), гарантирующий очистку всех ресурсов.

В основном это избавляет вас от головной боли:

SqlTransaction transaction = connection.BeginTransaction();

try
{ 
  //some code;
}
finally
{
  transaction.Dispose();
}
person Alan    schedule 17.06.2010

Как сказал Thief Master - при выходе из используемого блока закрывается SQLTransaction или SQLConnection. Независимо от того, выходит ли он через возврат или сгенерировав исключение.

Если вы пропустите использование, вам придется закрыть транзакцию / соединение самостоятельно. При использовании система делает это за вас автоматически.

person bernhardrusch    schedule 17.06.2010