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
对存储库更改的尝试有什么影响?
-
在这种情况下,对
sqlRespository
的引用将传递给ctor。 -
还没。 当您调用
AddSomething()
,该方法确实正在修改原始实例。 我们仍然只有一个对象,每个人都在接触那个对象。 这是一个重要的区别,因为每个人都有对同一个对象的引用,所以他们所做的任何更改都将对该对象进行 。 但是,如果它们只是用不同的对象覆盖该变量,那么它只适用于本地。 请记住,变量就像插槽。 我们可以有很多插槽都指向同一个对象,但用一个指向另一个对象的指针替换一个插槽不会影响其他插槽。 -
如果您首先设置
this.repository = repository
那么名为repository
的本地参数和名为repository
成员变量(字段)都将保持对同一对象的引用。 我们用this.
要清楚我们的意思是成员变量(字段)而不是本地参数或变量。 -
readonly
意味着只能从构造函数中分配成员变量/字段。 将成员变量视为我们可以放置对象的插槽。 如果插槽是readonly
,这意味着它只能在ctor调用期间填充。 之后它无法替换。 这并不意味着它内部的对象以某种方式“只读”。 该对象仍然可以被修改,它只是不能被另一个对象替换。
- 无法将类型’System.Collections.Generic.List ‘隐式转换为’System.Threading.Tasks.Task >
- 无法在c#中运行Google Cloud PubSub,DLL问题
- 无法在Windows Phone 8.1 DatePicker中将类型’%0’的实例添加到类型’%1’的错误集合中
- 使用Web应用程序中的相对路径读取文件的内容
- 执行entity framework时,CONTEXT_INFO丢失.SaveChanges(重载)
- DateTime和CultureInfo
- 如何在c#中通过客户端识别服务器身份validation的服务器名称
- 如何解析日期格式?
- 在C#/ .NET中持久存储设置/变量