0

メソッドを使用してログ ファイルに書き込もうとすると、宣言した StreamWriter が破棄されるという問題に直面しています。別のクラスからAttachPinkまたはAttachBlueを実行する場合を除いて、すべてが期待どおりに機能しています。その後、StreamWriter が破棄され、nullPointerException が発生します。

class Logs : IDisposable
    {

        //other declarations

        private StreamWriter HistoryWriter;
        private int ReportInterval = 0;

        public void NewHistory()
        {
            HistoryWriter = new StreamWriter(HistoryLocation + HistoryName + HistoryExtension);
            PrepareHistory();
        }

        private void PrepareHistory()
        {
            HistoryWriter.WriteLine("<html><body bgcolor='#000000'>");
            /*
             *  Insert initial HTML tags 
             */
        }

        public void SendHistory()
        {
            HistoryWriter.WriteLine("</body></html>");
            /*
             *  Final HTML tags
             */ 
            HistoryWriter.Close();
            if (ReportInterval > 0)
            {
                /*
                 *  Upload File
                 */
            }
            else
            {
                Debug.WriteLine("ERROR: Report Interval for History has not been set");
            }
            NewHistory();
        }

        public void AttachPink(String message, StreamWriter writer)
        {
            writer.Write(
                "<font color='DA1BE0'>" 
                + message
                + "</font>");
        }

        public void AttachBlue(String message, StreamWriter writer)
        {
            writer.Write(
                "<font color='0C93ED'>" 
                + message
                + "</font>");
        }

        public StreamWriter getHistoryWriter()
        {
            return HistoryWriter;
        }

        public void SetHistoryInterval(int interval)
        {
            ReportInterval = interval;
        }

        public void Dispose()
        {
            if (HistoryWriter != null)
            {
                HistoryWriter.Close();
                HistoryWriter.Dispose();
                HistoryWriter = null;
            }
        }

    }

メソッドを使用するには、次のように、別のクラス内で Logs クラスのインスタンスを宣言するだけです。

class UsingLogs
    {
        Logs logs = new Logs();
        logs.NewHistory();
        logs.AttachBlue("my message", logs.getHistoryWriter());
    }

複数のメソッドにアクセスするときに、クラス変数の状態を保持する方法がわかりません。

4

1 に答える 1

2

あなたが探しているのはシングルトン パターン ( http://en.wikipedia.org/wiki/Singleton_pattern )だと思います。

シングルトンが必要になるたびに再利用できる私の単純な実装

public class Singleton<T> where T : class, new()
{
    private static object sync = null;
    private static volatile T i;
    protected Singleton() { }

    public static T I
    {
        get
        {
            if (i == null)
                lock (sync)
                    if (i == null)
                        i = new T();

            return i;
        }
    }
}

次のように Log クラスを実装できます。

class Logs : Singleton<Logs>
{
... your code goes here
}

コードで Logs クラスを使用する場合は、次を使用するだけです。

Logs.I.AttachBlue(...);

お役に立てれば :)

于 2013-01-20T21:06:28.633 に答える