【问题标题】:C# - How to use a voided method in an if statementC# - 如何在 if 语句中使用 voided 方法
【发布时间】:2015-08-18 18:21:39
【问题描述】:

我正在编写一个向用户发送包含信息的电子邮件的程序。我想要完成的是,如果电子邮件发送成功,那么它将写入电子邮件发送成功的日志文件。我唯一的问题是,我发现很难让 if 语句做到这一点。我知道我无法将该方法放入 if 语句中,因为您无法将 voided 方法转换为布尔值,但我还能做些什么呢?下面是我尝试使用的 SendEmail 方法的代码。

SendEmail(BuildEmailBody(transaction, myHomeInformation),subjectLine);
    if (SendEmail.Success())
     {
       BOAssistant.WriteLine                 
     }

这是方法:

private static void SendEmail(string emailBody, string emailSubject)
     {
        //This is the method that will create the email for you
        Email email = new Email();
        email.To.Add("POvermyer@TandT.com");
        email.Subject = emailSubject;
        email.Body = emailBody;
        email.Send();
    }

【问题讨论】:

  • 从你的SendEmail 函数返回一个bool,说明它是否成功(我不知道如何使用Email 类,但你可以弄清楚)。那么你的if 语句就是if (SendEmail(body, subject)) { /* code */ }
  • 您应该在您的 send email 方法中完成此操作...返回一个值或在其中执行成功功能
  • 你打算如何知道邮件是否真的发送成功了?

标签: c# if-statement methods void


【解决方案1】:

如果你知道不成功的邮件会抛出异常,你可以这样处理:

try
{
    SendEmail(BuildEmailBody(transaction, myHomeInformation),subjectLine);
    BOAssistant.WriteLine  //log success here
}
catch(Exception ex)
{
    //unsuccessful here
}    

【讨论】:

  • 当然,这个假设不会在实践中真正成立。仅仅因为Send 没有抛出并不意味着电子邮件实际上会被成功发送/接收。
  • 捕捉Exception 类型在大多数情况下并不是一个好主意。在尝试发送电子邮件之前可能会出现其他问题,但仍然会被捕获。以及我们如何知道没有发送电子邮件时会抛出异常?
  • @Kapol Catching Exception 这里几乎可以肯定是合适的。无论实际导致问题的原因是什么,对未成功发送的电子邮件的响应几乎肯定是完全相同的,即记录错误并通知用户(如果这不是一个自动化过程)电子邮件不能'不会发送。
  • @Servy 谢谢你的解释。这实际上是有道理的。我现在能想到的唯一问题是在发送电子邮件之后 引发异常。当然,只有当我们稍后添加一些新代码时才会发生这种情况:-)
  • @Kapol 然后你必须问自己如果异常被抛出,你是否真的想做任何不同的事情。如果您愿意,那么您需要围绕该方法(或可能在该方法内)进行额外的尝试/捕获。在相当可能的情况下,对任一位置的异常的唯一响应是记录异常并继续前进,那么就可以了。
【解决方案2】:
if (SendEmail(BuildEmailBody(transaction, myHomeInformation),subjectLine))
{
    BOAssistant.WriteLine                 
}

...

private static bool SendEmail(string emailBody, string emailSubject)
 {
    //This is the method that will create the email for you
    Email email = new Email();
    email.To.Add("POvermyer@TandT.com");
    email.Subject = emailSubject;
    email.Body = emailBody;
    try{
    email.Send();
    } catch(Exception e) { return false; }
    return true;
}

bool isSent;
SendEmail(BuildEmailBody(transaction, myHomeInformation),subjectLine, out isSent);
if (isSent)
{
    BOAssistant.WriteLine                 
}

...

private static void SendEmail(string emailBody, string emailSubject, out bool isSent)
 {
    //This is the method that will create the email for you
    Email email = new Email();
    email.To.Add("POvermyer@TandT.com");
    email.Subject = emailSubject;
    email.Body = emailBody;
    try{
    email.Send();
    } catch(Exception e) { isSent = false; }
    isSent = true;
}

SendEmail(BuildEmailBody(transaction, myHomeInformation),subjectLine, () => BOAssistant.WriteLine);

...

private static void SendEmail(string emailBody, string emailSubject, Action onSuccess)
 {
    //This is the method that will create the email for you
    Email email = new Email();
    email.To.Add("POvermyer@TandT.com");
    email.Subject = emailSubject;
    email.Body = emailBody;
    try{
    email.Send();
    } catch(Exception e) { return; }
    onSuccess();
}

【讨论】:

  • 当方法只返回 true 时,让它返回任何东西都是毫无意义的。
  • 我假设带有out 参数的版本实际上应该具有void 而不是bool 的返回类型,特别是因为你没有return 任何东西。此外,虽然这会起作用,但恕我直言,这只是糟糕的设计。
  • 您提供的第一个答案效果很好。谢谢!
  • 个人id去最后一个
【解决方案3】:

如果您的方法必须是 void 返回类型(这是我根据问题标题假设的),那么您可以引入 out 参数。它不必在方法调用之前初始化,但您必须在方法本身内部为其分配一个值。 out 参数是通过引用传递的,所以被调用者分配给它的任何值都会反映在调用者中。

bool sentSuccessfully;
SendEmail(string emailBody, string emailSubject, out sentSuccessfully)

if(sentSuccessfully)
{
    // do whatever you need
}

当然,您需要修改 SendEmail 方法以包含此附加参数。

【讨论】:

    【解决方案4】:

    最好的选择是将 sendmail 方法的返回类型更改为 bool 并在 if 语句中使用它。

    private static bool SendEmail(string emailBody, string emailSubject)
     {
       try
       {
        Email email = new Email();
        email.To.Add("POvermyer@TandT.com");
        email.Subject = emailSubject;
        email.Body = emailBody;
        email.Send();
        return true;
       }
       catch(Exception ex)
       {
        return false; 
       }
    }
    

    如果更改方法返回类型不是一个选项,那么您可以这样做,

    bool IsSuccessfullySent;
    try
    {
     SendEmail(BuildEmailBody(transaction, myHomeInformation),subjectLine);
     IsSuccessfullySent= true;
    }
    catch(Exception ex)
    {
     IsSuccessfullySent=false;
    }
    if (IsSuccessfullySent)
     {
       BOAssistant.WriteLine                 
     }
    

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多