Log4NetのNullオブジェクトを定義してNullチェックを不要にする

実装中のクラスからロガー(Log4Net)に各種ログを出力させたい！
でもクラスが完成したらログを吐いてほしくない！
しかしLogger出力行をいちいち削除するのはもってのほか！

そんな時は、Nullオブジェクトに置き換えてやれば、ログ出力されなくなります。
Nullオブジェクトを用意してやることで、Null値チェックも不要になり一石二鳥。

# サンプルコード

```Program.cs
using log4net;

public static void Main(string[] args)
{
	// A. か B. のいずれかをコメントアウトしてください
	// A.ログを記録する版
	//ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
	// B.何もしない版
	ILog logger = NullLogger.GetInstance();

	logger.Debug("開発中のデバッグ／トレースに使用する");
	logger.Info("情報（操作履歴等）");
	logger.Warn("注意／警告（障害の一歩手前）");
	logger.Error("システムが停止するまではいかない障害が発生");
	logger.Fatal("システムが停止する致命的な障害が発生");
}
```

# ソースコード：Log4Net ロガーのNullオブジェクト

```csharp:Log4NetNullLogger.cs
using System;
using log4net;

namespace Rohinomiya
{
	/// <summary>
	/// Logger(Log4Net)クラスの Nullオブジェクトパターン
	/// </summary>
	public sealed class NullLogger: ILog
	{
		private static NullLogger _singleInstance = new NullLogger();

				
		public static NullLogger GetInstance()
		{
			return _singleInstance;
		}
		
		private NullLogger()
		{
		}
		
		public bool IsDebugEnabled
		{
			get { return true; }
		}
		
		public bool IsInfoEnabled
		{
			get { return true; }
		}
		
		public bool IsWarnEnabled
		{
			get { return true; }
		}
		
		public bool IsErrorEnabled
		{
			get { return true; }
		}
		
		public bool IsFatalEnabled
		{
			get { return true; }
		}
		
		public void Debug(object message)
		{
		}
		
		public void Debug(object message, Exception exception)
		{
		}

		public void DebugFormat(string format, params object[] args)
		{
		}

		public void DebugFormat(string format, object arg0)
		{
		}

		public void DebugFormat(string format, object arg0, object arg1)
		{
		}

		public void DebugFormat(string format, object arg0, object arg1, object arg2)
		{
		}

		public void DebugFormat(IFormatProvider provider, string format, params object[] args)
		{
		}

		public void Info(object message)
		{
		}

		public void Info(object message, Exception exception)
		{
		}

		public void InfoFormat(string format, params object[] args)
		{
		}

		public void InfoFormat(string format, object arg0)
		{
		}

		public void InfoFormat(string format, object arg0, object arg1)
		{
		}

		public void InfoFormat(string format, object arg0, object arg1, object arg2)
		{
		}

		public void InfoFormat(IFormatProvider provider, string format, params object[] args)
		{
		}

		public void Warn(object message)
		{
		}

		public void Warn(object message, Exception exception)
		{
		}

		public void WarnFormat(string format, params object[] args)
		{
		}

		public void WarnFormat(string format, object arg0)
		{
		}

		public void WarnFormat(string format, object arg0, object arg1)
		{
		}

		public void WarnFormat(string format, object arg0, object arg1, object arg2)
		{
		}

		public void WarnFormat(IFormatProvider provider, string format, params object[] args)
		{
		}

		public void Error(object message)
		{
		}

		public void Error(object message, Exception exception)
		{
		}

		public void ErrorFormat(string format, params object[] args)
		{
		}

		public void ErrorFormat(string format, object arg0)
		{
		}

		public void ErrorFormat(string format, object arg0, object arg1)
		{
		}

		public void ErrorFormat(string format, object arg0, object arg1, object arg2)
		{
		}

		public void ErrorFormat(IFormatProvider provider, string format, params object[] args)
		{
		}

		public void Fatal(object message)
		{
		}

		public void Fatal(object message, Exception exception)
		{
		}

		public void FatalFormat(string format, params object[] args)
		{
		}

		public void FatalFormat(string format, object arg0)
		{
		}


		public void FatalFormat(string format, object arg0, object arg1)
		{
		}

		public void FatalFormat(string format, object arg0, object arg1, object arg2)
		{
		}

		public void FatalFormat(IFormatProvider provider, string format, params object[] args)
		{
		}

		//CS0535 対応
		//(http://old.nabble.com/-jira---Created--(LOG4NET-326)-Add-a-null-logger-implementation-td33520340.html)
		public global::log4net.Core.ILogger Logger
		{
			get { return null; }
		}
	}
	
}
```

# 参考

* [サルでもわかる 逆引きデザインパターン　第4章 逆引きカタログ　その他　Nullオブジェクト](http://www.nulab.co.jp/designPatterns/designPatterns4/designPatterns4-3.html)
* [Log4Net を利用してログを記録する #c# #Log4Net - Qiita](http://qiita.com/items/2b86c4e8d5afd5c2fb39)
* [Old Nabble - Log4net - Dev - [jira] [Created] (LOG4NET-326) Add a null logger implementation](http://old.nabble.com/-jira---Created--(LOG4NET-326)-Add-a-null-logger-implementation-td33520340.html)