关键字以声明 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;}
十、弃元弃元是一种在应用程序代码中人为取消使用的临时虚拟变量 。弃元相当于未赋值的变量;它们没有值 。
弃元将意图传达给编译器和其他读取代码的文件:你打算忽略表达式的结果、元组表达式的一个或多个成员、方法的 out
参数或模式匹配表达式的目标 。
弃元使代码意图更加明确 。弃元指示代码永远不会使用变量 。它们可以增强其可读性和可维护性 。
通过将下划线 (_
) 赋给一个变量作为其变量名,指示该变量为一个占位符变量 。
// 以下方法调用返回一个元组,其中第一个值和第二个值为弃元 。// area 是以前声明的变量 , 设置为由 GetCityInformation 返回的第三个组件(_, _, area) = city.GetCityInformation(cityName);
当 _
是有效弃元时,尝试检索其值或在赋值操作中使用它时会生成编译器错误 CS0301:“当前上下文中不存在名称 "_"” 。出现此错误是因为 _
未赋值 , 甚至可能未分配存储位置 。如果它是一个实际变量,则不能像之前的示例那样对多个值使用弃元 。
独立弃元用来指示要忽略的任何变量 。
一种典型的用法是使用赋值来确保一个参数不为 null
。下面的代码使用弃元来强制赋值 。赋值的右侧使用 Null
合并操作符 , 用于在参数为 null
时引发 System.ArgumentNullException
。此代码不需要赋值结果 , 因此将对其使用弃元 。
// 使用弃元来强制赋值// 赋值的右侧使用 Null 合并操作符,用于在参数为 null 时引发 System.ArgumentNullException// 此代码不需要赋值结果,因此将对其使用弃元public static void Method(string arg){_ = arg ?? throw new ArgumentNullException(paramName: nameof(arg), message: "arg can't be null");}
十一、二进制文本固定值称为文字 。文字是变量使用的值 。
在 C# 7.0
之前,有六种类型的文字可用 , 它们是一个
推荐阅读
- AgileBoot - 如何集成内置数据库H2和内置Redis
- 启初和小浣熊面霜哪个好_启初跟小浣熊哪个更好
- 3050和3050ti的差距_3050和3050ti差多少
- 华为nova9和华为nova9pro的区别_华为nova9和华为nova9pro有什么不同
- 荣耀magic3怎么设置指纹解锁_添加指纹解锁步骤
- TCP 序列号和确认号是如何变化的?
- 二 SpringCloud - Eureka注册中心,feign远程调用,hystrix降级和熔断
- 其三 Gitea 1.18 功能前瞻:增强文本预览效果、继续扩展软件包注册中心、增强工单实用功能、完善了用户邀请机制和SEO
- 华为watch3pro尊享版和时尚版区别_哪款更值得入买
- 雅萌ace和max的区别_雅萌ace和max的参数