我正在为一群人编写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)
悲观的答案是无.如果想要更改数据,他们会.除了制作副本之外,你无能为力.
乐观的回答假设他们不想改变数据,你只需要保护他们不犯错误.现在这是可能的:
不要给他们任何安装者.您没有说出您的数据是什么样的,所以我只能给您一个模糊的描述:
不要暴露安装者.将它们的接口提供给没有setter的数据类,返回集合IEnumerable<>而不是它们可修改的实例,依此类推.确保通过界面访问您的数据,您的数据无法修改.
如果您正在寻找像 C++ 中那样的 const keywork 来防止数据的可变性,那么不幸的是,这并不存在。
您可以做的是传递不可变类(没有数据修改属性或方法的类)。-> 删除公共集;并且只使用只读方法