我在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]
}
}
答案 0 :(得分:5)
悲观的回答是无。如果想要更改数据,他们将。除了制作副本之外,你无能为力。
乐观的回答假设他们不希望更改数据,您只需要保护他们不犯错误。现在这是可能的:
不要给他们任何安装人员。你没有说出你的数据是什么样的,所以我只能给你一个模糊的描述:
不要暴露安装者。将它们的接口提供给没有setter的数据类,将集合返回为IEnumerable<>
而不是它们可修改的实例,依此类推。确保通过界面访问您的数据,您的数据无法修改。
答案 1 :(得分:0)
如果您正在寻找像C ++中的const键工作来防止数据的可变性,那么不幸的是,这不存在。
您可以做的是传递不可变类(没有数据修改属性或方法的类)。 - &GT;删除公共集;并且只使用只读方法
答案 2 :(得分:0)
将AsReadOnly()
作为参数传递,没有人可以修改它。
https://msdn.microsoft.com/en-us/library/e78dcd75(v=vs.110).aspx
public void SomeMethod(IList<SomeData> list){
....
}
打电话给......
SomeMethod( myList.AsReadOnly() );
所以你可以创建课程,
Class MySetOfDataBlock
{
private List<MyDataBlock> _DataSet;
= new List<MyDataBlock>();
public IList<MyDataBlock> DataSet{
get{
return _DataSet.AsReadOnly();
}
}
bool SomeParam;
Double lots of other params;
}