以下是测试类
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关键字,这就像指向指针的指针,而不是像这种情况一样指向相同内存位置的单独指针,但是在扩展方法中,我不能使用它们。如果问题需要进一步明确,请告诉我
答案 0 :(得分:4)
在您的示例中,返回t
变量没有意义。 t
是一个引用,因此设置t.a
已经更新了对象。无需ref
,out
或返回t
。返回t
的一个原因是允许您使用方法链。
如果您想要实际更改参考,而不是参考内容,则只需ref
或out
。
答案 1 :(得分:3)
您实际上误解了ref
和out
关键字的含义。如果要替换方法中的整个引用对象,则使用它们,对于简单的属性级别更新,根本不需要它们。
在您的示例中,由于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)