C# 7.0 添加和增强的功能【基础篇】( 四 )


// 其构造函数具有一个名为“name”的字符串参数,表达式主体定义向 Name 属性分配参数public class Location{private string locationName;public Location(string name) => Name = name;public string Name{get => locationName;set => locationName = value;}}终结器的表达式主体定义通常包含清理语句,例如释放非托管资源的语句 。
// 定义一个终结器,该终结器使用表达式主体定义来指示已调用该终结器public class Destroyer{public override string ToString() => GetType().Name;~Destroyer() => Console.WriteLine($"The {ToString()} finalizer is executing.");}索引器与使用属性一样,如果 get 访问器包含返回值的单个表达式或 set 访问器执行简单的赋值,则索引器 get 和 set 访问器包含表达式主体定义 。
using System;using System.Collections.Generic;// 其中包含一个内部 String 数组,该数组包含大量体育运动的名称// 索引器的 get 和 set 访问器都以表达式主体定义的形式实现public class Sports{private string[] types = { "Baseball", "Basketball", "Football","Hockey", "Soccer", "Tennis","Volleyball" };public string this[int i]{get => types[i];set => types[i] = value;}}八、ref 局部变量在变量类型之前添加 ref 关键字以声明 ref 局部变量 。
public ref Person GetContactInformation(string fname, string lname)// 对 p 进行的操作不会改变原方法的返回值Person p = contacts.GetContactInformation("Brandie", "Best");上面的分配将 p 声明为本地变量 。它的初始值是通过读取 GetContactInformation 返回的值进行复制 。之后对 p 的任何分配都不会更改 GetContactInformation 返回的变量值 。变量 p 不再是返回的变量的别名 。
声明引用本地变量,复制原始值的别名 。在下面的分配中,p 是从 GetContactInformation 返回的变量的别名 。
// 对 p 所做的更改,也会更改从 GetContactInformation 返回的变量ref Person p = ref contacts.GetContactInformation("Brandie", "Best");后续使用 p 等同于使用 GetContactInformation 返回的变量,因为 p 是此变量的别名 。
可通过相同方式按引用访问值 。在某些情况下,按引用访问值可避免潜在的高开销复制操作,从而提高性能 。
编译器对ref变量强制实施范围规则:ref类型中的ref struct局部变量、ref参数和ref字段 。这些规则可确保引用不会与引用的对象不相称 。
九、引用返回返回值可以通过引用返回 (ref 返回)。借助引用返回值,方法可以将对变量的引用(而不是值)返回给调用方 。然后,调用方可以选择将返回的变量视为按值返回或按引用返回 。
如果声明方法返回引用返回值,表明方法返回变量别名 。这样做通常是为了让调用代码有权通过别名访问此变量(包括修改它) 。因此,方法的引用返回值不得包含返回类型 void
引用返回值是指,方法返回对某变量的引用(或别名) 。
返回引用返回值的方法必须满足以下两个条件:
??1)方法签名在返回类型前面有ref关键字;
??2)方法主体中的每个 return 语句都在返回实例的名称前面有 ref 关键字 。
public ref Person GetContactInformation(string fname, string lname){return ref p;}

经验总结扩展阅读