前言
最近在看 Scala 语言,发现 Scala 定义变量可以使用 var(可变变量)和 val(不可变变量)。
其中,var 定义的变量可以被重新赋值,而 val 定义的变量具有在整个程序中保持不变的固定值,任何更改该值的尝试都会导致错误:
那么,在 C# 中有对应的语法吗?
现有语法
C# 可以声明只读字段,只能在字段声明和构造函数中赋值:
class Age
{
private readonly int _year;
Age(int year)
{
_year = year;
}
void ChangeYear()
{
//_year = 1967; // Compile error if uncommented.
}
}
但不能为局部变量添加此关键字:
其实,C# 官方早在 2017 年就对“只读局部变量”这个设计开启了讨论:
但是截止目前还没有定论。
不过val
作为关键字倒是已经被否决,因为val
不是保留字,可能已经在你的代码中被大量使用了:
var val = 0;
那么,能不能用其他方式实现只读局部变量呢?
Demo
只需为你的项目添加 NuGet 包 ReadonlyLocalVariables
,不修改任何代码,再次编译,你会发现将禁止重新为局部变量分配值:
其实是因为这个 NuGet 包创建了一个代码分析器,会在编译时进行检查。
需要注意的是,添加此 NuGet 包后,所有局部变量都将是只读的了。如果出于某种原因,需要为局部变量重新分配值,则可以声明ReassignableVariable
特性指定重新分配的局部变量名称:
[ReassignableVariable("local")]
void Demo()
{
var readonly_local = 0;
var local = "Hello";
local = "MyIO";
}
结论
使用只读局部变量是一种编码风格,可以避免变量被误赋值。如果你喜欢这种编码风格,可以尝试一下ReadonlyLocalVariables
NuGet 包。
推荐阅读: 聊聊 dotnet 7 对 bool 与字符串互转的底层性能优化 一个C#开发的、跨平台的服务器性能监控工具 .NET 7 内容汇总--反射优化 .NET 6 之 ABP vNext 初体验 .NET6在浏览器显示系统日志 一个基于.NetCore开发、模块化、跨平台、多语言商城系统 点击下方卡片关注DotNet NB
一起交流学习
▲ 点击上方卡片关注DotNet NB,一起交流学习
请在公众号后台
回复 【路线图】获取.NET 2021开发者路线图 回复 【原创内容】获取公众号原创内容 回复 【峰会视频】获取.NET Conf开发者大会视频 回复 【个人简介】获取作者个人简介 回复 【年终总结】获取作者年终总结 回复 【加群】加入DotNet NB 交流学习群 长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。