Как узнать, можно ли использовать класс в качестве статического класса? - PullRequest
3 голосов
/ 01 января 2012

В моей программе несколько классов и 2 формы. Моя первая форма "Main" имеет кнопку, которая покажет вторую форму "formSettings" и кнопку, которая откроет файл журнала.

FormSettings formSettings = new FormSettings();
LogClass objectLog = new LogClass();

public void settingsToolStripMenuItem1_Click(object sender, EventArgs e)
    {
        //shows the settings form
        formSettings.Show();            
    }


private void viewLogToolStripMenuItem1_Click(object sender, EventArgs e)
    {            
        try
        {
            objectLog.OpenLogFile();
        }
        catch (Exception ee)
        {
            objectMessageBox.ReturnErrorOpeningLogPrompt(ee.ToString());
        }
    }

Моя основная форма создает экземпляры как формы параметров, так и класса журнала. Мой класс настроек также создает экземпляр объекта Log. У меня сейчас проблема в том, что класс журнала выполняет некоторую проверку на основе записей из класса настроек, однако я не могу вызвать объект класса настроек, так как он вызывает класс журнала или я получаю бесконечный цикл. Вот проверка, которую он делает.

public void Write_Log_Data(string data)
    {
        //Create an outfile stream
        FileStream outfile = new FileStream(fileLocation,
            FileMode.Append, FileAccess.Write);
        StreamWriter writer = new StreamWriter(outfile);

        if (objectSettings.chbxLogScanResults.Checked == true)
        {
            if (data == null || data == "")
            {
                //this is for logging ip addresses
                writer.WriteLine(Properties.Settings.Default.IPAddressNew + CONST_TAB +
                    GetDateTime());

            }
            //because logs containing errors or changed ips are not null data they trigger this section
            else
            {
                //the error was already formatted so just write it
                writer.WriteLine(data);
            }

            //close our writers
            writer.Close();
            outfile.Close();
        }
    }

Что мне интересно, должен ли файл журнала быть статичным? Это может быть статичным? Я хочу иметь возможность вызывать метод LogOpen (), который является частью LogClass из любой формы, но, как показано выше, есть некоторая проверка, которая происходит на основе записей одной из форм, вызывающих класс журнала. Что может быть хорошим решением для этого, если я не могу использовать файл журнала в качестве статического класса (я не очень хорошо понимаю статические классы, поэтому я спрашиваю).

Ответы [ 2 ]

2 голосов
/ 01 января 2012

Статический класс - это просто класс, все члены которого являются статическими. Ничего особенного там нет.

Вы должны иметь статическое, глобально видимое средство ведения журнала, которое просто делегирует экземпляру, который выполняет реальную работу.

Код регистрации должен работать с настройками по умолчанию, чтобы он мог работать даже до загрузки настроек.

Последнее замечание: открывать FileStream s и StreamWriter s перед оператором if() и закрывать их внутри тела оператора if() - ужасная идея. Попробуйте вместо этого использовать ключевое слово using.

2 голосов
/ 01 января 2012

Да, LogClass может быть абсолютно статичным, и, на самом деле, если к нему обращаются из разных мест, вероятно, лучше, чем он есть.

Однако вам нужно будет изменить способ передачи настроек формы в класс журнала. Вам нужно будет либо добавить статические свойства в класс журнала для хранения значений из форм, либо вам нужно будет передать значения из форм в методы класса журнала.

Например, если ваш пользователь очищает chbxLogScanResults в форме настроек, то вы можете либо обновить LogClass этой информацией сразу, либо после сохранения формы настроек (я предпочитаю делать это при сохранении, чтобы в случае отмены пользователем изменения в форме, вы не записываете настройки неправильно).

...