return void 方法中的语句

return statement in void methods

所以,我最近正在寻找在 C# 中使用 FTP 的小型库...我通过了 this question to this class...

我想知道他们所有 void 方法中 return 语句的意义...

这里是他们的删除方法的例子:

     /* Delete File */
public void delete(string deleteFile)
{
    try
    {
        /* Create an FTP Request */
        ftpRequest = (FtpWebRequest)WebRequest.Create(host + "/" + deleteFile);
        /* Log in to the FTP Server with the User Name and Password Provided */
        ftpRequest.Credentials = new NetworkCredential(user, pass);
        /* When in doubt, use these options */
        ftpRequest.UseBinary = true;
        ftpRequest.UsePassive = true;
        ftpRequest.KeepAlive = true;
        /* Specify the Type of FTP Request */
        ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
        /* Establish Return Communication with the FTP Server */
        ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
        /* Resource Cleanup */
        ftpResponse.Close();
        ftpRequest = null;
    }
    catch (Exception ex) { Console.WriteLine(ex.ToString()); }
    return;
}

我的问题是:

return;有什么原因或影响吗?

没有

这可以用于方法的早期 returns,但这里不是这种情况 - 方法末尾的 return; 完全多余。

不过,生成的 IL 代码中存在明显的差异,只要您禁用了优化。没有 return 语句的 void 方法将只包含一条 ret 指令,而在末尾添加 return; 将添加一条分支指令 - 跳转到 ret 指令。

不用写无意义的解释,答案很简单:没有任何意义

void 方法末尾的 return 语句没有提供额外的效果。可以在不改变方法语义的情况下将其删除。

可以使用此 return 来简化文本搜索函数 returns 的位置,但它对编译器没有影响。

从查看页面来看,每个方法都以模式结尾

catch (Exception ex) { Console.WriteLine(ex.ToString()); }
return /* Whatever the "default" return value would be on a error */;

return 作为 void 方法中的最后一条语句不会对程序做任何事情,我唯一的猜测是文章的张贴者喜欢遵循这种模式。他在其他返回字符串的方法中使用了它...

catch (Exception ex) { Console.WriteLine(ex.ToString()); }
return "";

所以他可能只是想在返回 void 的方法上保持相同的模式。

没有效果,但我也看到了。我推测 (!) 有些人喜欢用 return 结束他们的方法,以便在块的末尾有比右括号更大的视觉指示。如果您在稍后阶段更改 return 类型(从 void 到其他类型),它也可能会为您节省一瞬间。

您的代码存在一些问题

  1. 如果抛出异常,ftpRequest不会关闭(资源泄漏)
  2. 您真的要重新创建 class 字段 (ftpRequest) 吗?
  3. 捕捉 Exception 气味
  4. 最后一个return没用(你的问题)

修改后的代码可能是这样的:

public void delete(string deleteFile) {
  try {
    // using over IDisposable is 
    using (var ftpRequest = (FtpWebRequest)WebRequest.Create(host + "/" + deleteFile)) {
      ftpRequest.Credentials = new NetworkCredential(user, pass);
      // When in doubt, use these options 
      ftpRequest.UseBinary = true;
      ftpRequest.UsePassive = true;
      ftpRequest.KeepAlive = true;
      // Specify the Type of FTP Request 
      ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
      // Establish Return Communication with the FTP Server 
      ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
    }
  }
  catch (WebException ex) {
    Console.WriteLine(ex.ToString());
  }
}