Исходя из опыта работы с 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
или создания параметров функции только для чтения без добавления другого свойства или функции?