我认为这是一个非常蹩脚的问题,但我想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
对存储库更改的尝试有什么影响?
答案 0 :(得分:2)
在这种情况下,对sqlRespository
的引用会传递给ctor。
还没有。当您调用AddSomething()
时,该方法确实正在修改原始实例。我们仍然只有一个对象,每个人都在接触那个对象。这是一个重要的区别,因为每个人都有对同一个对象的引用,所以他们所做的任何更改都将成为到该对象。但是,如果它们只是用不同的对象覆盖该变量,那么它只适用于本地。请记住,变量就像插槽。我们可以有很多插槽都指向同一个对象,但用指向不同对象的指针替换一个插槽不会影响其他插槽。
如果您首先设置this.repository = repository
,则名为repository
的本地参数和名为repository
的成员变量(字段)都会引用同一个对象。我们使用this.
来表示成员变量(字段)和不本地参数或变量。
readonly
表示只能从构造函数中分配成员变量/字段。将成员变量视为我们可以放置对象的插槽。如果插槽为readonly
,则表示只能在ctor呼叫期间填充。之后它无法替换。那个不意味着它内部的对象以某种方式“只读”。该对象仍然可以被修改,它不能被另一个对象替换。