2017-08-28 7 views
4

'user1'と 'user2'が下の例で同じ参照を指しているのは普通ですか?C#同じ変数を2つの "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); 
} 

コンソールには示しています。あなたがoutキーワードを使用する場合、あなたは参照渡し

user1: B 
user2: B 
+4

どういう意味ですか?リンクされていることをどのように知っていますか? – mason

+0

user1とuser2の同じ参照をそのメソッドに渡すと、それは正常です。 –

+0

@TobiasTheelここに構造体はありません。 – itsme86

答えて

1

をこの:メソッドに起こるよう

CheckPasswords(out notUsed, out notUsed); 

は(メソッドに内容notUsedを渡しません。それはoutパラメータを使用しなかった)この方法にはnotUsedが渡されます。実際には同じ参照が2回あります。あなたが言うように、この時点でnotUsedには参照自体はまだ含まれていませんが、それは問題ではありません - コンテンツで何もしていない、実際にはoutとして渡すので気にしません。そして、この:user1stringパラメータではありませんので、

user1 = "A"; 

は特別な何かをする - それはout stringパラメータです。ローカルのuser1に値を割り当てるのではなく、user1が指している値(この場合はnotUsed)に値を割り当てます。この時点で、notUsed"A"への参照を保持します。そして、この:

user2 = "B"; 

は同じことを行いますが、他のパラメータを使用して - それはnotUsedから"B"への参照を割り当てます。そして、この2行:

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

はそれにuser1user2ポイントの両方から、任意のローカル変数の内容が、notUsedの値を取得していません。もちろん、"B"を2回取得します。

それは、このコードよりも何より衝撃的ではありません:これは二回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); 
} 

NotMagicに2つの異なるパラメータがあるということは、両方が同じものを指すことができないということを意味しません。 outおよびrefのパラメータと同じですが、構文によって余分な間接参照が隠される点が異なります。

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" 
関連する問題