2012-02-09 5 views
0

Iは、クラスAを持つクラスB、これはクラスAのバージョン及びB.だけのようなC#での基準値を比較するC/C++

class A 
{ 
    int x; 
    int y; 

    public A(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    public A() 
    { 
     x = 0; 
     y = 0; 
    } 
    ... 
} 

class B 
{ 
    A a; 
    public B(A a) 
    { 
     this.a = a; 
    } 

    public B() 
    { 
     this.a = null; 
    } 

    public A getA() 
    { 
     return a; 
    } 
    ... 
} 

を簡略化されており、私は次のようにオブジェクトAを比較する必要が。

public class MyClass 
{ 
    public static void RunSnippet() 
    { 
     var a = new A(10, 20); 
     var b = new B(a); 
     Console.WriteLine(a == b.getA()); 
    } 
} 

a == b.getA()は常にtrueだったが、新たにAとB、今a != b.getA()に同期した後。私は要素をaとb.getA()の要素でデバッガを使って比較しましたが、それらは同じようです。

aとb.getA()の参照(アドレス)を比較する方法はありますか? C/C++では、ポインタ値を簡単に取得できましたが、C#でどのように行うことができるのか分かりません。

+0

私はポイントがないか、[Object.ReferenceEquals](http://msdn.microsoft.com/en-us/library/system.object.referenceequals.aspx)を探していますか? –

+0

同期するとどういう意味ですか? – colithium

+0

AとBは値型ではなく参照型なので、 "ポインタ"を比較することは、あなたがすでに行っていることとまったく同じです。それが同じように戻ってくる理由です。 – dasblinkenlight

答えて

2

これにはObject.ReferenceEqualsを使用できます。 Equalsまたは==を上書きしない場合、同じ結果が得られます。

ReferenceEquals(a, b.getA()

1

安全でないコードを使用していない限り、C#でポインタを使用することはできません。これは、ポインターがエラーを起こしやすくなり、最適化とガベージコレクションが困難になるため、言語設計者の非常に意図的な決定です。しかし、あなたはここに後にしているものを行います言及したように

Console.WriteLine(object.ReferenceEquals(a, b.getA())); 
0

Object.ReferenceEqualsを使用することによって、彼らは同じ参照されていることを確認し、すなわち「アドレス」で2つのオブジェクトを比較することができます。

unsafeコードを使用することも可能であり、特定のアプリケーションに役立つ可能性があります。あなたがここに示したことについては、かなり正直に言うと、過ちであり、エラーやアダムの指摘している問題の可能性に値するものではないでしょう。しかし、オプションが確かにあり、スピードが問題になるなら絶対に価値があります。または、メモリ関連のエラーを懐かしく感じている場合

しかし、Unsafe Code Tutorialが言及しているように、C#でのポインタの使用はまれです。

0

参照型をC#で比較するのに "Object.ReferenceEquals"メソッドを使用することも、参照型のアドレスを取得してC++で比較することもできます。

[StructLayout(LayoutKind.Sequential)] // To make type [Class A] blittable 
Class A 
{ 
    int x;  

    public A(int x) 
    { 
     this.x = x; 
    } 
    ... 
} 

Class B 
{ 
    A a; 
    public B(A a) 
    { 
     this.a = a; 
    }  

    public A GetA() 
    { 
     return a; 
    } 
    ... 
} 

main() 
{ 
    var a = new A(10, 20); 
    var b = new B(a); 
    GCHandle gc = GCHandle.Alloc(objA, GCHandleType.Pinned); // Through GCHandle you can access the managed object from unmanaged memory. 
    IntPtr add = gc.AddrOfPinnedObject(); //pointer 
    Console.WriteLine(add.ToString()); 
} 

blittableとnonblittableについて詳しく読むことができますhere

この投稿は役に立ちましたか?

関連する問題