我对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();
}
}
那我怎么能用更少的代码来做这件事呢?
答案 0 :(得分:3)
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
组合路径时使用{{1}}。这将确保您的路径是特定于平台的,这将使您的代码更具可移植性。我已经更新了示例以演示如何执行此操作。
答案 1 :(得分:1)
我不确定关闭()或下载功能是做什么的,但我个人会瞄准这样的事情:
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();
}
}
答案 2 :(得分:1)
根据您的品味和编码风格指南,以下可能是合理的尝试:
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
实际上没有意义答案 3 :(得分:0)
根据我的理解,你试图在一个块中合并两个对Close()的调用,这是一种方法,假设调用Close()多少次无关紧要< / strong>
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();}
}
答案 4 :(得分:0)
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();
}
}
您是否正在关闭表格?你真的想把它关闭两次吗?
答案 5 :(得分:0)
有些事情:
- 使用Path.Combine(http://msdn.microsoft.com/en-us/library/fyy7a5kt.aspx)连接路径
- 使用路径前面的@符号,正则表达式模式,...这样您就不必转义'特殊字符'(http://en.csharp-online.net/CSharp_FAQ%3A_What_does_at_sign_identifier_mean)
- 如果前面的语句只有一行,则不需要使用括号{和}(尽管有些人认为这是错误的代码!)
根据具体情况提供更多提示:
- 根据Close方法的功能,可能总是调用它,因此只有两个不带else语句的if语句,只需在CheckFiles()方法的末尾调用Close()。
- 连接字符串(如果不是路径)时,始终使用String.Format方法而不是'+'符号(http://msdn.microsoft.com/en-us/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();
}