Модификация объекта C # - PullRequest
1 голос
/ 12 декабря 2010

Я думаю, что это действительно очень неприятный вопрос, но я думаю, что на SO я получу ответ быстрее, чем сам погуглю его:)

Допустим, у меня есть некоторыекласс с конструктором:

public class TestClass {

   private readonly IRepository repository;

   public TestClass(IRepository repository)
   {
      this.repository = repository;

      // Here is the non-obvious line - it invokes some
      // method, which changes the internal contents of
      // the repository object.
      repository.AddSomething(...);
   }
}

А теперь:

IRepository sqlRepository = new SqlRepository(...);

TestClass testClass = new TestClass(sqlRepository);

1) Я не очень хорош в значении/ ссылка передается в C# - поэтому, пожалуйста, кто-нибудь может дать пошаговое объяснение того, что происходит в этом случае.

2) Есть ли sqlRepository объект изменяется (я полагаю, нет) и есть ли способ заставить конструктор TestClass изменить его (я знаю, что это зло, только для меня, чтобы знать)?

3) Могут ли строки repository.AddSomething(...) и this.repository.AddSomething(...) в конструкторе иметь одинаковый эффект и почему?

4) Какой эффектreadonly имеет попытки изменения репозитория в этом примере?

1 Ответ

2 голосов
/ 12 декабря 2010
  1. В этом случае ссылка на sqlRespository передается в ctor.

  2. Пока нет. Когда вы вызываете AddSomething(), этот метод действительно изменяет исходный экземпляр. У нас все еще есть только один объект, и каждый касается этого. Это важное различие в том, что поскольку у каждого есть ссылка на один и тот же объект, любые изменения, которые они делают, будут сделаны для этого объекта . Однако, если они просто перезаписывают эту переменную другим объектом, это применяется только локально. Помните, переменные похожи на слоты. У нас может быть много слотов, которые все указывают на один и тот же объект, но замена одного слота указателем на другой объект не влияет на другие слоты.

  3. Если сначала установить this.repository = repository, то и локальный параметр с именем repository, и переменная-член (поле) с именем repository содержат ссылку на один и тот же объект. Мы используем this. для ясности, мы имеем в виду переменную-член (поле), а не локальный параметр или переменную.

  4. readonly означает, что переменная / поле элемента может быть назначена только из конструктора. Думайте о переменной-члене как о слоте, в который мы можем поместить объект. Если интервал равен readonly, это означает, что он может быть заполнен только во время вызова ctor. После этого его нельзя заменить. Это означает, что не означает, что объект внутри него каким-то образом доступен только для чтения. Объект все еще можно изменить, его просто нельзя заменить другим объектом.

...