A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 段朝骞 中级黑马   /  2013-9-29 11:35  /  1910 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 段朝骞 于 2013-9-29 23:43 编辑

泛型与反射一直看的迷迷糊糊的,想问下他们的好处在哪里,希望能举个全面些的例子说明下泛型与反射的优点和使用方式

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

3 个回复

倒序浏览
// Declare the generic class.
public class GenericList<T>
{
    void Add(T input) { }
}
class TestGenericList
{
    private class ExampleClass { }
    static void Main()
    {
        // Declare a list of type int.
        GenericList<int> list1 = new GenericList<int>();
        // Declare a list of type string.
        GenericList<string> list2 = new GenericList<string>();
        // Declare a list of type ExampleClass.
        GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
    }
}
泛型概述
1. 类型可以最大限度地重用代码、保护类型的安全以及提高性能。
2. 创建集合类。
3. NET Framework 类库在 System.Collections.Generic 命名空间中包含几个新的泛型集合类。应尽可能地使用这些类来代替普通的类,如 System.Collections 命名空间中的 ArrayList。
4. 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
5. 可以对泛型类进行约束以访问特定数据类型的方法。
6. 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Using GetType to obtain type information:
int i = 42;
System.Type type = i.GetType();
System.Console.WriteLine(type);
输出为:
System.Int32
此示例使用反射获取已加载的程序集的完整名称:
// Using Reflection to get information from an Assembly:
System.Reflection.Assembly o = System.Reflection.Assembly.Load("mscorlib.dll");
System.Console.WriteLine(o.GetName());
输出为:
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

反射在下列情况下很有用:
1. 当需要访问程序元数据中的属性时。请参见主题使用反射访问属性。
2. 检查和实例化程序集中的类型。
3. 在运行时构建新类型。使用 System.Reflection.Emit 中的类。
4.  执行后期绑定,访问在运行时创建的类型的方法。请参见主题动态加载和使用类型。
回复 使用道具 举报
1.泛型是一种强类型。其处理速度要比普通类快。
2.泛型用来解决创建和使用新的数据类型。泛型也使不同场合的代码重用更加方便。
3.与传统的类相比,泛型更加高效。泛型模板可以提供传统类不能实现的代码重用,在某些情况下可以少些很多代码。
4.与传统类只能使用通用类型(如object)不同,泛型可以指定使用的类型,提供更好的类型保护。
5.性能和类型安全性大大提高。
如:
        Dim data As New Generic.List(Of Integer)
        data.add(5)
        data.add(new customer())'throw an exception
        data.add("Hello")'thore an exception


总结:
1.泛型允许我们创建类,结构,接口和方法模板,这些模板用于在运行时定义具体的类型。
2.泛型是过程和面向对象设计中的另一种代码重用机制。
3.泛型可以替代object类型的参数和变量的使用,这会带来性能的大幅提高并增加代码的可读性。


反射通常具有以下用途:

使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。

使用 Module 发现以下信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

使用 ConstructorInfo 发现以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。

使用 MethodInfo 发现以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。

使用 FieldInfo 发现以下信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。

使用 EventInfo 发现以下信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。

使用 PropertyInfo 发现以下信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。

使用 ParameterInfo 发现以下信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。

当您在一个应用程序域的仅反射上下文中工作时,请使用 CustomAttributeData 来了解有关自定义属性的信息。使用 CustomAttributeData,您不必创建属性的实例就可以检查它们。

System.Reflection.Emit 命名空间的类提供了一种特殊形式的反射,使您能够在运行时生成类型。

反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。

反射还有其他一些用途。JScript 等语言编译器使用反射来构造符号表。System.Runtime.Serialization 命名空间中的类使用反射来访问数据并确定要持久保存的字段。System.Runtime.Remoting 命名空间中的类通过序列化来间接地使用反射

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

回复 使用道具 举报
反射有什么好处呢?常用在什么地方
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马