我发现人们声称使用类中的所有只读字段并不一定使该类的实例不可变,因为即使在初始化(构造)之后,仍有"方法"来更改只读字段值.
怎么样?有什么方法?
所以我的问题是我们什么时候才能在C#中真正拥有一个"真正的"不可变对象,我可以安全地在线程中使用它?
匿名类型也创建不可变对象吗?有人说LINQ在内部使用了不可变的对象.究竟怎么样?
我是C#的新手(主要是C++程序员,Java是强大的第二个,而其他一些我不经常使用); 我正在使用C#和Unity,但我有一个似乎与C#相关的问题而不是Unity.
我一直在朝着功能风格的编程方向发展,即代替
// C++
int someFunction(int a) {
int someCalculatedValue = a * a;
someCalculatedValue /= 2;
return someCalculatedValue * 3;
}
Run Code Online (Sandbox Code Playgroud)
我会做这样的事情
// Again C++
int someFunction(int a) {
const int inputSquared = a * a;
const int inputSquaredHalved = inputSquared / 2;
return inputSquaredHalved * 3;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想在C#中做到这一点,但我已经尝试过了
// C#
const float maxGrowth = GrowthRate * Time.deltaTime;
Run Code Online (Sandbox Code Playgroud)
但Mono抱怨说,maxGrowth没有被赋予"常量值" - 所以我假设C#的const关键字实际上相当于来自C++ 11的'constexpr'?
如果是这样,有没有办法在C#中做我想做的事情?最好不要调用一些容器类(除非编译器擅长提高效率?).
我假设从我所读到的内容中,C#在语言方面比C++更接近于Java; 不可变类而不是const-member函数?