上面代码看了很久,没看出有什么特别之处呀,与调用接口一样吧。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class Coffee
{
public string GetName()
{
return "You selected Maxwell coffee.";
}
}
public class Juice
{
public string GetName()
{
return "You selected orange juice.";
}
}
namespace ConsoleApplication1
{
class Program
{
static private Object GetDrink(int i)
{
if (i == 1)
{
return new Juice();
}
else // default
{
return new Coffee();
}
}
static void Main(string[] args)
{
Console.WriteLine("Please Select Your Drink: 1 -- Juice; 2 -- Coffee");
int nDrinkType = Console.Read();
dynamic drink = GetDrink(nDrinkType);
Console.WriteLine(drink.GetName());
Console.ReadLine();
Console.ReadLine();
}
}
}
C#编译器允许你通过dynamic对象调用任何方法,即使这个方法根本不存在,编译器也不会在编译的时候报编译错误。只有在运行的时候,它才会检查这个对象的实际类型,并检查在它上面GetName()是什么意思。动态类型将使得C#可以以更加统一而便利的形式范围下列对象: 来自动态编程语言——如Python或Ruby——的对象
通过IDispatch访问的COM对象
通过反射访问的一般.NET类型
结构发生过变化的对象——如HTML DOM对象
当我们得到一个动态类型的对象时,不管它是来自COM还是IronPython、HTML DOM还是反射,只需要对其进行操作即可,动态语言运行时(DLR)会帮我们指出针对特定的对象,这些操作的具体意义。这将给我们的开发带来极大的灵活性,并且能够极大程度上地精简我们的代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class Coffee
{
public string GetName()
{
return "You selected Maxwell coffee.";
}
}
public class Juice
{
public string GetName()
{
return "You selected orange juice.";
}
}
namespace ConsoleApplication1
{
class Program
{
static private Object GetDrink(int i)
{
if (i == 1)
{
return new Juice();
}
else // default
{
return new Coffee();
}
}
static void Main(string[] args)
{
Console.WriteLine("Please Select Your Drink: 1 -- Juice; 2 -- Coffee");
int nDrinkType = Console.Read();
dynamic drink = GetDrink(nDrinkType);
Console.WriteLine(drink.GetName());
Console.ReadLine();
Console.ReadLine();
}
}
}
C#编译器允许你通过dynamic对象调用任何方法,即使这个方法根本不存在,编译器也不会在编译的时候报编译错误。只有在运行的时候,它才会检查这个对象的实际类型,并检查在它上面GetName()是什么意思。动态类型将使得C#可以以更加统一而便利的形式范围下列对象: 来自动态编程语言——如Python或Ruby——的对象
通过IDispatch访问的COM对象
通过反射访问的一般.NET类型
结构发生过变化的对象——如HTML DOM对象
当我们得到一个动态类型的对象时,不管它是来自COM还是IronPython、HTML DOM还是反射,只需要对其进行操作即可,动态语言运行时(DLR)会帮我们指出针对特定的对象,这些操作的具体意义。这将给我们的开发带来极大的灵活性,并且能够极大程度上地精简我们的代码。
解决方案 »
- C# arraylist小问题
- 如果我把一个窗口的控件 设置为public
- 压缩文件出错
- 关于水晶报表的问题
- byte 的 类型转换
- 请教一个Reporting Service嵌入到自己页面的高难度问题,请高手进入!!!
- 远程不断变化中的文件数据怎么样读取?
- 大家都来挑战一下难度!考试系统找出作弊的人!
- 请教各位:我的ComboBox 的DropDownstyle是DropDown,但将item添加进去以后,点击其中的一项,但Text只能高亮显示,但没有文字。(急,在
- 需要C#的公司,是否兼收VB.net的程序员?
- System.Media.SoundPlayer能否获取其状态?
- C# 如何屏蔽 Win 组合键
是 .net4 的最新特点。应该是动态加载,像反射一样。
(晕,这么一解释差不多都把问题给解决了)
就个人的见解,已经1楼写过了。就是为了增加代码可读性,局部的一个类型而已。其实也就是个语法糖。.net的每一次升级都会给我们很多语法糖,语法糖的好处就是让代码整洁,思路清晰,你一定要追究确切的存在意义,其实并没有,你用vs2005(不推荐2003是因为foreach对值类型装箱拆箱的效率影响)也一样能写的很漂亮。不过有些个别情况。就会有点丑陋。语法糖遍布我们的编程过程。例如正则中的(?n)模式。
(?:aa|bb)(?:aa|bb)(?:aa|bb)(?:aa|bb)如果我不需要分组,只想分块,我就可以这样写,但是累赘
这样一个表达式,可以用(?n)标记出来变为
(?n)(aa|bb)(aa|bb)(aa|bb)(aa|bb)
以上2个表达式等效,效率都一样。所以我认为的就是一个编码的优化,提高可读性的。
其实没有哪个情况必须用这个的。不过你可以继续挂着这个帖子。等高人进来给你分析一下什么情况,用这个动态类型是能很好的减少代码量。
vb的晚绑定,.net下不是用object的转换或装箱拆箱,或是 隐式类型var 可以实现类似的效果么。
匿名函数 用完就扔 不想起个名字
动态类型 用完就扔 不想起个文件(类型 是数据的一种组织方式,我临时定义数据的组织)关于动态类型 <悟透javascript> 用佛学来讲 讲的非常不错的说
with(myBll.GetInfo())
{
Consol.WriteLine(.Code);
}
说起匿名,真搞不懂C#为什么要把with丢掉。
如下多方便呀:with(myBll.GetList())
{
Consol.WriteLine(.Code);
}
//我现在用了很多ni名函数,目前可能在滥用之中,就像当时刚引入继承时,一个简单的界面整出十层一样。
//现在一个窗体最多继承三层,如要新增相近的窗体,直接复制。
//用ni名函数把事件定义放在窗体的构造函数里,这样硬写事件定义就不怕事件在控件的复制过程中丢失了。
btnSelCd.Click += new System.EventHandler(delegate(object sender, EventArgs e) //选择产品
{
SelItm f = new SelItm();
f.CreateParam = string.Format("CD:{0}", txtCd.Text); //参数,当然也可以f.txtCd.Text = this.txtCd.Text (Modifier改为public)
if (f.ShowDialog() == DialogResult.OK)
{
txtCd.Text = f.tGetValue();
with(f.GetValues()) //X
{
txtDescription.Text = .Dscr; //X
txtUnit.Text = .Unit; //X
}
}
f.Dispose();
//
using new SelItm()
{
//add code here
}});
with(myBll.GetInfo())
{
Consol.WriteLine(.Code);
}//老是这样或那样的粗心,在电脑面前一直碰壁,每次写的代码都不自信,要时不时地运行调试,基本上的时间都耗在调试上了。像我这种人去开车,在开车之前一定要先按下保存,以防万一。