问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C#4.0的新特性

发布网友 发布时间:2022-10-14 00:02

我来回答

1个回答

热心网友 时间:2023-11-18 08:58

C#4.0加入了dynamic关键字,可以申明一个变量的static类型为dynamic。
在3.0及之前,如果你不知道一个变量的类型,而要去调用它的一个方法,一般会用到反射:
object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember(Add,BindingFlags.InvokeMethod, null,new object[] { 10, 20 });int sum = Convert.ToInt32(res);
有了dynamic,就可以把上面代码简化为:
dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);
使用dynamic的好处在于,可以不去关心对象是来源于COM, IronPython, HTML DOM或者反射,只要知道有什么方法可以调用就可以了,剩下的工作可以留给runtime。
dynamic也可以用在变量的传递中,runtime会自动选择一个最匹配的overload方法。
这里有一个demo:把一段javascript代码拷到C#文件中,将var改成dynamic,function改成void,再改一下构造函数的调用方式(new type()改为win.New.type()),去掉javascript中的win.前缀(因为这已经是C#的方法了),就可以直接运行了。
dynamic的实现是基于IDynamicObject接口和DynamicObject抽象类。而动态方法、属性的调用都被转为了GetMember、Invoke等方法的调用。
Named and optional parameters
带有可选参数方法的声明:
public StreamReader OpenTextFile(string path,Encoding encoding = null,bool detectEncoding = true,int bufferSize = 1024);
命名参数必须在最后使用:
OpenTextFile(foo.txt, Encoding.UTF8, bufferSize: 4096);
顺序不限:
OpenTextFile(bufferSize: 4096, path: foo.txt, detectEncoding: false);
Improved COM Interoperability
在C#中在调用COM对象如office对象时,经常需要写一堆不必要的参数:
object fileName = Test.docx;
object missing = System.Reflection.Missing.Value;
doc.SaveAs(ref fileName,ref missing, ref missing, ref missing,ref missing, ref missing, ref missing,ref missing, ref missing, ref missing,ref missing, ref missing, ref missing,ref missing, ref missing, ref missing);
4.0中就可以直接写成:
doc.SaveAs(Test.docx); 在C#中,下面的类型转换是非法的:
IList<string> strings = new List<string>();
IList<object> objects = strings;
因为你有可能会这样做,而编译器的静态检查无法查出错误:
objects[0] = 5;
string s = strings[0];
4.0中在声明generic的Interface及Delegate时可以加in及out关键字,如:
public interface IEnumerable<out T> : IEnumerable{IEnumerator<T> GetEnumerator();}public interface IEnumerator<out T> : IEnumerator{bool MoveNext();T Current { get; }}
public interface IComparer<in T>{public int Compare(T left, T right);}
out关键字的意思是说IEnumerable<T>中T只会被用在输出中,值不会被改变。这样将IEnumerable<string>转为IEnumerable<object>类型就是安全的。
in的意思正好相反,是说IComparer<T>中的T只会被用在输入中,这样就可以将IComparer<object>安全的转为IComparer<string>类型。
前者被称为Co-Variance, 后者就是Contra-Variance。
.Net4.0中使用out/in声明的Interface:
System.Collections.Generic.IEnumerable<out T>System.Collections.Generic.IEnumerator<out T>System.Linq.IQueryable<out T>System.Collections.Generic.IComparer<in T>System.Collections.Generic.IEqualityComparer<in T>System.IComparable<in T>
Delegate:
System.Func<in T, …, out R>System.Action<in T, …>System.Predicate<in T>System.Comparison<in T>System.EventHandler<in T> 4.0中增加了与编译器相关的API,这样就可以将字符串作为代码动态编译执行,跟javascript好像。
Video的最后,Anders做了一个很酷的demo,大概只用了二三十行代码,就实现了在控制台中直接执行C#语句,定义并调用函数,动态创建windows form,添加button等功能,看起来完全不逊色于Python,Ruby之类语言的控制台。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
路虎极光胎压按键在哪? 涛岛潜水学校住宿吗 涛岛潜水学校推荐 如何在抖音中进行自动旋转进全屏设置? 行政行为的分类是? 支付宝怎么交违章罚款 处理违章操作步骤 我的右肾已经重度积水了 还有多发性结石 医生说要切除 请问有什么好... 患病六年 医生说我的右肾多发结石并重度积水 已基本无功能了 建议切除... 男生突然留长发是不是心理抑郁的表现 “柘”这个字怎么读? 如何运用鼠标 请问,目前冷轧板,无缝管,矩形管(热轧的和不锈钢的),槽钢,角铁,201,304板分别是多少钱一吨? 一切法都如露亦如电,是什么意思? 如梦亦如幻,如露亦如电是什么意思啊? 如露亦如电,应作如是观的意思是什么? 如梦如幻,如露如电,应作如是观。 刻有“舍得”二字的石头在哪里? 舍不得这个词的由来 在德云社八位队长中,孟鹤堂为何被观众所认可? 头发打薄会越长越厚吗 孟鹤堂跳舞镜头公开,他的状态怎么样? 煎熬是不是这样写的? 煎熬的见怎么写 软化血管的食物有哪些 哪些食物能软化血管 除了Emotion、MIUI V5、Flyme以外还有哪些系统是基于安卓二次研发的? 网络上下载到的游戏源码,进行二次研发运营,如果被告,需要承担什么样的法律责任,如何赔偿以及需要承担 在唐的基础上二次研发,奔驰比亚迪合资的腾势X,比唐强在哪儿? 如果一个产品进行了二次研发会计科目怎么做 组装二次研发是委托还是合作 不属于现金流量经营活动产生的现金流量 下列项目中,不属于现金流量表中的投资活动的现金流出包括那些? 夏季天气炎热,有哪些适合懒人操作的神仙饮品呢? 请同事喝什么饮料比较好? 香港服务器传输文件慢可以怎么解决? 冰箱工作多久会自动停机一次 空调开到最低气温就漏水 空调漏水,室内机开冷风温度低的就会滴水。海尔的,该怎么办? 哆啦A梦:大雄与翼之勇者的电影原声 690G和MCP68PV主板整合芯片的比较 选择显卡和主板 想问买2020年会计教材是哪年考试 中国画作品有哪些 宁波厂房出租税有那些? 学习设计游戏需要学历吗 学习游戏动漫设计制作要什么学历 总是梦见男朋友出轨是什么意思 八月表白短句 新手机号怎么注册微信和设置? 怎样注册新的 具体操作步骤 向劳动者致敬演讲稿 去宜兴汽车城怎么坐公车 几路