c#开关中的变量范围

时间:2012-05-29 16:16:50

标签: c# scope switch-statement

我正在尝试发送一封电子邮件,其中发件人和收件人的电子邮件地址(以及主题和正文内容)会根据提供给该方法的值发生变化。最好用代码本身来解释:

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新手,所以对于如何做这类事情的任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:3)

问题在于您没有初始化变量。如果emailAction的值不是01,那么变量的值会是多少?他们将是未初始化的,这是非法的。因此,要么初始化它们,要么在引发异常的switch语句中添加default:子句。之一:

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

或者:

switch (emailAction)
{
    ...
    default: throw new InvalidOperationException("Action not recognized: " + emailAction);
}

答案 1 :(得分:1)

您需要将变量初始化为默认值,或者在default情况下初始化它们。切换情况不能保证执行,因此编译器不知道值将被初始化。

答案 2 :(得分:1)

我不认为范围存在问题,但确保值初始化存在问题。

交换“Case 2:”for“Default:”将允许代码编译,将空值设置为变量(将MailAddresses设置为null,将字符串设置为null或“”)但我不建议。

简而言之,它失败的原因是如果emailAction等于3,或者除了1或2以外的任何东西,那么在switch语句中就不会执行任何操作,那么你会尝试在一个中使用未初始化的变量。表达

有关初始化的详细信息(对不起,如果这对您来说太低级别),请尝试阅读:http://www.inf.unibz.it/~calvanese/teaching/06-07-ip/lecture-notes/uni02/node18.html