C#4.0的新功能

C#4.0的新功能,c#,.net,c#-4.0,C#,.net,C# 4.0,你们正在寻找的最酷的新功能是什么,或者你们听说的是在c#4.0中发布的最酷的新功能。动态关键字看起来可以很好地弥合诸如IronRuby或IronPython等动态语言之间的差距,这可能有助于它在Microsoft单一文化中的采用。。。这让我很兴奋 虽然我对它很感兴趣,但我也担心它会被过度使用,比如泛型和LINQ、SQLCLR等:)如果需要,动态的东西听起来很酷,但我不希望经常使用它 委托和接口的通用差异是相似的——目前缺乏差异是一个令人头痛的问题,但C#4中有限的差异无法涵盖许多令人头疼的地方

你们正在寻找的最酷的新功能是什么,或者你们听说的是在c#4.0中发布的最酷的新功能。

动态关键字看起来可以很好地弥合诸如IronRuby或IronPython等动态语言之间的差距,这可能有助于它在Microsoft单一文化中的采用。。。这让我很兴奋


虽然我对它很感兴趣,但我也担心它会被过度使用,比如泛型和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和 协方差
C#4.0

1) 普林克

2) 命名参数和可选参数

3) 懒惰的

4) 协方差与抵销方差

5) 任务并行

6) 动态对象

7) Expando对象

8) 改进的COM互操作

9) 元组


仅举几个例子,使用asyncawait以同步方式编写异步代码的能力很酷。

我还担心动态代码的过度使用。希望我可以在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));
}