- ベストアンサー
C#で参照の連動を行う方法は?
- C++で参照の連動を行う方法をC#で実現するにはどうすれば良いのか?
- C++のようにC#でも参照の連動を行うことが可能なのか疑問。
- C#でint型の変数を参照として扱う場合、C++と同様の連動を実現する方法を知りたい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
※考えられるのはdelegateを利用する方法 http://www.wa.commufa.jp/~obaqq75/study/csharp/sp_delegate.html 面倒そうね。 いっその事、unsafeを利用してしまうって方法もあり。 http://msdn.microsoft.com/ja-jp/library/chfa2zb8(v=VS.80).aspx http://hdknr.spaces.live.com/blog/cns!82BB74511E950AA4!1252.entry?wa=wsignin1.0&sa=622830671 http://msdn.microsoft.com/ja-jp/library/ct597kb0.aspx using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int x = 100; A a = new A(ref x); a.disp(); x = 200; a.disp(); return; } } class A { unsafe int* x_dmy; unsafe private int x { get { return (int)*x_dmy; } set { *x_dmy = value; } } unsafe public A(ref int _x) { fixed (int* wk = &_x) { x_dmy = wk; } } public void disp() { Console.WriteLine(x.ToString()); } } }
その他の回答 (1)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
前回 >delegate を述べましたが、はっきり言って自信がありません。 少しだけ実現してみようとやってみたけど、結局ポインタを利用することになりそう。。。。 最初の「x」が、intではなくIntPtrとしたポインタ変数でもよいのであれば、対策はあります。 using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { IntPtr x = Marshal.AllocCoTaskMem(sizeof(int)); Marshal.WriteInt32(x, 100); B b = new B(x); b.disp(); Marshal.WriteInt32(x, 200); b.disp(); MessageBox.Show(string.Format("x値にも、Marshalでアクセスする必要あり\r\n{0}", Marshal.ReadInt32(x))); Marshal.FreeCoTaskMem(x); return; } class B { IntPtr x; public B(IntPtr _x) { x = _x; } public void disp() { Console.WriteLine(Marshal.ReadInt32(x).ToString()); } } } }
お礼
再度のご回答ありがとうございます。 なるほど、Marshalですね。参考になります。 でも、x定義を変えられないんですよ。もうしわけないです。 結局、delagateで一応の目的を達することができました。ありがとうございました。
お礼
ありがとうございます。 >※考えられるのはdelegateを利用する方法 >http://www.wa.commufa.jp/~obaqq75/study/csharp/sp_delegate.html なるほど、delegateという手がありましたね。 >いっその事、unsafeを利用してしまうって方法もあり。 C#でもポインタが使えるんですね、勉強になります。 fixed の使い方が肝心ですね。実際のプログラムはもっと複雑になりますので。 とりあえずはdelegateで実装してみようかと思います。unsafeも研究してみます。