[英]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
已经更新了对象。 不需要ref
、 out
或返回t
。 返回t
原因之一是允许您使用方法链。
如果要实际更改引用,而不是引用的内容,则只需要ref
或out
。
您实际上误解了ref
和out
关键字的含义。 如果您想替换方法内的整个引用对象,则使用它们,对于简单的属性级别更新,根本不需要它们。
在您的示例中,由于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.