【发布时间】:2020-07-02 12:43:36
【问题描述】:
我正在尝试更新我对 C# 的理解。我以前使用过 Java,通过引用传递是我在 Java 中真正怀念的强大工具。但是,如果甚至需要通过引用传递对象以及是否存在可能有用的场景,我需要澄清一下? Stackoverflow 已经有多个关于引用的问题,它们确实很有启发性,但是,我想知道是否存在通过引用传递对象的场景。让我附上代码以更好地说明它。
class Program
{
public static void Update(int x) { x++; }
public static void Update(ref int x) { x++; }
public static void Update(Employee x) { x.msalary += 2000; }
public static void Update(ref Employee x) { x.msalary += 2000; } //Do we even need this method? Is there a scenario where we might need this?
static void Main(string[] args)
{
int a = 0;
Update(a);
Console.WriteLine("T1 " + a.ToString()); //a is still 0
Update(ref a);
Console.WriteLine("T2 " + a.ToString());//a is 1
Employee emp2 = new Employee("Brent", "1234", "Blue", 1000); //salary is 1000
Update(emp2.msalary);
Console.WriteLine("T3 " + emp2.msalary.ToString());//salary does not change.
Update(ref emp2.msalary);
Console.WriteLine("T4 "+emp2.msalary.ToString());//salary changes to 1001
Update(emp2);
Console.WriteLine("T5 " + emp2.msalary.ToString()); //This changes, as expected for objects.
Update(ref emp2);
Console.WriteLine("T6 " + emp2.msalary.ToString()); //This also changes. But is there a scenario where we might need this?
}
}
【问题讨论】:
-
您的
Update(ref Employee x)方法可以执行x = new Employee(),并且该更改反映在调用者中 -
引用类型和值类型的场景是相同的 - 当您需要分配给被调用函数中的变量并使其在调用者中可见时。您没有在
ref Employee示例中分配x,因此它不是必需的。 -
我会说只有当您想更改值并将其反映在范围之外时才使用值类型。仅当您可能使当前实例为空或需要为引用分配新实例时才适用于引用类型。
-
在您的情况下,对 Employee 的引用没有被修改。您只是在修改实际对象,而不是对它的引用。
-
您认为为什么 C# 中的有用场景与 Java 不同?
标签: c# pass-by-reference