当前位置:主页   - 电脑 - 程序设计 - C#
Effective C# 原则43:请勿滥用反射
来源:网络   作者:   更新时间:2012-03-20
收藏此页】    【字号    】    【打印】    【关闭

  创建二进制的组件时,同时也意味着你要使用迟后绑定和反射来查找你所须要的具有特殊功能代码。反射是一个很有力的工具,而且它让你可以写出可动态配置的软件。使用反射,一个应用程序可以通过添加新的组件来更新功能,而这些组件是在软件最开始发布时没有的。这是有利的。

  这一伸缩性也带来了一些复杂的问题,而且复杂问题的增加又会增加出现其它问题的可能。当你使用反射时,你是围绕着C#的安全类型。然而,成员调用的参数和返回值是以System.Object类型存在的。你必须在运行时确保这些类型是正确的。简单的说,使用反射可以让创建动态的程序变得很容易,但同时也让程序出现错误变得很容易。通常,简单的思考一下,你就可以通过创建一系列接口集合来最小化或者移除反射,而这些接口集合应该表达你对类型的假设。

  反射给了你创建类型实例的功能,以及在对象上调用成员方法,以及访问对象上的成员数据。这听上去就跟每天的编程任务是一样的。确实是这样的,对于反射,并没有什么新奇的:它就是动态创建其它的二进制组件。大多数情况下,你并不须要像反射这样的伸缩功能,因为有其它可选的更易维护的方案。

  让我们从创建一个给定类型的实例开始,你可以经常使用一个类厂来完成同样的任务。考虑下面的代码,它通过使用反射,调用默认的构造函数创建了一个MyType 的实例:

// Usage:Create a new object using reflection:
Type t = typeof( MyType );
MyType obj = NewInstance( t ) as MyType;
// Example factory function, based on Reflection:
object NewInstance( Type t )
{
 // Find the default constructor:
 ConstructorInfo ci = t.GetConstructor( new Type[ 0 ] );
 if ( ci != null )
  // Invoke default constructor, and return
  // the new object.
  return ci.Invoke( null );
 // If it failed, return null.
 return null;
}

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明