web-dev-qa-db-ja.com

C ++のようなC#にポインターはありますか?安全ですか?

ツリーデータ構造で動作するアプリケーションを作成しています。 C++で記述しましたが、C#で記述したいと思います。ツリーデータ構造を実装するためにポインターを使用します。 C#にもポインタがありますか?使用しても安全ですか?

44
masoud ramezani

C#(またはJava、または他の多くの言語)でツリー構造を実装している場合、ポインターの代わりに参照を使用します。 NB。 C++の参照は、これらの参照と同じではありません。

使い方はほとんどの部分でポインターに似ていますが、ガベージコレクションのような利点があります。

class TreeNode
{
    private TreeNode parent, firstChild, nextSibling;

    public InsertChild(TreeNode newChild)
    {
        newChild.parent = this;
        newChild.nextSibling = firstChild;
        firstChild = newChild;
    }
}

var root = new TreeNode();
var child1 = new TreeNode();
root.InsertChild(child1);

興味がある点:

  • メンバーを宣言するときに*で型を変更する必要はありません
  • コンストラクターでそれらをnullに設定する必要はありません(既にnullです)
  • メンバーアクセス用の特別な->演算子はありません
  • デストラクタを作成する必要はありません(IDisposableを検索します)
41

[〜#〜] yes [〜#〜]。 C#にはポインターがあります。

[〜#〜] no [〜#〜]。それらは[〜#〜] not [〜#〜]安全です。

C#でポインターを使用する場合、実際にはキーワードunsafeを使用する必要があります。

たとえば、ここおよび[〜#〜] msdn [ 〜#〜]

static unsafe void Increment(int* i)
{
    *i++;
}

Increment(&count);

代わりにこれを使用すると、コードは安全でクリーンになります。

static void Increment(ref int i)
{
    i++;
}

Increment(ref count);
32
Pratik Deoghare

C#にもポインタがありますか?

はい 、構文int* varName;を使用して宣言されています。

それは安全ですか?

ポインターは安全ではありません

ポインターなしでデータ構造を構築する安全な方法があります。ノードがクラスの場合、ノードは自動的に 参照タイプ になるため、ポインターは不要です。それ以外の場合は、 参照にボックス化 できます。

19
kennytm
4
Tuomas Hietanen

MSDNの.Net 2には、一連の優れたデータ構造が実装されています。

データ構造パート1

バイナリ検索ツリー、グラフ、SkipList、NodeListなどのサンプルコードが含まれています。コードは非常に完全で、これらの構造が機能する理由などに関するドキュメントのページが多数含まれています。

Microsoftのものはどれもポインターを使用しません。一般的に、C#でそれらを使用する必要はありません。それらを使用するのがいい場合もありますが、C++から考える方法でもあります。しかし、通常はそれらを使用しない方法を見つけることができます。

ポインターに安全でないコードを使用しない最大の理由は、Medium Trustコンプライアンスを失うことです。クリック1回、asp.net Webサイトなどのメカニズムを実行することはできません。Silverlightもそれらを許可しません。参照と完全に管理された概念に固執して、コードをより多くの場所で実行できるようにします。

2
Jason Short