1

明示的な列挙変換とは少し混乱しています。それが実際に何を意味するのか。

私は列挙型を使用して、かなりクールな期待される動作を実行し、同時に優れたマジックナンバーの置換として機能しようとしています。1つの石で2羽の鳥を殺します。

私はこのようなものを手に入れました。

public enum Size {Bare, Fixed, VariableByte, VariableShort};

期待される動作の美しさは、私が使用しているこのプロトコルにあります。

オペコードコマンドなしでパケットを送信する場合、それはベアパケットと呼ばれます。これは、バッファサイズが次のようなペイロードであることを意味します。

新しいバイト[payloadSize]; ただし、[payloadSize+Bare]は同等です

byte[] buffer = new byte[payloadSize+Bare];   //Bare = 0

パケットが固定されている場合は、前に追加する必要のあるOpCodeが含まれています。っていうことは

新しいバイト[1+ペイロード];

byte[] buffer = new byte[payloadSize+Fixed] //Fixed of course = 1.

VariableByteには、前にオペコードがあり、パケットのサイズを表すバイトが含まれています。これは、255サイズ範囲などのパケット用です。

新しいバイト[2+ペイロード];

VariableShortは、パケットサイズがワード65535ペイロードである可能性があることを除いて、上記と同じです。これは

プロトコルが変更された場合、将来的に問題が発生する可能性があります。将来、問題を修正するために列挙型に値を割り当てる必要があるかもしれませんが、今のところ、インデックス=0で始まる有効な列挙型です[グーグルした後、デフォルト値の0で列挙型を開始しない]それは正しい有効な列挙型ではありません..lolidkそれが意味すること..おそらく列挙型の操作にストレスをかけます。

とにかく私の質問に戻ります。

私はすでに知っているように私は次のようなことができます

int Ret = (int)Size.Bare;

また

int Ret = Convert.ToInt32(Size.Bare);
byte[] packet = new byte[payloadSize+Ret]

または最高。

byte[] packet = new byte[payloadSize+(int)Size.Bare]

パフォーマンスを向上させるために、できるだけ多くのコーディング行を避けようとしています。

私はMSDNを読んでいて、あなたがこれを行うことができることを発見しました。私はそれが目的であることを実際には発見していませんが、それが何を意味するかを予測しています。

public enum Size : int {Bare, Fixed, VariableByte, VariableShort};

これは可能だと思います

byte[] packet = new byte[payloadSize+Size.Fixed];

byte[] packet = new byte[payloadSize+Size.VariableShort];

等...

しかし、残念ながらそうではなく、この古いエラーが発生します

演算子「+」は、タイプ「int」およびPacket.Sizeのオペランドには適用できません。

だから、列挙型の前にバイトキャストを置くことは本当に何を意味するのだろうか?それは私が上で試みたようなクールなことを本当にさせないので。

バイトのみにキャストされるように制限するだけですか?または何かまたはそれは見た目だけのために昔ながらですか?

何も制限していないようです。

byte[] buffer = new byte[payloadZie+(byte)Size.Fixed];

それでも機能し、もちろんint!=byteです。

これが何を意味するのか疑問に思っています。
質問が多すぎる場合は申し訳ありません:\
フォーラムの期間よりも良い回答を提供してください。

4

3 に答える 3

3

列挙型は、論理状態または値を比較する場合のswitchステートメントと比較を提供します。(つまり、ConnectionState == Connected vs ConnectionState == 1)。

ここで必要なのは整数値です。ただし、パブリックフィールドやプロパティを使用してクラスを作成し、必要な処理を実行することはできます。静的にすると、コンパイラ/CLRにも適切な最適化が提供されます。

public static class Sizes
{
    public static readonly int Bare = 0;
    public static readonly int VariableByte = 65536;
}

それらは同じように使用できますが、Sizes.Bareは値0の整数であるため、追加で使用できます。

于 2011-06-21T07:45:26.210 に答える
1

デフォルトでは、列挙型の各値はタイプintであり、最初の要素は0で始まり、各要素でカウントアップします(または、[Flags]-Attributeを2 ^ nで定義した場合)。enum Size : byte各要素で列挙型byteを作成すると、intではなく、に明示的にキャストできるタイプになりますintが、使用できるのは「1バイトの数値」しかないため、合計で256要素に制限されます。したがって、列挙型を「パケットサイズ」として使用する場合は、int列挙型の方が適しています。

静的プロパティを持つクラスに対する列挙型の大きな利点はint、列挙型をメソッドパラメータのパラメータタイプとして定義してから、有効な数値を取得できることですが、静的sを使用する場合は、パラメータを次のようにintのみ定義できます。intそのため、パラメータが毎回有効かどうかを確認する必要があります。

于 2011-06-21T07:43:48.407 に答える
0

enum宣言で型を指定すると、その型がenum値の格納にのみ使用され、enum値を使用するときに構文が変更されることはありません。

デフォルトのストレージタイプはですint。したがって、列挙型が使用するように指定してintも何も変更されませんが、そのタイプを具体的に使用することを明確にすることは依然として有用です。


列挙型の数値を使用する場合は、デフォルトに依存せずに、定義でそれらを指定する必要があります。そうすれば、コードを読むことで、特定の値を持つ必要があることが明らかになります。

public enum Size {
  Bare = 0,
  Fixed = 1,
  VariableByte = 2,
  VariableShort = 3
};
于 2011-06-21T07:50:42.063 に答える