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

问题描述

先看下面这个函数publicstaticTSum<T>(paramsT[]Args){Tsum=Args[0];for(inti=1;i<Args.Length;++i){sum+=Args[i];}returnsum;}

在C++中这是最最基本的函数模板,但是在C#中代码通不过,因为泛型不是模板,它不会生成多份代码,T是当做object来处理的,因此不能用来进行加法运算。但这样的加法泛型是非常有用的,最初的想法当然是使用泛型约束,然而不存在基本数据类型的一个基类或者借口,提供了加法运算。好在C#4.0中添加了动态类型,有关动态类型的表达式都会在运行时求解,这样我们就有可能实现有针对性的加法运算:publicstaticTSum<T>(paramsT[]Args){dynamicsum=Args[0];for(inti=1;i<Args.Length;++i){sum+=Args[i];}returnsum;}

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

解决方案

本帖最后由 osyxz2011 于 2011-12-17 17:13:36 编辑
解决方案二:
这叫泛型,你说有啥用,类似c++中的模板
解决方案三:
泛型约束能够帮助我们不出错,但有时它又管得太多了,使得它与模板相比有灵活性的缺失,而动态类型就可以突破这个限制,使我们得到类似于模板的体验。
解决方案四:
真能扯。你测试什么了?你拿(比如说)DbConnection类型的对象来来搞+运算了么?你肯定说“用DbConnection来测试这个+运算时吃饱了撑的,不可能给出正确结果”。是的,写出这样的代码其实就是自欺欺人的,你只有在运行时到某个时间才知道有多悲剧,此时已经完了。编写强类型的程序,不是仅仅是为了提高一百倍性能,更主要地是为了保证软件品质!我想你都没有把握住这种原则,你的感觉现在还是“越是野路子越方便”。
解决方案五:
dynamic主要是用在反射上的吧
解决方案六:
引用3楼sp1234的回复:

真能扯。你测试什么了?你拿(比如说)DbConnection类型的对象来来搞+运算了么?你肯定说“用DbConnection来测试这个+运算时吃饱了撑的,不可能给出正确结果”。是的,写出这样的代码其实就是自欺欺人的,你只有在运行时到某个时间才知道有多悲剧,此时已经完了。编写强类型的程序,不是仅仅是为了提高一百倍性能,更主要地是为了保证软件品质!我想你都没有把握住这种原则,你的感觉现在还是……

这确实有问题,如果不能进行+运算那么就会抛出一个Microsoft.CSharp.RuntimeBinder.RuntimeBinderException我做的测试是Sum(1.GetType(),2.GetType());我也想强类型,但这是我所知道的唯一能够对不同类型进行不同加法的方法,你不服的话,我想只能跪求MS推出模板,或者给基本类型实现一个INumber接口。当然如果你编程连异常处理都不愿意做,那我承认我的方法够SB

时间: 2024-09-30 19:29:16

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

转 解析JDK 7的动态类型语言支持

Java虚拟机的字节码指令集的数量自从Sun公司的第一款Java虚拟机问世至JDK 7来临之前的十余年时间里,一直没有发生任何变化[1].随着JDK 7的发布,字节码指令集终于迎来了第一位新成员--invokedynamic指令.这条新增加的指令是JDK 7实现"动态类型语言(Dynamically Typed Language)"支持而进行的改进之一,也是为JDK 8可以顺利实现Lambda表达式做技术准备.在这篇文章中,我们将去了解JDK 7这项新特性的出现前因后果和它的意义. 动

Python语言中动态类型的实现

大多数编译型语言,变量在使用前必须先声明,其中的 C 语言更加苛刻:变量声明必须位于代码块最开始,且在任何其他语句之前.其它语言,像C++和Java,允许"随时随地"声明变量,比如,变量声明可以在代码块的中间,不过仍然必须在变量被使用前声明变量的名字和类型. 在Python 中,无需此类显式变量声明语句,变量在第一次被赋值时自动声明,Python 中不但变量名无需事先声明,而且也无需类型声明.Python 语言中,对象的类型和内存占用都是运行时确定的.尽管代码被编译成字节码,Pytho

微型ORM——用VB和C#编写的动态类型ORM,只有160行

近来ORM变得越来越普遍,这都归于一种很具说服力的原因:它可以使开发数据库驱动的应用程序变得 更快.更省力.但是ORM框架都有点"固执己见",他们期望开发者遵从特定的规则,当规则被打破的时 候就非常难以使用.最通常的规则之一就是,存储过程必须总是返回单独的结果集,其中带有一致的列的 列表.不幸的是,有很多这样的存储过程,其中返回的数据的结果根据它自身内部逻辑的不同而不同.例 如,一个存储过程可能会接受一个参数,它表示要返回那些列,而另一个参数表示如果它包含了所有行, 那么就对其进行合计

Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示

Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http://www.cnblogs.com/dunitian/p/5221058.html 平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html#skill 先安装一下Dapper(建议用nuget包来管理) 连接字符串: s

python进阶教程之动态类型详解_python

动态类型(dynamic typing)是Python另一个重要的核心概念.我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值.这些都与动态类型的概念相关. 动态类型 在我们接触的对象中,有一类特殊的对象,是用于存储数据的.常见的该类对象包括各种数字,字符串,表,词典.在C语言中,我们称这样一些数据结构为变量.而在Python中,这些是对象. 对象是储存在内存中的实体.但我们并不能直接接触到该对象.我们在程序中写的对象名,只是指向这一对象的引用(

解析C++中的虚拟函数及其静态类型和动态类型_C 语言

虚拟函数是C++语言引入的一个很重要的特性,它提供了"动态绑定"机制,正是这一机制使得继承的语义变得相对明晰. (1)基类抽象了通用的数据及操作,就数据而言,如果该数据成员在各派生类中都需要用到,那么就需要将其声明在基类中:就操作而言,如果该操作对各派生类都有意义,无论其语义是否会被修改或扩展,那么就需要将其声明在基类中. (2)有些操作,如果对于各个派生类而言,语义保持完全一致,而无需修改或扩展,那么这些操作声明为基类的非虚拟成员函数.各派生类在声明为基类的派生类时,默认继承了这些非

Python进阶09 动态类型

原文:Python进阶09 动态类型 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢TeaEra, 猫咪cat   动态类型(dynamic typing)是Python另一个重要的核心概念.我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值.这些都与动态类型的概念相关.   动态类型 在我们接触的对象中,有一类特殊的对象,是用于存储数据的.常见的该类对象包括各种数字,字

.NET 4.0 之 Dynamic 动态类型

一..NET4.0主要新特性 .NET4.0在.Net3.5基础上新增的主要特性有:可选参数.命名参数和Dynamic.具体请阅生鱼片的这篇博文.这里我们着重讲解C#4.0的Dynamic特性,对于其他特性大家可以在VS2010内尝试一下.总之.Net在不断进步中. 二.ExpandoObject普通应用 ExpandoObject 类,"需引用System.Dynamic命名空间" .请看以下代码: dynamic Customer = new ExpandoObject(); Cu

动态语言、动态类型语言、静态类型语言、强类型语言、弱类型语言介绍_其它综合

关于如题这几个概念,大部分人应该比较熟悉,但是我昏了好久,所以写下来加深印象. 1. 动态语言 又叫动态编程语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如众所周知的ECMAScript(JavaScript)便是一个动态语言.除此之外如Ruby.Python等也都属于动态语言,而C.C++等语言则不属于动态语言. 而其实我们平时说的"动态语言"应该指的是"动态类型语言".至少我之前一直是这么认为的. 2. 动态类