0

次のように使用した場合、「使用」はどのような目的に役立ちますか。-

1つの例はこれです(回答-@ richj-このコードを使用して問題を解決しました)

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

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

マイクロソフトサポートサイトを読んでいるときに見つけた他の例

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などを使用してページの上部で実行しているので、なぜこれがコードの途中で物を使用しているのですか?

それを省略した場合(コードが機能することはわかっています)、どの機能が失われるのでしょうか?

4

5 に答える 5

6

using()ブロックを離れると、接続が閉じられるか、同様のクリーンアップ機能が実行されます。これは、オブジェクトのDispose()メソッドを呼び出すことによって実現されます。

于 2010-06-17T06:06:57.453 に答える
5

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もう1つusing(のようにusing System.Web)はusingディレクティブです。私が話しているのはusingステートメントです。

于 2010-06-17T06:09:52.940 に答える
5

usingあなたはキーワードの2つの異なる用法を参照していると思います。

(一般的に)ファイルの先頭にある場合、名前空間をインポートすることを宣言します。「ディレクティブの使用」を参照してください。

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();
    }
}
于 2010-06-17T06:12:59.877 に答える
2

舞台裏では、コードをtry / finallyブロックでラップし、finallyブロックでIDiposable.Dispose()を呼び出して、リソースがクリーンアップされていることを確認します。

基本的に、それはあなたがすることの頭痛を救います:

SqlTransaction transaction = connection.BeginTransaction();

try
{ 
  //some code;
}
finally
{
  transaction.Dispose();
}
于 2010-06-17T06:09:41.147 に答える
1

泥棒マスターが言ったように-usingブロックが終了すると、SQLTransactionまたはSQLConnectionが閉じられます。リターンを介して終了するか、例外をスローすることによって終了するかは関係ありません。

使用を省略した場合は、自分でトランザクション/接続を閉じる必要があります。システムを使用して使用することにより、これは自動的に行われます。

于 2010-06-17T06:10:07.607 に答える