-2
var smtp = new SmtpClient
{
    Host =smtpHost,
    Port = smtpPort,
    EnableSsl = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential(fromAddress.Address, mailFromPassword)
};

using (var message = new MailMessage(fromAddress, toAddress)
    {
        Subject = subject,
        Body = body,
    }
)
{
    smtp.Send(message);
}

最後の括弧 (下から 4 行) は、using ステートメントを閉じます。ここで明らかな何かが欠けているに違いありませんが、コードはコンパイルされ、再シャープ化されますが、var メッセージは using ステートメントの外で使用されます。実際、using ステートメント内に配置すると、ビルドに失敗します。

実際、このhttps://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statementから

「using ステートメントにより、オブジェクトのメソッドを呼び出しているときに例外が発生した場合でも、Dispose が呼び出されることが保証されます。オブジェクトを try ブロック内に配置してから、finally ブロックで Dispose を呼び出すことによって、同じ結果を得ることができます。実際、これは、は、using ステートメントがコンパイラによって変換される方法です。前のコード例は、コンパイル時に次のコードに展開されます (オブジェクトの制限されたスコープを作成するために追加の中括弧に注意してください)。

メッセージはすでに範囲外であり、おそらく破棄されているはずです。

4

4 に答える 4

4

最後の括弧 (下から 4 行) は、using ステートメントを閉じます。

いいえ、リソースの取得を終了します。using ステートメントは次の形式です。

using ( resource_acquisition ) embedded_statement

embedded_statementブロックにすることもできます:

using ( resource_acquisition ) 
{
    embedded_statement
}

embedded_statement、 で作成された変数にアクセスできますresource_acquisition

それをコードに変換するには:

using (var message = new MailMessage(fromAddress, toAddress) //
                    {                                        //
                        Subject = subject,                   //
                        Body = body,                         // Resource acquisition
                    }                                        //
      )                                                      //

{                                                            //
    smtp.Send(message);                                      // Embedded statement
}                                                            //
于 2017-09-25T11:02:57.513 に答える