昨天想当然System.Diagnostics.Debug.WriteLine函数与System.Console.WriteLine函数具有相同的函数定义,所以来了类似这么一句:
string name = “Noock”;
System.Diagnostics.Debug.WriteLine("[{0}]Hello from:" + name, DateTime.Now.ToString("yyyy-MM-dd"));
但得到的结果确令人不解:
2010-12-19: [{0}]Hello from:Noock
开始以为是BUG,结果看了System.Diagnostics.Debug.WriteLine一组函数定义才明白问题之所在,这组函数有:
1:public static void WriteLine(object value);
2:public static void WriteLine(string message);
3:public static void WriteLine(object value, string category);
4:public static void WriteLine(string format, params object[] args);
原因就清楚了,本以为调用的是第4个函数,而实际上调用的是第3个函数,所以所category的值放到了最前面,而把第一个参数作为value(即字符串)直接输出。而看看Console.WriteLine一组函数定义中有下面两个函数:
5:public static void WriteLine(string format, object arg0);
6:public static void WriteLine(string format, params object[] arg);
原以为Debug中的函数3与会为函数5,实则不然。可能微软在设计这个函数时也是考虑到调试方便,加了一个category参数,用于对消息进行分类,但设计的不一致难免会带来一些问题,而我最开始要写的那句还不得已使用拆成在个参数。
可能这也是见仁见智的问题,但我认为使用函数3并不一定会给编程带来什么效率上的提高,反而会使得习惯了Console.WriteLine的用户犯一次错误,而且这个错误还不一定只会犯一次(如果哪位遇到过同样的问题,回个帖声援一下吧)。
昨天发现的问题,今天用着感觉特别别扭,总得考虑两个参数与三个参数时的不同。
所以,在设计任何系统时都应该考虑设计的一致性,除非特别必要(我认为Debug.WriteLine此处没有必要),千万不要违反一致性原则而违背用户的使用习惯。