[英]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
确实没有意义 据我了解,您正在尝试将对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.