对于C++开发人员来说,它看起来很奇怪 在C++中,我们用来标记参数,const以确保它的状态不会在方法中改变.还有其他C++特定的原因,比如const ref为了传递ref而传递,并确保状态不会被更改.但是为什么我们不能在C#中标记为方法参数const?
为什么我不能像下面那样声明我的方法?
....
static void TestMethod1(const MyClass val)
{}
....
static void TestMethod2(const int val)
{}
....
Run Code Online (Sandbox Code Playgroud) 在C++中,传递const引用是一种常见的做法 - 例如:
#include <iostream>
using namespace std;
class X
{
public :
X() {m_x = 0; }
X(const int & x) {m_x = x; }
X(const X & other) { *this = other; }
X & operator = (const X & other) { m_x = other.m_x; return *this; }
void print() { cout << m_x << endl; }
private :
int m_x;
};
void main()
{
X x1(5);
X x2(4);
X x3(x2);
x2 = x1;
x1.print();
x2.print();
x3.print();
} …Run Code Online (Sandbox Code Playgroud) 可能重复:
C#中的"const correctness"
我已经编写了很多年的C++,但对C#来说还是比较新的.在学习C#时,我发现const关键字的使用比C++更有限.例如,AFAIK 没有办法向函数const声明参数.我觉得我可能无意中改变我的函数参数(可能是复杂的数据结构),我只能通过测试来检测,这让我感到很不舒服.
你是如何处理这种情况的?
在过去使用C++编程时,我记得我们可以在方法中创建一个常量引用/指针参数.
如果我的记忆是正确的,则下面的意思是该方法不能改变参考,并且参考本身是一个常量参考.
void DisplayData(const string &value) const
{
std::count << value << endl;
}
Run Code Online (Sandbox Code Playgroud)
C#中是否存在类中方法的等价物?
我问的原因是,我试图通过引用传递一个对象(速度),同时不希望任何人改变它.
可能重复:
C#中的"const correctness"
我怀疑constC#规范简化了一般语言的简单性.是否有一个特定的原因我们不能const像C++那样声明变量引用或方法?例如:
const MyObject o = new MyObject(); // Want const cast referenece of MyObject
o.SomeMethod(); // Theoretically legal because SomeMethod is const
o.ChangeStuff(); // Theoretically illegal because ChangeStuff is not const
class MyObject
{
public int val = 0;
public void SomeMethod() const
{
// Do stuff, but can't mutate due to const declaration.
}
public void ChangeStuff()
{
// Code mutates this instance. Can't call with const reference.
val++;
}
}
Run Code Online (Sandbox Code Playgroud) 来自C++背景并尝试学习C#,我遇到的最令人沮丧的语言遗漏之一就是const关键字.
所以,我一直试图找到一种可以用来在C#中实现const正确性的模式.
这个答案有一个有趣的建议:为你的所有类型创建一个只读界面.但正如Matt Cruikshank在评论中指出的那样,如果你的班级有收藏品或其他丰富类型,这就成了问题.特别是如果您无法控制类型,并且无法使其实现只读接口.
是否存在可以处理丰富类型和集合的任何模式或解决方案,或者我们是否强制在C#中进行复制?在C#中完全放弃const正确性是否更好?
我正在为一群人编写C#编码,我正在设计要编码的方法的签名,我需要一种方法来确保人们不会修改他们将收到的一些参数.它们接收大结构,因此它们通过引用发送,但我希望它们在不修改原始值的情况下使用数据.但由于结构很大,我们不想复制它们.
我们可以假设他们不想改变数据,我们只需要保护他们不犯错误.
C#提供哪些解决方案?
这是一个例子
Class MyDataBlok {
List<double> samples;
int someParams;
double lots of other params
}
Class MySetOfDataBlock
{
List<MyDataBlock> DataSet;
bool SomeParam;
Double lots of other params;
}
Class MethodsToBeCoded
{
ProcessSetOfData( /*some tag defining data as protected*/ MySetOfDataBlock data)
{
//Here I want code that uses data without modifying data
// nor the content on any data.DataSet[i]
}
}
Run Code Online (Sandbox Code Playgroud)