Let the storm money come!

闲来无聊,随便看下asp.net Mvc 的收获

        从星期一,一直无聊到今天,老板都没安排我事做,但是他们都忙得要死。

        星期二的时候,看了几篇心理学的文章。里面说,人不知道在做什么的时候,有两种选择: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 static class StaticClass
{
    
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);
    }
     毫无问题,显示 "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 ”,这就是现象和本质的区别。

      结案!
     
                 甚矣,吾之不慧!
    
posted @ 2009-10-15 14:00  精密~顽石  阅读(3269)  评论(27编辑  收藏  举报
在通往地狱的路上,加班能使你更快到达。