C#4.0的新功能
你们正在寻找的最酷的新功能是什么,或者你们听说的是在c#4.0中发布的最酷的新功能。动态关键字看起来可以很好地弥合诸如IronRuby或IronPython等动态语言之间的差距,这可能有助于它在Microsoft单一文化中的采用。。。这让我很兴奋C#4.0的新功能,c#,.net,c#-4.0,C#,.net,C# 4.0,你们正在寻找的最酷的新功能是什么,或者你们听说的是在c#4.0中发布的最酷的新功能。动态关键字看起来可以很好地弥合诸如IronRuby或IronPython等动态语言之间的差距,这可能有助于它在Microsoft单一文化中的采用。。。这让我很兴奋 虽然我对它很感兴趣,但我也担心它会被过度使用,比如泛型和LINQ、SQLCLR等:)如果需要,动态的东西听起来很酷,但我不希望经常使用它 委托和接口的通用差异是相似的——目前缺乏差异是一个令人头痛的问题,但C#4中有限的差异无法涵盖许多令人头疼的地方
虽然我对它很感兴趣,但我也担心它会被过度使用,比如泛型和LINQ、SQLCLR等:)如果需要,动态的东西听起来很酷,但我不希望经常使用它 委托和接口的通用差异是相似的——目前缺乏差异是一个令人头痛的问题,但C#4中有限的差异无法涵盖许多令人头疼的地方 COM特性并没有让我特别感兴趣——我真的应该更多地了解它们是什么 在构建不可变类型时,可选参数和命名参数可能会产生很大的不同:它支持以下语法:
Person p = new Person (name: "Jon", age: 32);
没有构造函数重载的庞大组合。我更喜欢以只读自动实现属性的形式编写不可变类型,但我不希望我们得到这些。(它们目前肯定不在拟议的功能列表中。)
实际上,我个人对.NET 4.0的几个框架功能更感兴趣,尤其是方法参数默认值:
public void MyMethod1(string value1 = "test", int num1 = 10, double num2 = 12.2)
{
//...
}
也可能是匿名返回类型:
public var MyMethod2()
{
// ..
}
IDynamicObject
是dynamic
背后的粘合剂,允许在运行时解释调用
对于固有的非类型化场景,如REST、XML、COM、DataSet
、动态语言和许多其他场景,这很有趣。它是一个构建在基础之上的实现
与繁琐的反射语义不同的是,您将点入声明为dynamic
的变量中。想象一下使用Silverlight中的Javascript对象:
dynamic obj = GetScriptObject();
HtmlPage.Window.Alert(obj.someProperty);
支持所有C#语法(我相信):
反射本身看起来更干净:
public void WriteSomePropertyValue(object target)
{
Console.WriteLine((target as dynamic).SomeProperty);
}
public void WriteSomeMethodValue(object target, int arg1, string arg2)
{
Console.WriteLine((target as dynamic).SomeMethod(arg1, arg2));
}
dynamic
是工具箱中的另一个工具。它不会改变静态与动态的争论,它只是缓解了摩擦。增强了对的支持 严格来说不是C,但是由于.NET被标记,这里有一个很好的链接
self注意:在4.0发布之前,必须重命名我的Stopwatch.Restart()
扩展方法:)- C#2.0-泛型(.NET框架支持被添加,C# 从中受益);迭代器模式(yield关键字);匿名的 方法(委托关键字)、可为null的类型和null 凝聚算子(??)
- C#3.0-匿名类型、扩展方法、对象初始值设定项, 集合初始值设定项,隐式类型局部变量(var关键字), lambda表达式(=>)和LINQ查询表达式模式
- C#4.0-可选参数和命名参数,动态 类型(动态类型)、改进的COM互操作以及Contra和 协方差
仅举几个例子,使用async和await以同步方式编写异步代码的能力很酷。我还担心动态代码的过度使用。希望我可以在Checkingerics上添加样式检查是否过度使用?我同意LINQ有时被过度使用的说法…为了增加一个例子,请看:如果你有一个小时可以消磨时间,这段视频会提供信息。。。命名参数也使布尔参数更加清晰。您想看“True”还是“UseWidget:True”?我认为需要“动态内容”的惯用例子是COM互操作,尽管它破坏了我首选的使用IntelliSense进行API发现的方法。@July:关于动态互操作的所有内容都不需要破坏IntelliSense。您可以使用来自dynamic的隐式转换,但指定目标类型,然后仍然对结果具有IntelliSense。基本上,这是一个折衷的解决方案。那么参数默认值是否意味着我们可以这样调用它们?目标MyMethod1(“测试”,1);这是我在从VB.NET切换到C时错过的第一件事。这会起作用,变量看起来像:value1=“test”,num1=1,num2=12.2请确保你理解这些废话。。。。没有想过将对象强制转换为动态。这确实让反射更容易了!我不知道我会不会叫他们酷。我的同事们如此虐待他们,以至于我希望他们能被移除。@AndrewHoffman任何重要的有用的东西都有被滥用的权力
public void WriteSomePropertyValue(object target)
{
Console.WriteLine((target as dynamic).SomeProperty);
}
public void WriteSomeMethodValue(object target, int arg1, string arg2)
{
Console.WriteLine((target as dynamic).SomeMethod(arg1, arg2));
}