Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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“将同一变量传递给两个”;“出去”;参数_C# - Fatal编程技术网

C# C“将同一变量传递给两个”;“出去”;参数

C# C“将同一变量传递给两个”;“出去”;参数,c#,C#,在下面的示例中,“user1”和“user2”指向同一引用是否正常 我知道我将同一个变量“notUsed”传递给这两个参数,但它尚未实例化,因此它不包含任何引用。看到user1和user2相互链接,我非常震惊 static void CheckPasswords(out string user1, out string user2) { user1 = "A"; user2 = "B"; Console.WriteLine("user1: " + user1);

在下面的示例中,“user1”和“user2”指向同一引用是否正常

我知道我将同一个变量“notUsed”传递给这两个参数,但它尚未实例化,因此它不包含任何引用。看到user1和user2相互链接,我非常震惊

static void CheckPasswords(out string user1, out string user2)
{
    user1 = "A";
    user2 = "B";

    Console.WriteLine("user1: " + user1);
    Console.WriteLine("user2: " + user2);
}

public static void Main()
{
    string notUsed;
    CheckPasswords(out notUsed, out notUsed);
}
控制台显示:

user1: B
user2: B

使用
out
关键字时,通过引用传递。()由于您是通过引用传递的,
user1
user2
都指向同一个变量。因此,当您更新一个变量时,它会更新另一个。

您通过引用传递变量。此外,方法中赋值的顺序也很重要-如本文所述,变量末尾将包含“B”。如果您将其反转,则会生成“A”

比较:

user1 = "A"; // notused now contains "A"
user2 = "B"; // notused now contains "B"
// method ends with the variable notused containing "B"
与:

user2 = "B"; // notused now contains "B"
user1 = "A"; // notused now contains "A"
// method ends with the variable notused containing "A"
这:

不将
notUsed
的内容传递给方法(在不使用
out
参数的方法中会发生这种情况),而是将对
notUsed
的引用传递给方法。事实上,同一个引用有两次。正如您所说,此时,
notUsed
本身还没有包含引用,但这并不重要——我们没有对内容做任何处理,事实上,我们不在乎,因为我们将它作为
传递出去。那么这个,

user1 = "A";
因为
user1
不是
string
参数——它是
out string
参数,所以执行特殊操作。它不是将值分配给某个本地
user1
,而是将值分配给
user1
所指向的对象——在本例中为未使用的
。此时,
notUsed
包含对
“a”
的引用。然后这个:

user2 = "B";
执行相同的操作,但通过另一个参数——它将对
的引用“B”
分配给
未使用的
。然后这两条线:

Console.WriteLine("user1: " + user1);
Console.WriteLine("user2: " + user2);
检索的不是任何局部变量的内容,而是
notUsed
中的值,因为
user1
user2
都指向它。当然,你会得到两次
“B”

这并不比下面的代码更令人震惊:

class User {
    public string Name { get; set; }
}

void NotMagic(User user1, User user2) {
    user1.Name = "A";
    user2.Name = "B";

    Console.WriteLine("user1.Name = " + user1.Name);
    Console.WriteLine("user2.Name = " + user2.Name);
}

void Main() {
    User user = new User();
    NotMagic(user, user);
}

如果此文档打印了两次
B
,您可能不会感到惊讶。
NotMagic
中有两个不同的参数并不意味着它们不能同时指向同一事物。与
out
ref
参数相同,只是语法会为您隐藏额外的间接性。

您的意思是什么?你怎么知道他们有联系?你很震惊?我看不出结果会是什么。一个变量
notUsed
有两个值?你期望
notUsed
的输出和值是什么?为什么?当然它“还没有实例化”--它是一个
out
变量,在你调用方法之前从来没有实例化过。然而,它是同一个变量引用了两次,而不是在方法末尾“复制”的两个局部变量。@John:at
user1=“A”
。由于
user1
指向
notUsed
,因此对
“A”
的引用以
notUsed
结尾。(当然,第二条语句会覆盖它,因为
user2
也指向
notUsed
notUsed
所需的存储已经存在,即使它的内容在方法输入时不存在(或者更准确地说,内容是不确定/不可访问的)。
class User {
    public string Name { get; set; }
}

void NotMagic(User user1, User user2) {
    user1.Name = "A";
    user2.Name = "B";

    Console.WriteLine("user1.Name = " + user1.Name);
    Console.WriteLine("user2.Name = " + user2.Name);
}

void Main() {
    User user = new User();
    NotMagic(user, user);
}