我知道当我们按值将引用类型传递给方法时,传递引用的副本,如果您在引用类型内更改一个值,这也会改变方法之外的值,那么当我们在C#中通过引用传递引用类型时?因为看起来是一样的。
发布于 2020-10-16 17:36:32
这一点应该很清楚,因为string是引用类型。
public class Program
{
public static void Main()
{
string s1 = "old value a";
string s2 = "old value b";
Method1(ref s1, s2);
Console.WriteLine(s1); // <-- this is what `ref` can do
Console.WriteLine(s2);
}
public static void Method1(ref string a, string b)
{
a = "new value a";
b = "new value b";
}
}输出
新值a
旧值b
发布于 2021-05-02 11:58:15
当通过值将变量传递给方法时,实际上是将该变量的值的复制传递给该方法。由于引用类型的值是该类型所引用的引用,所以当您通过值将引用类型变量传递给方法时,您将此引用的副本传递给该方法,因此,如果您在方法中更改变量的值,这也将更改该方法之外的值。
当将新实例赋值给引用类型的变量时,实际上是说变量引用新引用,因为您只是传递值的副本,而不是引用类型的引用,所以不能将新实例赋值给方法内的变量,但通过ref传递引用类型时,将传递引用类型的引用,因此可以将新实例分配给方法中的变量。
发布于 2020-10-17 05:08:32
另一种情况,而不是字符串
public class Person
{
public string Name
{
get;
set;
}
}假设我们有一个创建Person的方法
版本-1
public static void CreatePerson(Person p, string name)
{
p = new Person(){ Name = name};
}版本-2
public static void CreatePersonV2(ref Person p, string name)
{
p = new Person(){ Name = name };
}抛出对象引用异常,因为john仍然引用空。
Person john = null;
CreatePerson(john, "John");
Console.WriteLine(john.Name);,但这会起作用的,因为我们通过了大卫参考
Person david = null;
CreatePersonV2(ref david, "David");
Console.WriteLine(david.Name);https://stackoverflow.com/questions/64393735
复制相似问题