有人可以解释一下 C# 中的“按值传递”和“按引用传递”是什么意思吗?
本文关键字:按引用传递 按值传递 是什么 意思 中的 解释 一下 | 更新日期: 2023-09-27 18:36:16
我对 c# 中的"按值传递"和"按引用传递"的概念不太确定。我认为按值传递意味着:
int i = 9;
我们将 int i 传递到一个方法中,例如:method(i)通过引用传递意味着精确地传递其位置,如下所示:
Class.method.variable
它会给出价值。有人可以帮助我吗?
简单来说...
"按值传递"意味着将变量的实际值传递到函数中。因此,在您的示例中,它将传递值 9。
"通过引用传递"意味着将变量本身传递到函数中(而不仅仅是值)。因此,在您的示例中,它将传递一个值为 9 的整数对象。
这会产生各种后果,每种后果在不同情况下都很有用。
这个答案有更全面的信息:按引用传递与按值传递有什么区别?
几点:
在 C# 中,除非使用 ref 关键字,否则它始终是 Pass By Value。
按值传递:在值类型的情况下 - 它只是值类型变量的另一个副本。
在引用类型的情况下 - 它是引用(或指针)的副本,指向堆中分配内存的确切位置。
通过引用:
对于引用类型变量 - 使用关键字将其传递给另一个方法仅在可以在调用的方法中重新分配传递的变量的情况下有用。意思是:
假设 - 外部(调用方)方法 A 内部(称为)方法 B
引用类型对象 R - 从方法 A 传递给方法 B那么,如果在方法 B 中重新分配对象 R 的内存位置那么这些更改不会在对象 R 的方法 A 中看到,除非您使用 ref 关键字传递对象 R(即通过引用传递)。
这是一个非常广泛的主题,所以我只会尝试回答您的直接问题。通过值或引用将某些内容传递给方法将取决于您实际发送的内容。
如果是值类型,它将按值发送,如果是引用类型,它将按值发送引用。基本上,它会将变量本身发送到方法。
如果要真正引用,则必须使用 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
关键字,则会传输引用。
如果您想了解更多信息,请从比我更有经验的人那里获取。
伪代码示例:
main()
{
//Original value of 'x' will remain unchanged
// in case of call-by-value
int x = 5;
print( "Value of x before call-by-value: " + x);
// 5
fun(x);
print("Value of x after call-by-value: " + x);
// 5 (in case of languages like JAVA which are pass by value)
}
void fun(int x)
{
x=x+10;
}
现在来到含义 - x 的值在主函数中没有改变 - 这称为按值传递。
如果 main 函数中的值发生变化,则称为按引用传递。
请参阅此内容以清楚地了解按值传递和按引用传递之间的清晰理解
什么是按值传递?
在按值传递中,函数参数的值被复制到内存的另一个位置。访问或修改函数中的变量时,它仅访问副本。因此,对原始值没有影响。
什么是引用传递?
在通过引用传递时,内存地址将传递给该函数。换句话说,该函数可以访问实际变量。
按值传递和按引用传递之间的区别
定义
按值传递是指将函数参数值复制到另一个变量的机制,而按引用传递是指将实际参数传递给函数的机制。因此,这是按值传递和按引用传递之间的主要区别。
变化
在按值传递中,函数内部所做的更改不会反映在原始值中。另一方面,在通过引用传递时,函数内部所做的更改将反映在原始值中。因此,这是按值传递和按引用传递之间的另一个区别。
实际参数
此外,按值传递会复制实际参数。但是,在通过引用传递时,实际参数的地址将传递给函数。
按值传递意味着将实际引用传递给该对象在内存中的位置。因此,如果您有一个类,例如:
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"
.