繁体   English   中英

C#最小化if语句

[英]C# Minimize if statement

我还是C#的新手,我想知道如何才能最小化此代码。

这是我到目前为止的内容:

private void CheckFiles()
{
    if (!File.Exists(ProgramLocation + "\\Server Files\\" + "Bukkit.jar"))
    {
        DownloadBukkitJar();
    }
    else
    {
        Close();
    }
    if (!File.Exists(ProgramLocation + "\\dlls\\" + "HtmlAgilityPack.dll"))
    {
        DownloadHtmlAgilityPackDll();
    }
    else
    {
        Close();
    }
}

那么如何用更少的代码来实现呢?

private void CheckFile(string path, Action actionIfMissing)
{
    if (!File.Exists(path))
    {
        actionIfMissing();
    }
    else
    {
        Close();
    }
}

public void CheckFiles()
{
    var bukkitPath = Path.Combine(ProgramLocation, String.Format("{0}{1}{2}", "Server Files", Path.DirectorySeparatorChar, "Bukkit.jar");
    CheckFile(bukkitPath, DownloadBukkitJar);
    var htmlAgilityPackPath = Path.Combine(ProgramLocation, String.Format("{0}{1}{2}", "dlls", Path.DirectorySeparatorChar, "HtmlAgilityPack.dll");
    CheckFile(htmlAgilityPackPath, DownloadHtmlAgilityPackDLL);
}

注-警惕时硬编码的文件路径,你应该使用Path.DirectorySeparatorChar如果要建立一个路径,或当组合的路径使用Path.Combine 这将确保您的路径是特定于平台的,这将使您的代码更具可移植性。 我已经更新了示例,以演示如何执行此操作。

我不确定close()或downloadfunction是做什么的,但就我个人而言,我的目标是这样的:

private void CheckFiles()
{
    DownloadIfNeeded(ProgramLocation + "\\Server Files\\" + "Bukkit.jar");
    DownloadIfNeeded(ProgramLocation + "\\dlls\\" + "HtmlAgilityPack.dll");
}

private void DownloadIfNeeded(string s)
{
    if (!File.Exists(s))
    {
        DownloadFile(s);
    }
    else
    {
        Close();
    }
}

根据您的喜好和编码风格准则,以下可能是合理的尝试:

private void CheckFiles()
{
    bool bukkit = File.Exists(string.Format("{0}\\Server Files\\Bukkit.jar", ProgramLocation));
    bool htmlap = File.Exists(string.Format("{0}\\dlls\\HtmlAgilityPack.dll", ProgramLocation));

    if (!bukkit)           DownloadBukkitJar();
    if (!htmlap)           DownloadHtmlAgilityPackDll();
    if (bukkit || htmlap)  Close();
}

笔记

  • 我以为两次致电Close确实没有意义
  • 查看String.Format的使用(性能提高之前的代码清晰度示例)

据我了解,您正在尝试将对Close()的两个调用合并到一个块中,这是一种方法, 假设调用Close()的次数无关紧要

bool bukkitExists=File.Exists(ProgramLocation + "\\Server Files\\" + "Bukkit.jar");
bool htmlAgilitPackExists=File.Exists(ProgramLocation + "\\dlls\\" + "HtmlAgilityPack.dll");
if(bukkitExists||htmlAgilitPackExists){Close();}
else{
if (!htmlAgilitPackExists){DownloadHtmlAgilityPackDll();}
if(!bukkitExists){DownloadBukkitJar();}
}
private void CheckFiles()
{
    bool bukkitExists = File.Exists(ProgramLocation + "\\Server Files\\" + "Bukkit.jar");
    if (!bukkitExists)
    {
        DownloadBukkitJar();
    }
    bool agilityExists = File.Exists(ProgramLocation + "\\dlls\\" + "HtmlAgilityPack.dll");
    if (!agilityExists)
    {
        DownloadHtmlAgilityPackDll();
    }

    if (bukkitExists || agilityExists)
    {
        Close();
    }
}

您要关闭表格吗? 您真的要关闭两次吗?

一些事情:
-使用Path.Combine连接路径( http://msdn.microsoft.com/zh-cn/library/fyy7a5kt.aspx
-在路径,正则表达式模式前使用@符号,这样就不必转义“特殊字符”( http://en.csharp-online.net/CSharp_FAQ%3A_What_does_at_sign_identifier_mean
-如果前面的语句后面只有一行,则不需要括号{和}(尽管有些人认为这是错误的代码!)

根据上下文的更多提示:
-根据Close方法的功能,可能始终可以调用它,因此您只有两个if语句而没有else语句,而仅在CheckFiles()方法的末尾调用Close()。
-在连接字符串(如果不是路径)时,请始终使用String.Format方法而不是'+'号( http://msdn.microsoft.com/zh-cn/library/system.string.format.aspx

在您的示例中:

private void CheckFiles()
{
    if (!File.Exists(Path.Combine(ProgramLocation, @"Server Files\Bukkit.jar")))
        DownloadBukkitJar();
    else
        Close();

    if (!File.Exists(Path.Combine(ProgramLocation, @"dlls\HtmlAgilityPack.dll")))
        DownloadHtmlAgilityPackDll();
    else
        Close();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM