我是C#的新手(主要是C ++程序员,Java是强大的第二,而其他一些我经常使用);我在Unity中使用C#,但我有一个似乎与C#相关的问题,而不是Unity。
我一直在向功能风格的节目转变,而不是
// C++
int someFunction(int a) {
int someCalculatedValue = a * a;
someCalculatedValue /= 2;
return someCalculatedValue * 3;
}
我做这样的事情
// Again C++
int someFunction(int a) {
const int inputSquared = a * a;
const int inputSquaredHalved = inputSquared / 2;
return inputSquaredHalved * 3;
}
现在,我想在C#中这样做,但我已尝试过这个
// C#
const float maxGrowth = GrowthRate * Time.deltaTime;
但Mono抱怨说,maxGrowth并没有被分配一个恒定的价值' - 所以我假设C#的const关键字实际上等同于' constexpr'来自C ++ 11?
如果是这样,有没有办法在C#中做我想做的事情?最好不要调用某个容器类(除非编译器擅长提高效率?)。
我认为从我所读到的C#中,C语言在语言上比C ++更接近于Java;不可变类而不是const-member函数?
答案 0 :(得分:17)
您可以将局部变量声明为迭代变量。迭代变量是只读的。 是的,这很难看。
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'"
}
答案 1 :(得分:10)
答案 2 :(得分:-1)
我相信这种情况的更好方法是使用语句
示例:
using (var font = new Font("Arial", 10.0f))
{
byte charset = font.GdiCharSet;
}
font变量是不可变的
参考:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement