这是绕过占位符进入大数据结构的好方法。例如,一个游戏也许会将它的数据保存在大型预分配的阵列结构中(为了避免垃圾回收机制暂停)。方法可以将直接引用返回成一个结构,通过它的调用者可以读取和修改它。
也有一些限制,以确保安全:
•你只能返回“安全返回”的引用:一个是传递给你的引用,一个是指向对象中的引用。
•本地引用会被初始化成一个本地存储,并且不能指向另一个存储。
异步返回类型
到现在为止,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中提供。