C#对象修改

时间:2010-12-12 15:54:25

标签: c# constructor pass-by-reference

我认为这是一个非常蹩脚的问题,但我想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 个答案:

答案 0 :(得分:2)

  1. 在这种情况下,对sqlRespository的引用会传递给ctor。

  2. 还没有。当您调用AddSomething()时,该方法确实正在修改原始实例。我们仍然只有一个对象,每个人都在接触那个对象。这是一个重要的区别,因为每个人都有对同一个对象的引用,所以他们所做的任何更改都将成为到该对象。但是,如果它们只是用不同的对象覆盖该变量,那么它只适用于本地。请记住,变量就像插槽。我们可以有很多插槽都指向同一个对象,但用指向不同对象的指针替换一个插槽不会影响其他插槽。

  3. 如果您首先设置this.repository = repository,则名为repository的本地参数和名为repository的成员变量(字段)都会引用同一个对象。我们使用this.来表示成员变量(字段)和本地参数或变量。

  4. readonly表示只能从构造函数中分配成员变量/字段。将成员变量视为我们可以放置对象的插槽。如果插槽为readonly,则表示只能在ctor呼叫期间填充。之后它无法替换。那个意味着它内部的对象以某种方式“只读”。该对象仍然可以被修改,它不能被另一个对象替换。