扩展方法,这是一个更好的选择

时间:2015-06-25 07:37:08

标签: c# .net c#-4.0 extension-methods

以下是测试类

public class Test
{
   public int a;
}

以下是我创建的扩展方法:

public static class Extension
{    
  public static void Do1(this Test t,int value)
  {
     t.a = t.a + value;
  }

  public static Test Do2(this Test t,int value)
  {
     t.a = t.a + value;
     return t
  }
}

代码使用:

Test t = new Test();
t.a = 5;

以下两个调用都会导致t.a, which is 10的结果相同:

t.Do1(5)

t = t.Do2(5)

在我的代码中有很多实例,我需要实现一个类似的逻辑,哪一个更好,其中一个是按值传递引用并在内部更新它,另一个是返回更新的引用。使用其中一个更安全,如果这种代码进入多线程包装,只要所有的线程安全得到处理。通常要更新引用的变量,我们需要一个ref或out关键字,这就像指向指针的指针,而不是像这种情况一样指向相同内存位置的单独指针,但是在扩展方法中,我不能使用它们。如果问题需要进一步明确,请告诉我

2 个答案:

答案 0 :(得分:4)

在您的示例中,返回t变量没有意义。 t是一个引用,因此设置t.a已经更新了对象。无需refout或返回t。返回t的一个原因是允许您使用方法链。

如果您想要实际更改参考,而不是参考内容,则只需refout

答案 1 :(得分:3)

您实际上误解了refout关键字的含义。如果要替换方法中的整个引用对象,则使用它们,对于简单的属性级别更新,根本不需要它们。

在您的示例中,由于Test是一个类(引用类型),因此两个方法之间没有实际差异,但在Test方法中返回初始Do2对象是没有意义的,因为对象已经更新。所以最好的两个将是第一个实现:

public static class Extension
{    
     public static void Do1(this Test t,int value)
     {
         t.a = t.a + value;
      }
}

回到Do2方法 - 正如我之前所说的,引用的对象值已在方法内部更新,因此将返回值分配给初始变量甚至没有意义:

t.Do2(5)

相同
t.Do(5)