【问题标题】:C# object modificationC# 对象修改
【发布时间】:2010-12-12 15:54:24
【问题描述】:

我认为这确实是一个非常蹩脚的问题,但我想在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 对本示例中的存储库更改尝试有什么影响?

【问题讨论】:

    标签: c# constructor pass-by-reference


    【解决方案1】:
    1. 在这种情况下,对 sqlRespository 的引用被传递给 ctor。

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

    3. 如果您首先设置了this.repository = repository,那么名为repository 的本地参数和名为repository 的成员变量(字段)都持有对同一对象的引用。我们使用this. 来明确我们的意思是成员变量(字段),不是局部参数或变量。

    4. readonly表示成员变量/字段只能从构造函数中赋值。将成员变量视为我们可以放置对象的插槽。如果 slot 是readonly,这意味着它只能在 ctor 调用期间被填充。之后就无法更换了。这确实 not 意味着其中的对象在某种程度上是“只读的”。对象仍然可以修改,只是不能被另一个对象替换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      相关资源
      最近更新 更多