1

メソッドに指定された値に応じて、送信者と受信者の電子メール アドレス (および件名と本文の内容) が変化する電子メールを送信しようとしています。おそらく、コード自体で最もよく説明されています。

public void EmailNotification(int emailAction)
    {

        MailAddress to;
        MailAddress from;
        string subject;
        string body;

        switch (emailAction)
        {
            case 1:
                // Comment approved
                to = new MailAddress("someone@theirdomain.com");
                from = new MailAddress("no-reply@thisdomain.com");
                subject = "Comment approved";
                body = @"The comment you posted has been approved";
                break;
            case 2:
                // Comment rejected
                to = new MailAddress("someone@theirdomain.com");
                from = new MailAddress("no-reply@thisdomain.com");
                subject = "Comment rejected";
                body = @"The comment you posted has been rejected";
                break;
        }

        MailMessage message = new MailMessage(from, to);
        message.Subject = subject;
        message.Body = body;
        SmtpClient client = new SmtpClient();

        try
        {
            client.Send(message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception caught in EmailNotification: {0}", ex.ToString());
        }
    }

したがって、問題は、スコープがスイッチでどのように機能するかにより、to、from、subject などの値が、スイッチの外で宣言したにもかかわらず、スイッチの外では認識されないことです (おそらく間違っていますか?)。

私は .NET の初心者なので、この種のことをどのように行うべきかについてのアドバイスをいただければ幸いです。

4

3 に答える 3

3

問題は、変数を初期化していないことです。emailActionの値がどちらでもない場合、変数の値はどうなります01? それらは初期化されていないため、違法です。したがって、それらを初期化するかdefault:、switch ステートメントに例外をスローする句を追加します。また:

MailAddress to = null;
MailAddress from = null;
string subject = null;
string body = null;

または:

switch (emailAction)
{
    ...
    default: throw new InvalidOperationException("Action not recognized: " + emailAction);
}
于 2012-05-29T16:19:43.527 に答える
1

変数をデフォルト値に初期化するか、defaultケースで初期化する必要があります。switch ケースの実行は保証されていないため、コンパイラは値が初期化されることを知りません。

于 2012-05-29T16:20:23.057 に答える
1

スコープに問題はないと思いますが、値が確実に初期化されるという問題があります。

"Case 2:" を "Default:" に交換すると、変数に空の値を設定する (MailAddresses を null に設定し、文字列を null または "" に設定する) 場合と同様に、コードをコンパイルできますが、お勧めしません。

簡単に言えば、失敗する理由は、emailAction が 3、または 1 または 2 以外の値である場合、switch ステートメントでアクションが実行されず、式で初期化されていない変数を使用しようとすることになるためです。

初期化とは何かについての詳細は (これがあなたにとってレベルが低すぎる場合は申し訳ありません)、以下を読んでみてください: http://www.inf.unibz.it/~calvanese/teaching/06-07-ip/lecture-notes/uni02 /node18.html .

于 2012-05-29T16:29:11.503 に答える