Свернуть, если заявление - PullRequest
2 голосов
/ 03 апреля 2012

Я все еще немного новичок в 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();
    }
}

Так, как я мог сделать это в меньшем количестве кода?

Ответы [ 6 ]

3 голосов
/ 03 апреля 2012
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 голос
/ 03 апреля 2012

В зависимости от вашего вкуса и рекомендаций по стилю кодирования, разумной попыткой может быть следующее:

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 (пример ясности кода до производительности)
1 голос
/ 03 апреля 2012

Я не уверен, что делают функции close () или download, но лично я бы хотел что-то вроде этого:

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();
    }
}
0 голосов
/ 03 апреля 2012

Некоторые вещи:- Объединить пути, используя 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 может быть возможно всегда вызывать его, поэтому у вас есть только два оператора if без операторов else и просто вызовите Close () в конце метода CheckFiles ().- При объединении строк (если не путей) всегда используйте метод 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();
}
0 голосов
/ 03 апреля 2012
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();
    }
}

Вы закрываете форму? Вы действительно хотели закрыть его дважды?

0 голосов
/ 03 апреля 2012

Насколько я понимаю, вы пытаетесь объединить два вызова метода 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();}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...