2017-08-28 124 views
4

在下面的示例中,'user1'和'user2'指向相同的引用是否正常?C#將相同的變量傳遞給兩個「out」參數

我知道我將同一個變量'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 
+4

你是什麼意思?你怎麼知道它們是相連的? – mason

+0

當你將user1和user2的參考文件傳入該方法時,是的,這是正常的 –

+0

@TobiasTheel這裏沒有任何結構。 – itsme86

回答

1

此:

CheckPasswords(out notUsed, out notUsed); 

沒有的notUsed通過內容的方法(如將在方法發生沒有使用out參數)它將參考文獻傳遞給notUsed。事實上,兩次提到同樣的參考。正如你所說,在這一點上notUsed本身還沒有包含任何引用,但這並不重要 - 我們沒有對內容做任何事情,事實上,我們並不關心,因爲我們將它作爲out傳遞給它。然後這樣的:

user1 = "A"; 

做一些特別的東西,因爲user1不是string參數 - 這是一個out string參數。它不會爲某個本地user1分配值,而是將值指定給user1指向的值 - 在本例中爲notUsed。此時,notUsed保留對"A"的引用。然後將此:

user2 = "B"; 

做同樣的事情,而是通過其他的參數 - 它分配一個參考"B"notUsed。然後將這兩條線:

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

檢索任何局部變量的不是內容,而是在notUsed的價值,因爲這兩個user1user2指向它。所以,當然,你會得到"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中有兩個不同的參數並不意味着它們不能指向相同的東西。與outref參數相同,只是語法會爲您隱藏額外的間接參數。

3

您正在通過引用傳遞變量。此外,該方法中的賦值順序非常重要 - 正如這裏所寫,變量最後將包含「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" 
相關問題