Можно ли сделать объекты, возвращаемые функцией неизменяемыми в C #? - PullRequest
6 голосов
/ 08 августа 2010

Я пишу функцию, которая возвращает ссылку на объект некоторой инкапсулированной структуры данных, и я хочу, чтобы никто не мог изменить объект, используя эту ссылку, возможно ли это сделать в c #?

Ответы [ 3 ]

8 голосов
/ 08 августа 2010

Если объект, который вы возвращаете, является неизменным, он будет работать нормально.

Если нет, вы можете вернуть объект-оболочку, который предоставляет только свойства только для чтения.

1 голос
/ 08 августа 2010

Я не думаю, что есть какой-то встроенный способ. C #, похоже, не имеет такой же поддержки const-правильности, как C ++. Вы можете сделать внутренних членов только для чтения, и это будет началом. Но это еще не все.

Вы бы сделали все функции-члены ваших функций класса не мутаторами, и сделали бы свойства всех элементов данных с приватными установщиками. При реализации методов получения для свойств скопируйте все классы, которые возвращаются, и возвращайте новый экземпляр, а не возвращайте ссылку на закрытый член.

class SomeClass
{
    public void SomeFunctionThatDoesNotModifyState()
    {
    }

    public int SomeProperty
    {
        get
        {
            return someMember; // This is by-value, so no worries
        }
    }

    public SomeOtherClass SomeOtherProperty
    {
        get
        {
            return new SomeOtherClass(someOtherMember);
        }
    }
}

класс SomeOtherClass { // .... }

Вы должны быть очень осторожны, чтобы реализация SomeOtherClass делала глубокое копирование при вызове конструктора копирования.

Даже после всего этого вы не можете на 100% гарантировать, что кто-то не изменит ваш объект, потому что пользователь может взломать любой объект с помощью отражений.

1 голос
/ 08 августа 2010

Я вижу только один способ - создать два интерфейса для этого типа. Один интерфейс только для чтения. Затем метод просто возвращает экземпляр этого интерфейса только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...