C#对象修改

我认为这真的是一个非常蹩脚的问题,但我想我会得到答案比通过谷歌搜索自己:)

假设我有一些带有构造函数的类:

 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. 在这种情况下,对sqlRespository的引用将传递给ctor。

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

  3. 如果您首先设置this.repository = repository那么名为repository的本地参数和名为repository成员变量(字段)都将保持对同一对象的引用。 我们用this. 要清楚我们的意思是成员变量(字段)而不是本地参数或变量。

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