繁体   English   中英

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

[英]Extension methods, which is a better choice

以下是测试类

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;

以下两个调用都会导致ta, which is 10相同结果ta, which is 10

t.Do1(5)

t = t.Do2(5)

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

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

如果要实际更改引用,而不是引用的内容,则只需要refout

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

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM