Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回参数,而不是通过Ref传递_C# - Fatal编程技术网

C# 返回参数,而不是通过Ref传递

C# 返回参数,而不是通过Ref传递,c#,C#,我有时看到一个方法,它有一个参数,修改它并返回它。 这有什么好处吗?为什么不简单地通过ref传递参数并通过ref保留方法 以下是我看到的: public MyClass DoSomething(MyClass myClass) { myClass.Amount = 500; return myClass; } 为什么不保持这样简单: public void DoSomething(ref MyClass myClass) { myClass.Amount = 500;

我有时看到一个方法,它有一个参数,修改它并返回它。 这有什么好处吗?为什么不简单地通过ref传递参数并通过
ref
保留方法

以下是我看到的:

public MyClass DoSomething(MyClass myClass)
{
    myClass.Amount = 500;
    return myClass;
}
为什么不保持这样简单:

public void DoSomething(ref MyClass myClass)
{
    myClass.Amount = 500;
}

如果
MyClass
是下面示例中的参考类型

公共MyClass DoSomething(MyClass MyClass)
{
myClass.Amount=500;
返回myClass;
}
返回它没有意义,因为所有引用类型都是通过引用传递的,您可以这样做

public void DoSomething(MyClass myClass)
{
    myClass.Amount = 500;
}
只有当
MyClass
是值类型(继承
struct
)时,它才有意义


但是,在.NET Core中引入了新的类型
ref structs
,用于在堆栈中分配
struct
类型,并通过引用而不是通过值传递它们(无需复制)。您可以在前面提到的上阅读,如果
MyClass
是引用类型,
ref
没有多大意义

但返回传递的参数是有意义的,因为它返回显式修改的参数,所以它适用于结构和类。更具可读性,这是一件非常好的事情


另外,如果我们讨论的是引用类型,
ref
是不必要的,没有它的代码更干净。

只有在您打算更改参数的引用时,使用
ref
关键字才有意义。通常,您希望避免这种情况,但如果您觉得必须:

公共类MyClass
{
公共int Id{get;set;}
公共整数金额{get;set;}
}
假设myClass参数具有
Id=1
Amount=300

这项工作:

public void DoSomething(MyClass MyClass)
{
myClass.Amount=500;
}
myClass.Amount
已变为
500

这不起作用:

public void DoSomething(MyClass MyClass)
{
myClass=新的myClass()
{
Id=5,
金额=500
}
}
myClass.Amount
仍然是
300
myClass.Id
1

但是,这确实有效:

public void DoSomething(参考MyClass MyClass)
{
myClass=新的myClass()
{
Id=5,
金额=500
}
}

myClass.Amount
500
myClass.Id
5

ref myClass如果myClass是一个类,myClass没有多大意义,如果myClass是一个结构,这是有意义的。您不需要在第二个方法中添加ref。@StefanoBalzarotti实际上
ref
,如果您想覆盖实例,这是有意义的。Jon Skeet写的一篇很好的博客,介绍了引用类型以及它与通过引用传递的区别是,这样您就可以将它们链接起来:
MyClass x=MyClass.DoSomethingA().DoSomethingB().DoSomethingC()
-但是,如果方法在类中,则没有理由将实例作为参数提供。。。除非它是一个静态扩展方法。实际上,如果你想让该方法用一个新的方法覆盖整个对象,这是有意义的。实际上,像这样返回对象对于将调用链接在一起很有用,是的,某种fluent API,但OP没有提到这一点