2016-05-09 2 views
-4

クラス内で多くの整数を処理したいので、それらをint*配列に列挙しました。C#02 - プログラマとコンピュータのためにエラーcs0212をバイパスする方法?

int*[] pp = new int*[]{&aaa,&bbb,&ccc}; 

しかし、コンパイラは、次の口実と上記のコード減少しました:私は、私はこのエラーを回避するために上記のコードを変更することができます知っている

> You can only take the address of an unfixed expression inside of a fixed statement initializer

を。しかし、我々はdddeeeが将来アレイに加わることを考慮する必要がある。

public enum E { 
    aaa, 
    bbb, 
    ccc, 
    _count 
} 

for(int i=0;i<(int)E._count;i++) 

gg[(int)E.bbb] 

Dictionary<string,int>ppp=new Dictionary<string,int>(); 
ppp["aaa"]=ppp.Count; 
ppp["bbb"]=ppp.Count; 
ppp["ccc"]=ppp.Count; 

gg[ppp["bbb"]] 

これらのソリューションは、動作しますが、彼らは、コードと実行時間を長くします。

私はまた、コンパイラまたは非公式の新しいC#コンパイラへの非公式のパッチを期待していますが、私は何年も利用可能なダウンロードを見ていません。私たちのために持っていることは非常に難しいようです。

は、私は、配列pppの数をカウントする必要はありません

  1. ように、そこより良い方法です。
  2. コードが長くなると、複数の文字だけが長くなります。
  3. 実行時間はあまり増加しません。
  4. dddおよびeeeをアレイに追加するには、新しいメンバーごとに1つまたは2つの設定があります。
+2

なぜ地球上でIEnumerableを使用していないのですか - リストなどですか?なぜポインタはリストよりも保守が簡単だと思いますか? – user3791372

+2

1)「言い訳」ではありません。固定解除されたオブジェクトへの参照を渡すことはできないため、エラーを「禁止」することはできません(コレクタによっていつでもメモリの周りを移動できます)。 2)また、「このコードを変更するとメンテナンスが難しくなります」と確信していますか?あなたは何をしようとしているのですか? – Groo

+0

要するに、言語のルールを自分で変更することはできません。警告は抑止できますが、エラーは抑止できません。 –

答えて

0

.NETランタイムは、(とりわけ)garbage collectionを提供するマネージド実行ランタイムです。 .NETガベージコレクタ(GC) は、メモリの割り当てと解放を管理するだけでなく、 "管理されたヒープ"の周りのオブジェクトを透過的に移動させ、残りのコードをブロックしながらブロックします。 また、より寿命の長いオブジェクトを一緒に移動してメモリを圧縮(デフラグ)したり、ヒープの異なる部分にそれらを「昇格」させても、世代と呼ばれます。

あなたのプログラムがなくても、それを実現していても、常にたくさんのメモリがコピーされています。ガベージコレクションは、プログラムの実行中にいつでも実行できる操作なので、ポインター関連の ( "安全でない")操作は、小さなスコープ内で実行する必要があります。 fixedキーワード。これは、GCがそれらを動かすのを防ぐが、しばらくの間だけ。

C#でポインタとunsafeコードを使用することは、安全性が低いだけでなく、一般的に管理言語ではあまり慣れないものです。 Cのバックグラウンドから来ている場合は、これらの構造で家にいるような気がするかもしれませんが、C#はまったく異なる考え方を持っています:C#プログラマーとしての仕事は、信頼できる読みやすい保守可能なコードを書いて、パフォーマンス上の理由からCPUサイクルの小規模な関数では時々ポインタを使用することができ、非常に特殊な、タイムクリティカルなコードを実行します。しかし、それでもあなたの義務はprofile before making such optimizationsです。最も経験豊富なプログラマでさえも、プロファイリング前にボトルネックを予測することができません。

最後に、あなたの実際のコードについて:

int*[] pp = new int*[] {&aaa, &bbb, &ccc}; 

がこれ以上パフォーマンス次のようになります:あなたは、これが考える理由

  1. 私は表示されません

    int[] pp = new int[] {aaa, bbb, ccc}; 
    

    32ビットマシンでは、intとポインタは同じサイズです。 64ビットマシンでは、ポインタがさらに大きくなります。

  2. 平野intを自分のclassに置き換えることを検討してください。これは、これらの値のそれぞれにコンテキストと追加の機能/データを提供します。あなたが解決しようとしている実際の問題を記述する新しい質問を作成してください(そのような質問にはCode Reviewも使えます)。

関連する問題