有人能给我解释一下什么是;“按值传递”;及;参考传递”;用C#表示什么意思?

有人能给我解释一下什么是;“按值传递”;及;参考传递”;用C#表示什么意思?,c#,reference,parameter-passing,C#,Reference,Parameter Passing,对于c#中的“按值传递”和“按引用传递”的概念,我并不十分确定。 我认为通过价值传递意味着: int i = 9; 我们将int i传递给一个方法,如:method(i) 通过引用传递是指准确传递其位置,如: Class.method.variable 它会给出值。 有人能帮我吗?简单地说 “按值传递”是指将变量的实际值传递到函数中。因此,在您的示例中,它将传递值9 “通过引用传递”意味着您将变量本身传递到函数中(而不仅仅是值)。因此,在您的示例中,它将传递一个值为9的int

对于c#中的“按值传递”和“按引用传递”的概念,我并不十分确定。 我认为通过价值传递意味着:

    int i = 9;
我们将int i传递给一个方法,如:method(i) 通过引用传递是指准确传递其位置,如:

    Class.method.variable
它会给出值。 有人能帮我吗?

简单地说

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

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

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

这个答案提供了更全面的信息:

通过值传递意味着您正在将实际引用传递给该对象在内存中的位置。如果你有一门课,比如:

CustomObj aObj = New CustomObj();
aObj.SomeString = "Test";
someMethod(aObj);
和方法头,如下所示:

someMethod(CustomObj objIn){
     objIn.SomeString = "Changing by value";
}
并在控制台上写道:

Console.WriteLine(aObj.SomeString)
它将生成
“按值更改”
,而不是
“测试”
,因为我们有一个对该对象的引用

相反地,按价值计算,则不是这样。与我们上面的示例保持一致:

int byValue = 0;
someMeothd(byValue);

someMethod(int numIn){
   numIn++;
} 

Console.WriteLine(byValue);

将产生
“0”

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

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

如果想要真正的引用,必须使用
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
杰伊
杰罗恩

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

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

如果使用
ref
关键字,则会传输引用

如果您愿意,可以从比我更有经验的人那里购买。

几点:

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

传递值: 对于值类型-它只是值类型变量的另一个副本

对于引用类型,它是引用(或指针)的副本,指向在堆中分配内存的确切位置

通过引用传递:

对于引用类型变量-通过使用关键字将其传递给另一个方法仅在可以在被调用的方法中重新分配传递的变量的场景中有用。 这意味着:

比方说-外部(调用方)方法A 内部(调用)方法B

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

这两个都不是通过引用传递的。在C#中,通过引用传递需要使用
ref
out
修饰符。啊,我想他只是在问传递引用或值的概念types@Lee我很好奇,为什么选择的答案和我当时做的是一样的,您的答案讨论了按值传递引用类型变量(
CustomObj
)和按值传递值类型变量之间的区别,即您可以通过同一引用的不同副本来改变对象。接受的答案解释了通过引用传递会为调用方法中的变量创建别名,因此
objecto;somethod(out o)
实际上会导致
o
本身被修改,而不仅仅是它所指向的对象。
在C#中,除非使用ref关键字,否则它总是通过值传递。
这是不正确的。对于int和bool这样的简单类型,这是正确的,但是类在默认情况下是通过引用传递的。@paqogomez-类类型的实例在默认情况下不是通过引用传递的,
ref
out
需要在C#中通过引用传递。@paqogomez:不,这是100%正确的。引用类型的工作方式与所有其他类型相同。没有
ref
out
这是传递值。Jon Skeet很好地解决了这个问题:谢谢你,伙计,这真的很有帮助;)“它将通过引用值发送。”什么?@newacct:听起来有点尴尬。