Исходя из фона С++, я использую ключевое слово const
в определениях функций, чтобы объекты передавались в значениях только для чтения. Тем не менее, я выяснил, что это невозможно в С# (пожалуйста, поправьте меня, если я ошибаюсь). После некоторого Googling я пришел к выводу, что единственный способ сделать объект только для чтения - написать интерфейс, который имеет только свойства "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
или создания параметров функции только для чтения без добавления другого свойства или функции?