2011-10-21 12 views
4

:私はY = 3で割り当てた場合、3 xは等しくするために、3 :C#参照代入演算子?例えば

 int x = 1; 
     int y = x; 
     y = 3; 
     Debug.WriteLine(x.ToString()); 

それはライン上の代わりに "=" のいずれかの基準演算子です。

+0

番号はありません。これは以前から起きており、私はEric Lippertの良い反応を見て覚えています。 –

+3

あなたは何かそんなものが欲しい理由を説明できますか?値の型はそれを行うことはできません。 –

+0

http://stackoverflow.com/questions/1420186/references-to-variables-in-c –

答えて

4

「int」は値型であるため、検出されたとおりに値を割り当てにコピーします。

従来のC/C++の意味では「安全でない」ブロックを使用してポインタを使用できますが、ポインタはそのブロック内でのみ使用できます。代わりに、 '安全でない'ブロック以外の値にアクセスする場合は、代わりに参照を使用して変換する必要があります。

このような何か...

var x = new Tuple<int>(1); 
var y = x; 
y.Item1 = 3; 
+0

xがもともとクラスのフィールドであった場合、この解決策は実用的ではないことに注意してください。このような状況では、代わりに[このコード]を使用することができます(http://stackoverflow.com/questions/2980463/how-do-i-assign-by-reference-to-a-class-field-in-c/ 2982037#2982037)も同様の質問に応じてEric Lippertによって提供されています。 – Brian

+0

注: 'x'と' y'は参照型のローカル変数であり、同じ真理が適用されます。 * yの再割り当てはxには影響しません。*値の型に関するビットは無関係です。 –

0

「安全でない」コードを使用し、実際にポインタを使用する唯一の方法です。ポインタはC#の安全でないコードブロックの外には存在できません。 C/C++と同じ方法でポインタを使用することができます。

「安全でない」コードブロックの使用方法については、thisのページを参照してください。

3

これは、あなたが求めているものを正確ではありませんが、私はそれが役に立つかもしれないと思いました。あなたはC

int x = 1; 
    unsafe 
    { 
     int* y = &x; 
     *y = 3; 
    } 

    Debug.WriteLine(x.ToString()); 

(あなたが使用してコンパイルする必要がありますのようにポインタを使用することができます

public static void RefExample(ref int y) 
{ 
    y = 3; 
} 

main() 
{ 
    int x = 5; 
    RefExample(ref x); 
    Console.WriteLine(x); // prints 3 
} 
3

:あなたは関数の内部ポインタのエイリアスをしたい場合は、そのようなのようなrefキーワードを使用することができます安全でないフラグ)

9

私はかつてこの機能を持つC#のバージョンのプロトタイプを書きました。

int x = 123; 
ref int y = ref x; 

ここで、xとyは同じ変数のエイリアスになります。

この機能を言語に追加しないことにしました。あなたが本当に素晴らしい使用事例を持っているなら、それを聞いて欲しいです。

あなたはこの機能について最初に質問する人ではありません。詳細については、Can I use a reference inside a C# function like C++?を参照してください。

UPDATE:機能は、おそらくC#で7

+0

ここでは、ループの外側で 'x'を' i'や 'j'にすることができれば、はるかに良いでしょう。 http://i.imgur.com/W12AMCN.png – shinzou

+0

_exact_同じ機能を探してみましたが、この質問は(他の多くのものの中でも)見つかりました。私は非常に普通だと思う状況があり、参照を使用するにはまともな回避策が見当たりません。私が望むのは、ポインタ、メモリアドレス、またはC++の他の "複雑な"機能を含んでいません。私はC++から '#define'の方向にもっとシンプルな(盲目の)参照(別名)が必要です。私は、refを関数に/から返すことに関心がないので、スタック関連の問題もありません。私の状況を取る: – mireazma

+0

状況:私はいくつか_int_変数を持っており、キーを押す(ループで)、今から作業変数に1を割り当てる。従うべきすべての作業(多くの機能)は、その特定の変数上になければならない(すなわち、それを読み書きするために別のキーを押す)。私は_unnecessary/overhead_コードを回避する方法を見ることができません。 C++リファレンスは完全に完璧です。 IMHO以外にも、ref型の値渡しが許可されているのと同じように、逆も同様です。 – mireazma

0

になります私はエリックリペットの答えをコメントしたかったが、新しいユーザーがコメントを投稿できません。だから、私はそのような使い方をしていると思う。

は、このコードを見てみましょう:

private void SetGridColumns(ref RegistryKey targetKey, List<ColInfo> cols) 
    { 
     string targetKeyName = Path.GetFileName(targetKey.Name); 
     m_grids.DeleteSubKeyTree(targetKeyName, false); 
     targetKey.Close(); 
     targetKey = m_grids.CreateSubKey(targetKeyName); 

// ... }

public void SetColumns(List<ColInfo> cols, bool youth) 
    { 
     RegistryKey key = youth ? m_youthGrid : m_mainGrid; 
     SetGridColumns(ref key, cols); 
    } 

をそれがそのように動作するはずです:SetColumnsで 私は青年」に応じて、キーでSetGridColumnsを呼び出します"param。私は自分の鍵を最初に削除してから再作成したいと思います。もちろん、m_mainGridはクラスのメンバーです。 この場合、キーは実際に削除され、再作成されます。しかし、私のm_mainGridではなく、SetGridColumnsの "targetKey"だけが再作成されます。

私がここで行うことができるのは、C#ではあまり好まれないポインタを使用することだけです。 私は何ができる場合:

ref RegistryKey key = youth ? m_youthGrid : m_mainGrid; 

すべてが正常に動作する必要があります。