我可以阻止用户修改C#中的参数

时间:2017-01-26 09:26:11

标签: c# performance

我在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]
    }
}

3 个答案:

答案 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;
}