【问题标题】:New Cool Features of C# 4.0 [closed]C# 4.0 的新酷特性 [关闭]
【发布时间】:2008-11-15 07:19:57
【问题描述】:

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

【问题讨论】:

    标签: c# .net c#-4.0


    【解决方案1】:

    动态的东西听起来很酷如果你需要它,但我不希望经常使用它。

    委托和接口的通用差异是相似的 - 目前缺乏差异是一个令人头疼的问题,但 C# 4 中可用的有限差异无法涵盖许多令人头疼的地方。

    我对 COM 功能并不特别感兴趣 - 我真的应该更多地了解它们是什么。

    在构建不可变类型时,可选参数和命名参数可能会产生很大的不同:它支持如下语法:

    Person p = new Person (name: "Jon", age: 32);
    

    没有构造函数重载的庞大组合。我更喜欢以只读自动实现的属性的形式编写不可变类型的更多支持,但我不希望我们会得到这些。 (目前它们肯定不在提议的功能列表中。)

    我个人实际上对 .NET 4.0 的几个 框架 功能更感兴趣 - 特别是 code contractsparallel extensions

    【讨论】:

    • 要添加此示例,请参阅:marcgravell.blogspot.com/2008/11/…
    • 如果您有一个小时可以消磨时间,该视频会提供丰富的信息...channel9.msdn.com/pdc2008/TL16
    • 命名参数也使布尔参数更加清晰。您想查看“True”还是“UseWidget: True”?
    • 我认为需要“动态内容”的惯用示例是 COM 互操作,尽管它破坏了我使用 IntelliSense 发现 API 的首选方法。
    • @Jurily:并非动态互操作的所有内容都需要破坏 IntelliSense。您可以使用动态的隐式转换,但指定目标类型,然后仍然在结果上具有 IntelliSense。基本上,这是一个折衷的解决方案。
    【解决方案2】:

    方法参数默认值:

    public void MyMethod1(string value1 = "test", int num1 = 10, double num2 = 12.2)
    {
      //...
    }
    

    也可能是匿名返回类型:

    public var MyMethod2()
    {
      // ..
    }
    

    【讨论】:

    • 那么参数默认值是否意味着我们可以这样称呼它们? obj.MyMethod1("测试",1);可以使用您提供的方法吗?
    • 这是我从 VB.NET 切换到 C# 时错过的第一件事。
    • 会起作用,变量看起来像:value1="test", num1=1, num2=12.2
    • 只要确保你理解how they work
    【解决方案3】:

    【讨论】:

    • 我不知道我是否会称他们为酷。我的同事如此虐待他们,我希望他们被删除。
    • @AndrewHoffman 任何非常有用的东西都有可能被滥用
    【解决方案4】:

    IDynamicObjectdynamic 后面的粘合剂,允许在运行时解释调用。

    这对于 REST、XML、COM、DataSet、动态语言和许多其他等固有的无类型场景很有趣。它是在Dynamic Language Runtime (DLR) 之上构建的dynamic dispatch 的实现。

    您可以点到声明为dynamic的变量,而不是繁琐的反射语义。想象一下使用 Silverlight 中的 Javascript 对象:

    dynamic obj = GetScriptObject();
    
    HtmlPage.Window.Alert(obj.someProperty);
    

    支持所有 C# 语法(我相信):

    HtmlPage.Window.Alert(obj.someMethod() + obj.items[0]);
    

    反射本身看起来更干净:

    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 是工具包中的另一个工具。它不会改变静态与动态的争论,它只是缓解了摩擦。

    【讨论】:

    • 天哪……没想过将对象转换为动态。这确实让反射变得更容易了!
    【解决方案5】:

    增强对Expression Trees的支持!

    【讨论】:

      【解决方案6】:

      严格来说不是 C#,但由于 .NET 被标记,这里有一个关于 BCL changes 的好链接。

      自我注意:必须在 4.0 发布之前重命名我的 Stopwatch.Restart() 扩展方法:)

      【讨论】:

        【解决方案7】:
        • C# 2.0 — 泛型(添加了 .NET Framework 支持,以及 C# 从中受益);迭代器模式(yield 关键字);匿名的 方法(委托关键字)、可空类型和空 合并运算符 (??)。
        • C# 3.0 — 匿名类型、扩展方法、对象初始化器、 集合初始化器,隐式类型的局部变量(var 关键字), lambda 表达式 (=>) 和 LINQ 查询表达式模式。
        • C# 4.0 — 可选参数和命名参数,动态 类型(动态类型)、改进的 COM-Interop 和 Contra 和 协方差。

        【讨论】:

          【解决方案8】:

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

          虽然我对它很感兴趣,但我也担心它会被过度使用,比如泛型和 LINQ、SQLCLR 等 :)

          【讨论】:

          • 我也担心过度使用动态。希望我可以在签入时添加样式检查
          • 泛型被过度使用?我同意 LINQ 有时会被过度使用......
          【解决方案9】:

          C#4.0

          1) PLinq

          2) 命名参数和可选参数

          3) 懒惰

          4) 协方差和反方差

          5) 任务并行

          6) 动态对象

          7) 扩展对象

          8) 改进的 COM 互操作

          9)元组

          仅举几例

          【讨论】:

            【解决方案10】:

            使用 asyncawait 以同步方式编写异步代码的能力很酷。

            【讨论】:

              猜你喜欢
              • 2012-01-22
              • 2010-10-04
              • 2010-09-05
              • 2020-04-11
              • 2011-02-10
              • 1970-01-01
              • 1970-01-01
              • 2011-07-24
              • 2010-09-19
              相关资源
              最近更新 更多