首页 文章详情

如何在 C# 中实现只读局部变量

DotNet NB | 28 2022-10-15 09:59 0 0 0
UniSMS (合一短信)

前言

最近在看 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";
}

结论

使用只读局部变量是一种编码风格,可以避免变量被误赋值。如果你喜欢这种编码风格,可以尝试一下ReadonlyLocalVariablesNuGet 包。


推荐阅读:
聊聊 dotnet 7 对 bool 与字符串互转的底层性能优化
一个C#开发的、跨平台的服务器性能监控工具
.NET 7 内容汇总--反射优化
.NET 6 之 ABP vNext 初体验
.NET6在浏览器显示系统日志
一个基于.NetCore开发、模块化、跨平台、多语言商城系统

点击下方卡片关注DotNet NB

一起交流学习

▲ 点击上方卡片关注DotNet NB,一起交流学习

请在公众号后台

回复 【路线图】获取.NET 2021开发者路线图
回复 【原创内容】获取公众号原创内容
回复 【峰会视频】获取.NET Conf开发者大会视频
回复 【个人简介】获取作者个人简介
回复 【年终总结】获取作者年终总结
回复 加群加入DotNet NB 交流学习群

长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。



good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter