+ -
当前位置:首页 → 问答吧 → 终于知道C#的动态类型有什么用了。

终于知道C#的动态类型有什么用了。

时间:2011-12-17

来源:互联网

先看下面这个函数
C# code

public static T Sum<T>(params T[] Args)
{
    T sum = Args[0];
    for (int i = 1; i < Args.Length; ++i)
    {
         sum += Args[i];
    }
    return sum;
}


在C++中这是最最基本的函数模板,但是在C#中代码通不过,因为泛型不是模板,它不会生成多份代码,T是当做object来处理的,因此不能用来进行加法运算。
但这样的加法泛型是非常有用的,最初的想法当然是使用泛型约束,然而不存在基本数据类型的一个基类或者借口,提供了加法运算。
好在C#4.0中添加了动态类型,有关动态类型的表达式都会在运行时求解,这样我们就有可能实现有针对性的加法运算:
C# code

public static T Sum<T>(params T[] Args)
{
    dynamic sum = Args[0];
    for (int i = 1; i < Args.Length; ++i)
    {
         sum += Args[i];
    }
    return sum;
}


经过测试代码通过了编译,并给出了正确的结果。
泪流满面,传说中的矩阵泛型类终于有实现的可能了。

作者: osyxz2011   发布时间: 2011-12-17

这叫泛型,你说有啥用,类似c++中的模板

作者: bdmh   发布时间: 2011-12-17

泛型约束能够帮助我们不出错,但有时它又管得太多了,使得它与模板相比有灵活性的缺失,而动态类型就可以突破这个限制,使我们得到类似于模板的体验。

作者: osyxz2011   发布时间: 2011-12-17

真能扯。你测试什么了?你拿(比如说)DbConnection类型的对象来来搞+运算了么?你肯定说“用DbConnection来测试这个+运算时吃饱了撑的,不可能给出正确结果”。是的,写出这样的代码其实就是自欺欺人的,你只有在运行时到某个时间才知道有多悲剧,此时已经完了。

编写强类型的程序,不是仅仅是为了提高一百倍性能,更主要地是为了保证软件品质!我想你都没有把握住这种原则,你的感觉现在还是“越是野路子越方便”。

作者: sp1234   发布时间: 2011-12-17