C#使用引用参数[重复]

Posted

技术标签:

【中文标题】C#使用引用参数[重复]【英文标题】:C# using reference parameters [duplicate] 【发布时间】:2013-06-03 21:38:57 【问题描述】:

引用参数只对值类型有用吗? 比如你有一个方法传入一个类,那么 ref 关键字就没用了?

public class someclass


    

somefunction(ref someclass input)



【问题讨论】:

yoda.arachsys.com/csharp/parameters.html#ref ***.com/q/186891/34397 ***.com/q/2193064/34397 对 ref 类型很有用,例如见Array.Resize() 【参考方案1】:

我的理解是这样的(如果我错了,我希望有人纠正我):

C# 包含值类型(分配在栈上)和引用类型(分配在堆上)。

但是默认情况下所有参数都是传值的,也就是说如果你调用一个函数

myFunc(myClass param)  
...
myClass myVar = new myClass();
myFunc(myVar);
//myVar will not be changed here

然后将创建一个廉价的 myVar 副本并将其传递给 myFunc。

如果您使用 'ref' 关键字传递相同的参数,则不会生成 myVar 的副本,而是传入对 myVar 的引用。然后对 myFunc 中的 myVar 所做的任何更改都会在 myVar 中反映一次myFunc 返回。

myFunc(ref myClass param)  
...
myClass myVar = new myClass();
myFunc(ref myVar);
//myVar might be changed here

我很难找到一篇真正讨论参数的文章,而不仅仅是值与引用类型,但我认为这就是它的工作原理。

【讨论】:

这不是很正确。您需要了解 mutating 对象和分配变量之间的区别。 阅读yoda.arachsys.com/csharp/parameters.html【参考方案2】: 如果您需要用新对象替换函数赋予的对象,

ref 对引用类型很有用。例如:

class MyClass




class MyClass2 : MyClass

   public MyClass2(MyClass original)
   
   


bool UpdateMyClass(ref MyClass input)

   bool success = false;

   if (input != null)
   
       //Generate a new object with some additional functionality.
       input = new MyClassWithSuperPowers(input);
       success = true;
   

   return success;

当然,最明显的用例是字符串类。

void FormatString(ref string data)

  data = DateTime.Now + data;

【讨论】:

【参考方案3】:

您肯定可以为类类型使用 ref 参数。例如:

void MyClassFactory(ref MyClass newRef)

    newRef = new MyClass();


MyClass someRef = null;
MyClassFactory(ref someRef);
// Now someRef is referencing a new MyClass object.

请注意,如果没有 ref 关键字,上述代码将无法工作。

【讨论】:

请注意,在这样的示例中,您最好只返回新对象,而不是使用 ref 参数。 @Servy:我从来没有说过这是 good 代码;)我在这里的目的只是为了说明人们可以使用 ref 作为引用类型,并且它具有不同的语义。 如果你打算特意找一个例子,你至少可以使用一个有用的,否则你会给人的印象是它不是一个有用的功能。 @Servy:那为什么不那样做。毕竟这是一个免费网站。 因为有一百万个重复;我认为根本不需要回答这个问题,而是投票决定以重复的形式关闭。

以上是关于C#使用引用参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在C#中获取对字段值的引用[重复]

C#数组参数参考[重复]

C#在方法调用中,参数按值传递与按引用传递的区别是啥?

C# 传递参数(值或引用)?

C#基础按值和按引用传递参数

C#入门详解