2017-01-26 3 views
1

Я кодирую в C# для группы людей, я разрабатываю подпись методов для кодирования, и мне нужен способ гарантировать, что люди не будут изменять некоторые параметры, которые они получат. Они получают большие структуры, поэтому их отправляют по ссылке, но я хочу, чтобы они потребляли данные без изменения исходных значений. Но поскольку структуры большие, мы не хотим их копировать.Могу ли я запретить пользователям изменять параметры в 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

Вы должны взглянуть на модульное тестирование. – smoksnes

+3

Что ?! 'struct'-экземпляры передаются по значению. В любом случае, я не понимаю вашу проблему. Можете ли вы показать пример кода, который показывает, что вы пытаетесь сделать? – HimBromBeere

+0

Прошу прощения, но ваш вопрос не очень ясен. Вы спрашиваете, как убедиться, что ваши пользователи не изменят значения аргументов, которые они отправляют вашим методам, прежде чем они будут выполнять ваши методы? –

ответ

0

Если вы ищете константный keywork, как в C++, чтобы предотвратить переменчивость данных, то несчастливо это не существует.

Что вы можете сделать - это пройти неизменяемые классы (классы без изменения свойств или методов данных). -> Удалить общедоступный набор; и просто используйте только методы чтения

5

Пессимистический ответ Отсутствует. Если хотите чтобы изменить данные, они будут. Вы ничего не можете сделать, кроме создания копий.


Оптимистический ответ предполагает, что они не хотят изменить данные и вам нужно только, чтобы защитить их от ошибок. Теперь, когда это возможно:

Не давайте им никаких сеттеров. Вы не сказали, как выглядят ваши данные, поэтому я могу дать вам лишь смутное описание:

Не подвергайте сеттеры. Дайте им интерфейсы к вашим классам данных, которые не имеют сеттеров, возвращают коллекции как IEnumerable<> вместо модифицируемого экземпляра, который они представляют, и так далее. Убедитесь, что через интерфейс, который они получают к вашим данным, ваши данные не могут быть изменены.

+0

Я добавил пример, мне нравятся идеи, которые вы публикуете, можете ли вы немного понять? – javirs

+0

@nvoigt кто-то может легко сбрасывать 'IEnumerable <>' обратно в 'List <>', и они могут модифицироваться. Библиотека базового класса имеет решение всех проблем, если вы пытаетесь быть оптимистами! :) –

+0

@AkashKava Это C# ... если вы не сделаете копию, «злые» люди могут просто использовать отражение. Люди, не имеющие зла, в порядке с «IEnumerable». Любое решение не является безопасностью, просто полезно, так что пользователю становится труднее ошибаться. Кастинг IEnumerable to List не является ошибкой, это намеренное зло и попадает в категорию 1 на мой взгляд. – nvoigt

0

Pass 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; 
} 
Смежные вопросы