<li id="2aw4k"></li>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
    <center id="2aw4k"><small id="2aw4k"></small></center><center id="2aw4k"><small id="2aw4k"></small></center>
    首页»ASP.NET»微软C# 8.0中的几个特性

    微软C# 8.0中的几个特性

    来源:infoq.com 发布时间:2017-09-06 阅读次数:

      概述:可空的引用类型可概括地表述为,引用类型将不再默认可空。因此,开发人员必须使用定义可空值类型的同样语法“Type?”,显式地标记一个引用类型为可空。

     

      可空的引用类型(Nullable Reference Types)

      可空的引用类型可概括地表述为,引用类型将不再默认可空。因此,开发人员必须使用定义可空值类型的同样语法“Type?”,显式地标记一个引用类型为可空。

      如果将一个空值赋值给一个非可空的引用类型,那么将会给出一个编译器警告。与之相类似,从可空类型中读取?#19981;?#32473;出编译器警告,除非显式地提前检查了被质疑的变量是否为空值。因此从理论上讲,开发人员需要做的唯一更改就是在代码的适当位置标上问号。

      该特性?#24405;?#20102;一个语法。该语法针对开发人员明知一个可空变量x并非实际为空?#31561;次?#27861;证明给编译器的情况。在上述情况下,开发人员现在可以定义x!.Method(),消除编译器对于潜在空值引用异常的警告。

      异步流(Async Streams),即foreach async

      异步流是IEumerable的异步等价类。C#团队自2015以来就一直在努力实现异步流。在经历了很多争议后,其语法被定为

    foreach await (string s in asyncStream)

      开发人员将使用如下的函数签名定义一个异步迭代器:

    async IAsyncEnumerable MethodName()

      就像使用一个正常的IEnumerable方法一样,开发人员可以使用“yield return”以懒方式(Lazy)构建对象流。

      相比于源自响应式扩展(Reactive Extensions)的IObservable,使用这一方法的优点在于让消费者控制流速,这被称为“Pull模式”。与之相对,IObservable是一种“Push模式”,这意味着生产者可以使用高于消费者所能处理的流速让流涌向消费者。

      缺省?#28044;?#23454;现(Default Interface Implementations)

      缺省?#28044;?#23454;现在本质上是一种有限形式的多重继承。它允许抽象?#28044;?#20687;抽象类一样,对方法进?#22411;?#20840;的定义,只是抽象?#28044;?#20381;然不能定义构造函数和字段。

      需注意,开发人员可以通过使用ConditionalWeakTable在?#28044;?#19978;模拟字段。

      默认?#28044;?#23454;现的主要?#20040;?#26159;,开发人员可以在不破坏向后兼容的条件下,将一个新方法添加到一个已有的?#28044;?#20013;。但是这并非是有保证的,因为默认?#28044;?#21482;是在可以设计出适合的默认方法时才能工作。

      扩展(Extension)

      开发人员可以编写扩展方法,但是不能扩展属性,这是长期以来对C#一直存在的一个问题。事实上,如果使用当前的模式,甚至是不能定义一个扩展属性或?#24405;?#30340;。此外,在很多开发人员看来,在静态类中放置扩展方法是“很诡异的”。

      新的设计中新给出了一种称为“扩展”(Extension)的顶层语言构件。例如,如果开发人员想要为自定义的Customer类创建一个扩展方法和属性,可编写如下代码:

    extension CustomerExt extends Customer {
        //定义方法和属性的代码。
    }

      就?#28044;?#32780;言,是不能在扩展中定义实例字段的,但是可以使用ConditionalWeakTable实现模拟。定义静态字段也是允许的。

      除了对属性、?#24405;?#21644;操作符重载的扩展,C#团队甚?#37327;?#34385;允许扩?#26500;?#36896;函数。扩?#26500;?#36896;函数非常适用于工厂模式(Factory)和对象池场景。

      扩展?#28044;冢‥xtension Interfaces)

      C#团队还考虑了扩展?#28044;冢?#21363;在已有类中添加新?#28044;?#30340;能力。但是扩展?#28044;?#23558;不会成为C# 8中的特性,因为它需要更改底层的运行时。

    QQ群:WEB开发者官方群(515171538),验证消息:10000
    微信群:加小编微信 849023636 邀请您加入,验证消息:10000
    提示:更多精彩内容关注微信公众号:全栈开发者中?#27169;╢sder-com)
    C#
    网友评论(共0条评论) 正在载入评论......
    理智评论文明上网,拒绝恶意谩骂 发表评论 / 共0条评论
    登录会员中心
    大乐透彩票预测
    <li id="2aw4k"></li>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
    <center id="2aw4k"><small id="2aw4k"></small></center><center id="2aw4k"><small id="2aw4k"></small></center>
    <li id="2aw4k"></li>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
    <center id="2aw4k"><small id="2aw4k"></small></center><center id="2aw4k"><small id="2aw4k"></small></center>