C#7.0中有哪些新特性?(4)

这是绕过占位符进入大数据结构的好方法。例如,一个游戏也许会将它的数据保存在大型预分配的阵列结构中(为了避免垃圾回收机制暂停)。方法可以将直接引用返回成一个结构,通过它的调用者可以读取和修改它。

也有一些限制,以确保安全:
•你只能返回“安全返回”的引用:一个是传递给你的引用,一个是指向对象中的引用。
•本地引用会被初始化成一个本地存储,并且不能指向另一个存储。

异步返回类型

到现在为止,C# 的异步方法必须返回 void,Task 或 Task<T>。C#7.0 允许其它类型以这种能从一个方法中返回的方式被定义,因为它们可以以异步方法被返回的方式来定义其它类型。

例如我们计划建立一个 ValueTask<T> 结构类型的数据。建立它是为了防止异步运行的结果在等待时已可用的情境下,对 Task<T> 进行分配。对于许多实例中设计缓冲的异步场景,这可以大大减少分配的数量并显著地提升性能。

Note:异步返回类型尚未在 Preview 4 中提供。

更多的 expression bodied 成员:

expression bodied 的方法和属性是对 C# 6.0 的巨大提升。C# 7.0 为 expression bodied 事件列表增加了访问器,结构器和终结器。

class Person
{
    private static ConcurrentDictionary<int, string> names = new ConcurrentDictionary<int, string>();
    private int id = GetId();
 
    public Person(string name) => names.TryAdd(id, name); // constructors
    ~Person() => names.TryRemove(id, out *);              // destructors
    public string Name
    {
        get => names[id];                                // getters
        set => names[id] = value;                        // setters
    }
}

Note:这些额外增加的 expression bodied 的成员尚未在 Preview 4 中提供。

这是社区共享的示例,而不是 Microsoft C# 编译团队提供的,还是开源的!

Throw 表达式

在表达式中间抛出一个异常是很容易的:只需为自己的代码调用一个方法!但在 C#7.0 中,我们允许在任意地方抛出一个表达式:

class Person
{
    public string Name { get; }
    public Person(string name) => Name = name ?? throw new ArgumentNullException(name);
    public string GetFirstName()
    {
        var parts = Name.Split(" ");
        return (parts.Length > 0) ? parts[0] : throw new InvalidOperationException("No name!");
    }
    public string GetLastName() => throw new NotImplementedException();
}

Note:Throw 表达式尚未在Preview 4中提供。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7d7cfaca8e66b848bb4b9bf1117e47b0.html