C# C“将同一变量传递给两个”;“出去”;参数
在下面的示例中,“user1”和“user2”指向同一引用是否正常 我知道我将同一个变量“notUsed”传递给这两个参数,但它尚未实例化,因此它不包含任何引用。看到user1和user2相互链接,我非常震惊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);
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:atuser1=“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);
}