首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中不可变的局部变量

C#中不可变的局部变量
EN

Stack Overflow用户
提问于 2014-06-24 20:59:46
回答 3查看 9.1K关注 0票数 16

我对C# (C++程序员主要是以Java作为强第二语言,还有一些是我使用的较少)还是很陌生的;我使用的是带有统一的C#,但我有一个似乎与C#相关的问题,而不是团结。

我在某种程度上转向了函数式编程,即不是

代码语言:javascript
复制
// C++
int someFunction(int a) {
    int someCalculatedValue = a * a;
    someCalculatedValue /= 2;
    return someCalculatedValue * 3;
}

我会做这样的事

代码语言:javascript
复制
// Again C++
int someFunction(int a) {
    const int inputSquared = a * a;
    const int inputSquaredHalved = inputSquared / 2;
    return inputSquaredHalved * 3;
}

现在,我想在C#中这样做,但我已经尝试过了

代码语言:javascript
复制
// C#
const float maxGrowth = GrowthRate * Time.deltaTime;

但是Mono抱怨说,maxGrowth没有被分配一个“常量值”--所以我假设C#的const关键字实际上等同于来自C++11的'constexpr‘?

如果是这样的话,有没有办法在C#中实现我想要的呢?最好不调用某些容器类(除非编译器擅长于提高效率?)。

我认为从我所读到的情况来看,C#在语言上比C++更接近于C++;不可变的类而不是const成员函数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-24 21:02:47

readonly

当字段声明包括只读修饰符时,对声明引入的字段的赋值只能作为声明的一部分或在同一个类中的构造函数中进行。

局部变量没有等效值。你得把它变成一个字段。

票数 18
EN

Stack Overflow用户

发布于 2014-12-19 16:46:48

可以将局部变量声明为迭代变量。迭代变量是只读的。是的,很丑。

代码语言:javascript
复制
foreach (float maxGrowth in new[] { GrowthRate * Time.deltaTime })
{
  maxGrowth = 0; // won't compile: "error CS1656: Cannot assign to 'maxGrowth' because it is a 'foreach iteration variable'"
}
票数 25
EN

Stack Overflow用户

发布于 2019-08-01 14:43:44

我认为更好的解决这个案子的方法是使用声明

示例:

代码语言:javascript
复制
using (var font = new Font("Arial", 10.0f)) 
{
    byte charset = font.GdiCharSet;
}

字体变量是不可变的

参考资料:

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24396179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档