Имея опыт работы с C++, я привык вставлять ключевое слово const в определения функций, чтобы объекты передавались в значениях, доступных только для чтения. Однако я обнаружил, что в C# это невозможно (поправьте меня, если я ошибаюсь). После некоторого поиска в Google я пришел к выводу, что единственный способ создать объект, доступный только для чтения, — это написать интерфейс, который имеет только свойства «get», и передать его вместо этого. Элегантно, надо сказать.
Код: Выделить всё
public interface IFoo
{
IMyValInterface MyVal{ get; }
}
public class Foo : IFoo
{
private ConcreteMyVal _myVal;
public IMyValInterface MyVal
{
get { return _myVal; }
}
}
Я бы передал это:
Код: Выделить всё
public void SomeFunction(IFoo fooVar)
{
// Cannot modify fooVar, Excellent!!
}
Это нормально. Однако в остальной части моего кода я хотел бы изменить свой объект обычным образом. Добавление свойства set в интерфейс нарушит мое ограничение только для чтения. Я могу добавить свойство set в Foo (а не IFoo), но подпись предполагает интерфейс, а не конкретный объект. Мне придется пройти кастинг.
Код: Выделить всё
// Add this to class Foo. Might assign null if cast fails??
set { _myVal = value as ConcreteMyVal; }
// Somewhere else in the code...
IFoo myFoo = new Foo;
(myFoo as Foo).MyFoo = new ConcreteMyVal();
Есть ли более элегантный способ репликации const или создания параметров функции, доступных только для чтения, без добавления другого свойства или функции?
Подробнее здесь:
https://stackoverflow.com/questions/382 ... of-c-sharp