Параметры функции C # только для чтения («const» -подобные)

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

17
задан Pops 6 May 2012 в 21:53
поделиться