Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按引用传递引用类型_C# - Fatal编程技术网

C# 按引用传递引用类型

C# 按引用传递引用类型,c#,C#,我知道当我们将引用类型按值传递给一个方法时,传递一个引用的副本,如果在引用类型内更改一个值,这也会更改方法外的值,所以当我们在C#中按引用传递引用类型时?因为它看起来是一样的。这应该很清楚,因为字符串是引用类型 公共类程序 { 公共静态void Main() { 字符串s1=“旧值a”; 字符串s2=“旧值b”; 方法1(参考文献s1、s2); Console.WriteLine(s1);//字符串以外的其他场景 public class Person { public string N

我知道当我们将引用类型按值传递给一个方法时,传递一个引用的副本,如果在引用类型内更改一个值,这也会更改方法外的值,所以当我们在C#中按引用传递引用类型时?因为它看起来是一样的。

这应该很清楚,因为
字符串
是引用类型

公共类程序
{
公共静态void Main()
{
字符串s1=“旧值a”;
字符串s2=“旧值b”;
方法1(参考文献s1、s2);

Console.WriteLine(s1);//字符串以外的其他场景

public class Person
{
    public string Name
    {
        get;
        set;
    }
}
假设我们有一个创建
人的方法

第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仍然引用null

但这将起作用,因为我们通过引用传递了david


当您通过值将变量传递给方法时,实际上是将该变量值的副本传递给方法。由于引用类型的值是该类型所引用的引用,因此当您通过值将引用类型变量传递给方法时,您是错误的将此引用复制到该方法,因此,如果在该方法内更改变量的值,也将更改该方法外的值


当您将新实例分配给引用类型的变量时,实际上您是说该变量引用了新引用,因为您只传递了一个值的副本而不是引用类型的引用,所以您不能将新实例分配给方法中的变量,但是通过
ref
传递引用类型,您是p分配引用类型的引用,因此您可以将新实例分配给方法中的变量。

什么是“当我们通过值传递引用类型时”?区别在于,如果您通过ref传递
引用类型
,那么您可以从传递到的方法中分配新实例,该方法的itlink不起作用@JoeSewell@zahrabayat这对我很有用。网站通常也会出现:
    Person john = null;
    CreatePerson(john, "John");
    Console.WriteLine(john.Name);
    Person david = null;
    CreatePersonV2(ref david, "David");
    Console.WriteLine(david.Name);