重新设计允许可变性的扩展方法(对于参考类型)

时间:2015-07-17 21:32:34

标签: c# extension-methods immutability value-type

我总是将扩展方法用作不可变的,并为其执行的任何对象生成新的和改进的版本。

public static ReferenceType Biggify(this ReferenceType self)
{
  return self.Something();
}

现在我意识到,让这样的扩展方法对 self 进行操作并且不返回插孔可能会很好。

public static void Biggify(this ReferenceType self)
{
  self = self.SomethingElse();
}

但是,我意识到上述操作只会在 self 的副本上执行,当我们退出方法的范围时,变异将被丢弃。

  1. 我是否可以启用扩展方法的可变性
  2. 如果是的话......

    1. 我是如何这样做的?
    2. 应该我这样做?

1 个答案:

答案 0 :(得分:1)

没有

扩展方法的第一个(this)参数不能是ref,因此您无法修改对传入对象的引用。

实际上,如果对象本身是可变扩展,则可以轻松地明确更改对象:

  void AddCouple<T>(this List<T> list) where T:new()
  {
      list.Add(new T());
      list.Add(new T());
  }

或无意中喜欢:

   List<T> AddToCopy<T>(this List<T> list, T newItem)
   {
       var newList = list;
       newList.Add(newItem); // changed existing list...
       return newList;
   }

Doesn't C# Extension Methods allow passing parameters by reference?中还有一些额外的讨论,尤其是对不可变类型/值类型的扩展。