有人可以解释一下,在C#中,“通过价值传递”和“通过引用传递”意味着什么?

时间:2013-10-21 22:28:17

标签: c# reference parameter-passing

我不太确定c#中“通过值传递”和“通过引用传递”的概念。 我认为通过价值意味着:

    int i = 9;

我们将int i传递给方法,如:method(i) 通过引用传递意味着准确地传递其位置,如:

    Class.method.variable

它会给出价值。 有人可以帮帮我吗?

4 个答案:

答案 0 :(得分:6)

简单来说......

“按值传递”表示将变量的实际值传递给函数。因此,在您的示例中,它将传递值9。

“按引用传递”意味着您将变量本身传递给函数(而不仅仅是值)。因此,在您的示例中,它将传递一个值为9的整数对象。

这会产生各种后果,每种后果在不同情况下都有用。

这个答案有更全面的信息: What's the difference between passing by reference vs. passing by value?

答案 1 :(得分:4)

几点:

在C#中除非您使用 ref 关键字,否则它始终是按值传递。

传递价值: 在值类型的情况下 - 它只是值类型变量的另一个副本。

在引用类型的情况下 - 它是指向堆中分配内存的确切位置的引用(或指针)的副本。

传递参考:

for Reference type variable - 使用关键字将其传递给另一个方法仅在可以在被调用方法中重新分配传递的变量的场景中有用。 这意味着:

让我们说 - 外(来电)方法A.             内部(称为)方法B

参考类型对象R - 从方法A到方法B 然后,如果在方法B中重新分配对象R的内存位置 然后,除非您使用 ref 关键字(即通过引用传递)传递对象R,否则这些更改将不会出现在对象R的方法A中。

答案 2 :(得分:2)

这是一个非常广泛的主题,因此我只会尝试回答您的直接问题。按值传递内容或引用方法取决于您实际发送的内容。

如果它是值类型,它将按值发送,如果它是引用类型,它将按值发送引用。基本上它会将变量本身发送给方法。

如果您想要真正的引用,则必须使用ref关键字。

展示它的一个例子:

void Main()
{
    int x = 5;
    Console.WriteLine (x);
    Test(x);
    Console.WriteLine (x);

    MyClass c = new MyClass();
    c.Name = "Jay";
    Console.WriteLine (c.Name);
    TestClass(c);
    Console.WriteLine (c.Name);
}

private void Test(int a){
 a += 5;
}

private void TestClass(MyClass c){
 c.Name = "Jeroen";
}

public class MyClass {
 public String Name {get; set; }
}

输出:

  

5
  5
  周杰伦
  Jeroen

int是值类型,因此其值将发送到方法。这意味着对该参数的任何调整只能在方法内的本地副本上完成。

但是,类是引用类型,因此myClass将发送其内存位置。这意味着通过更改给定对象内的数据,这也将更改此类在不同范围内的值,因为它们都引用相同的内存位置。

如果您使用ref关键字,则会传输参考。

如果你想要more information,请从比我更有经验的人那里拿走它。

答案 3 :(得分:-1)

按值传递意味着您将实际引用传递给该对象的内存中的位置。所以如果你有一个类,比如:

CustomObj aObj = New CustomObj();
aObj.SomeString = "Test";
someMethod(aObj);

方法标题如下:

someMethod(CustomObj objIn){
     objIn.SomeString = "Changing by value";
}

写到控制台:

Console.WriteLine(aObj.SomeString)

它会产生"Changing by value"而不是"Test",因为我们有一个引用到该对象。

相反,按价值,这种方式不起作用。请按照上面的例子说明:

int byValue = 0;
someMeothd(byValue);

someMethod(int numIn){
   numIn++;
} 

Console.WriteLine(byValue);

会产生"0"