Какую цель «использование» служит, если используется следующим образом - PullRequest
0 голосов
/ 17 июня 2010

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

ЭТОТ ОДИН ПРИМЕР, (ОТВЕТ - @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 и т. Д., Так почему это происходит в середине кода,

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

Ответы [ 5 ]

6 голосов
/ 17 июня 2010

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

5 голосов
/ 17 июня 2010

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

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

using System.Collections;

namespace XYZ
{
}

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

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

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

public void MyMethod()
{
    SqlConnection conn;
    try
    {
        conn = new SqlConnection(...);
        // Do stuff
    }
    finally
    {
        conn.Dispose();
    }
}
5 голосов
/ 17 июня 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 вы не согласовываете себя с управлением ресурсами, и очень вероятно, что вы не будете пропускать ресурсы.

PS Другой using (как в using System.Web) - это используя директиву , я имею в виду оператор using .

2 голосов
/ 17 июня 2010

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

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

SqlTransaction transaction = connection.BeginTransaction();

try
{ 
  //some code;
}
finally
{
  transaction.Dispose();
}
1 голос
/ 17 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...