星期二的时候,看了几篇心理学的文章。里面说,人不知道在做什么的时候,有两种选择:1,什么都不做。2,去做点什么。
于是我昨天尝试着什么都不做,上上网,看看非技术书籍的书。结果发现,下午的时候,人就眼花了,然后脑袋一片空白,晚上回去,感觉精神有点恍惚,并且一直眼花。
今天早上,第一个想法,去做点什么。无聊翻开asp.net mvc,想学习学习看看别人怎么设计东西的。然后就看到一段代码,
public static void EndForm(this HtmlHelper htmlHelper)
这个方法的类是在 System.Web.Mvc.Html.FormExtensions 里的。一时看到这个 this,不知道有何用意?开始绞尽脑汁回想我那屁大专教育让我学的N门编程语言,里面是否有这个语言细节,还是没回想起来。于是乎开始 google,找了半年,就找到C# 函数参数类型名称前的就是 ref params out,三个修饰符。没有发现 this 的作用,于是乎,我又试着把这个 this 去掉,看会不会报错。结果编译通过。
偶然看到一位兄台的一篇文章,他回答的问题跟我的疑问风马牛不相及,但是他提供了一个方法,自己写点代码,自己去试一试,从头到尾的看看具体有什么不同。
于是乎,我写了两个的类
public class TestClass
{
public string MyName
{
get;
set;
}
public TestClass()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
public static string GetDefault()
{
return "he";
}
}
{
public string MyName
{
get;
set;
}
public TestClass()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
public static string GetDefault()
{
return "he";
}
}
public static class StaticClass
{
public static void Show(this TestClass test)
{
HttpContext.Current.Response.Write(test.MyName);
}
}
public static void Show(this TestClass test)
{
HttpContext.Current.Response.Write(test.MyName);
}
}
我的想法,是不是要这个 this, 才可以在静态方法中调用这个 TestClass 中的数据。结果去掉 this,测试一下
protected void Page_Load(object sender, EventArgs e)
{
TestClass test = new TestClass();
test.MyName = "me";
StaticClass.Show(test);
}
TestClass test = new TestClass();
test.MyName = "me";
StaticClass.Show(test);
}
毫无问题,显示 "me"。去掉Show 里面的 this 也没有问题。于是我想想,是不是对方法的访问会产生什么影响,
我增加了一个方法,就在增加一个方法的时候,出现了下图的东西,
观察发现,这个外部类可以调用 这个静态类里面的两个静态方法,不是说静态类没有 this 指针吗?但是如果真的可以这样
调用,那么就可以为 TestClass 在不改变他源代码的基础上去增加一个方法。我再在 asp.net mvc 里面去查找
public static MvcForm BeginForm
的所有引用,发现没有任何函数调用他。而 StaticClass 中的 Show方法,查找所有引用,却可以找到他的调用对象。这是
为什么呢?为什么写这个 BeginForm 没人调用? Ms 的技术人员吃饱了没事写个方法做摆设?
此时,仔细这个命名空间 System.Web.Mvc.Html.Extension , 关键字在 Extension. 一下答案和现象串联了起来。可以为
一个类在不改变源代码的情况下增加一个方法,不就是为了扩展方法的吗????由此总结,这种
public static void 方法名(this 类 )
是为了扩展某个类的方法而使用的一种技巧,非常神奇,原来那个类,都不用自己主动为自己写方法,调用时便可以获得一个别
人帮你写好的一个方法。
看来搜关键字,应该是为 “程序后续版本扩展” 或者 “为程序扩展方法”,而我先搜的却是 “方法名参数标识符”, “为什么方法参数中会有 this ”,这就是现象和本质的区别。
结案!
甚矣,吾之不慧!