4

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

    int i = 9;

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

    Class.method.variable

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

4

4 回答 4

8

简单来说...

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

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

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

这个答案有更全面的信息: 按引用传递与按值传递有什么区别?

于 2013-10-21T22:35:16.013 回答
4

几点:

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

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

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

通过参考:

对于引用类型变量 - 使用关键字将其传递给另一个方法仅在传递的变量可以在被调用的方法中重新分配的情况下有用。它的意思是 :

假设 - 外部(调用者)方法 A 内部(被调用)方法 B

引用类型 Object R -从方法 A 传递给方法 B 然后如果您在方法 B 中重新分配对象 R 的内存位置,那么除非您使用ref关键字传递对象 R(即通过引用传递)。

于 2013-10-21T22:51:13.590 回答
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
杰伊·
杰罗恩

Anint是一个值类型,因此它的值被发送到方法。这意味着对该参数的任何调整都只会在方法内的本地副本上进行。

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

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

如果您想了解更多 信息,请从比我更有经验的人那里获取。

于 2013-10-21T22:35:47.467 回答
-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".

于 2013-10-21T22:35:39.310 回答