我眼中委托的真正面貌(二)
2009-05-07 08:26:49 来源:WEB开发网核心提示: 其实,对于已经创建好的方法,我眼中委托的真正面貌(二)(8),其本身无所谓隶属于谁,哪个线程调用,使其本身可以灵活调用这些方法——也就是说,借助委托,它便可被看做是谁的方法,这种情况与方法的跨类调用不同 —— 因为一个方法隶属于哪个类本是一目
其实,对于已经创建好的方法,其本身无所谓隶属于谁,哪个线程调用,它便可被看做是谁的方法。这种情况与方法的跨类调用不同 —— 因为一个方法隶属于哪个类本是一目了然的事情。在这里,你可以稍稍回想一下我们在前面得出的一个很关键的结论:C#中的委托实例能够非常灵活的兼容对象与方法的特质——我认为这是上述技术得以实现的关键所在!
在C#中,要人为控制一个方法隶属于哪个线程不太容易,然而,要控制一个对象属于某一个固定的线程却很简单——只要让目标对象在这个线程里被创建就可以了!这就可以解释为什么上述代码要凭借委托来实现了:既然我们不能控制一个方法隶属于某一个线程,那么便不妨通过控制委托这种特殊的对象来间接控制挂载于它上面的方法和相关线程的隶属关系!这便实现了如何安全的通过委托进行方法的跨线程调用。
我们再回过头来看,事实上,SetText()方法第一次被调用时确实被看做是子线程的方法,因为是子线程调用了它,然而,第二次的情况不同,显然,方法的第二次调用触发时,依然是子线程相对占据统治地位,并且恰恰是它控制委托对象对目标方法进行了第二次调用。然而该方法却是被主线程中创建的委托对象调用的,自然而然也就隶属于主线程了。这论证了先前我关于“假如我们通过已声明的委托对象来调用相应的方法,C#的编译器将自动将其作为本类的声明方法来对待(从C#编译器的安全角度来论证,这个说法是行得通的)”这个观点,只不过这里的编译器安全性已不再是针对类对象,而是针对线程对象而言了。
这样一来,讨论的中心再度回归到“委托(实例化对象)兼具对象与方法二者的特性”这个主题上来:委托实例本身就是以对象的形式而存在的,同时它又可以挂接方法,使其本身可以灵活调用这些方法——也就是说,借助委托,我们实现了方法的对象化。(未完待续)
更多精彩
赞助商链接