借助 委托 精简代码
2011-06-23 20:47 鹤冲天 阅读(6321) 评论(71) 编辑 收藏 举报相信大多朋友和我一样,每天写代码就会用到 String.Format 这个方法。太经常用,感觉敲起键盘了不是太利索,于是把它精简成一个字母 F,以后代码可以这样写了:
1
|
var s = F("今天是 {0}", DateTime.Now) |
String.Format 简化为 F
实现这个简化不难,首先我们声明 StringFormat 的委托:
1
|
delegate string StringFormat(string format, params object[] args); |
然后在函数(或类)中,声明一个 StringFormat 类型的变量 F(字段或属性),并给它赋值:
1
|
StringFormat F = string.Format;
|
OK,从此可以用一个简单的 F 来代替冗长的 String.Format 了:
1 2 |
var s1 = F("今天是 {0}", DateTime.Now); var s2 = F("{0} 生日是 {1:yyyy-MM-dd}", "小明", new DateTime(2000, 1, 1)); |
下面是调试的截图:
当然这种方式也是有缺点和不足的。
首先,F 无法在全局中使用:如果 F 声明在方法中,则只能所在方法中使用;如果 F 声明在类中作为字段或属性,只能在所在类中使用。
其次,String.Format 有多个重载,如下图:
F 只能对应 1166 行的那个,虽然可以包容除 1190 行的其它三个,但效率略低。
引申出来的代码简化
根据由上思路,还可以引申其它一些简化的方式:
ToString 简化为 S
1 2 3 4 |
Func<object, string> S = Convert.ToString; var s3 = S(12); var s4 = S(DateTime.Today); var s5 = S(new Person { Name = "鹤冲天" }); |
正则匹配:Regex.Match 简化为 Match
1 2 |
Func<string, string, string> Match = (input, pattern) => Regex.Match(input, pattern).Value; var number = Match("ldp615", @"\d+"); |
类型转换:Int32.Parse 简化为 Int
1 2 |
Func<string, int> Int = int.Parse; var i = Int("1234"); |
去除 new
1 2 |
Func<int, int int, DateTime> Date = (year, month, day) => new DateTime(year, month, day); var date = Date(2000, 1, 1); |
智能提示
String.Format 的简化采用了 delegate 声明,Regex.Match 则采用了系统预先声明的 Func<>,前者有更好的智能提示:
补充及改进--借助VS智能提示提高可读性
这部分是看了大家的回复才加上的。
回复中大家大多指出程序的可读性,维护性不好,看到 F 很难和 String.Format 扯上关系。但 VS 是有智能提示的,稍稍改进就可以改善可读的问题。
代码就不加了,直接上个图吧:
把 F 提升为类的成员,通过 /// 加上代码注释,当鼠标指在 F 上里,VS 自动给出提示(21~22行附近)。
OK,就写到这里吧,使用委托简化代码这种方式的是是非非留给大家讨论吧!
-------------------
思想火花,照亮世界