5

C#で構造体のchar配列を初期化する方法私はこれをやっています

struct cell
{
    public char[] domain =new char[16];
    public int[] Peers;
    public int NumberOfPeers;
    public char assignValue;
}

しかし、構造体の本体で配列を初期化できないというエラーが発生します! 誰でも正しい方法を教えてもらえますか

4

7 に答える 7

10

コンストラクタを使用できます

struct cell
{
    public cell(int charArraySize) : this()
    {
         domain = new char[arraySize];
    }

    public char[] domain;
    public int[] Peers;
    public int NumberOfPeers;
    public char assignValue;
}

注: 構造体であっても、パブリック フィールドは使用せず、プロパティにカプセル化する必要があります。

そして、構造体の値を変更できることは、さらに悪い問題です。変更可能な構造体は悪です。

于 2012-12-17T13:44:26.013 に答える
3

unsafe.net の値型の主な制限の 1 つは、マネージド コードの領域を離れない限り、固定サイズの配列であっても配列を含めることができないことです (C# では、 andfixedキーワードを使用して値型内に固定サイズの配列を含める手段が提供されますが、その機能を使用するコードは、特定のセキュリティ コンテキストでは使用できなくなります)。配列への参照を含めることができますが、配列参照を保持する構造体がコピーされた場合、コピーは元の配列と同じ配列への参照を受け取ります。

ほとんどの場合、構造体型が含まれるものについて完全にオープンである (パブリック フィールドを介して状態全体を公開する) 方が、ダクト テープで結合された変数のコレクション以外のものであるふりをするよりも優れていることを示唆していますが、状態が変更可能なクラス オブジェクト ( など) の状態をカプセル化することになっている構造体はSystem.Array、別のパターンを使用する必要があります。

構造体が 64 個の浮動小数点数の値型配列として動作することになっており、64 個の個別のフィールドではなく、実際に浮動小数点数を System.Array 内に格納したい場合、構造体にはおそらくArrtype のプライベート フィールドが含まれている必要がありますfloat[]。element を読み取るには、が nullnかどうかを確認します。Arrその場合はゼロを返します。それ以外の場合は、 の値を返しますArr[n]。element を書き込むnには、一時変数Arr2を newに設定し、 null でない場合はfloat[64]コピーします。Arr次に、目的の値に設定しArr2[n]、 に置き換えます。すぐに aがに格納されていることに注意してくださいArrArr2float[]Arr、再び書き込まれることはありません。構造体の要素 5 に書き込もうとすると、構造体はそこに適切な値を持つ新しい配列を受け取ります。古い配列の要素 5 は変更されません。その結果、構造体は値型配列のように動作します (ただし、構造体への書き込みは、通常の配列への書き込みよりもはるかに遅くなります)。

型に大きな配列が必要な場合は、float[][]またはfloat[][][];を使用することをお勧めします。たとえば、16 要素の 16 配列の 16 配列の 16 配列を使用して 4096 要素を保持できます。そのシナリオでは、要素への書き込みには、 a float[16]、 a float[16][]、およびfloat[16][][];の生成/コピーが必要になります。サイズ 16 の 3 つの小さな配列は、サイズ 64 の 2 つの配列よりも優れている可能性があり、サイズ 4096 の 1 つの配列よりも優れていることはほぼ確実です。

値型のセマンティクスは確かに便利ですが、前述のように、配列が含まれている場合、構造体は非常に効率的に提供できません。要素の数が少ない場合の別の設計は、単純に要素ごとにフィールドを持ち、インデックス付きプロパティ アクセサーで switch ステートメントを使用して構造体フィールドの読み取りまたは書き込みを行うことです。少し面倒ですが、要素が 12 個程度より小さい構造体の場合は、上記のように配列を使用するよりもほぼ確実に効率的です。

于 2012-12-17T23:19:28.467 に答える
2

構造体の代わりにクラスを使用することができます (また、そうすべきかもしれません) (違いはありますが、型をどのように使用するかはわかりません)。

または、コンストラクターを記述できます。ただし、構造体インスタンス コンストラクターは少なくとも 1 つのパラメーターを受け取る必要があることに注意してください。

構造体に固執する場合は、必ず不変の構造体にしてください。これを行う 1 つの方法は、すべてのフィールドを作成readonlyし、インスタンス コンストラクターでそれらに割り当てることです。

于 2012-12-17T13:47:06.440 に答える
1

次のようなものを使用してみてください:

[StructLayout(LayoutKind.Sequential)]

public class TCardDB

{

public TCardDB(string strCardNo)

{

CardNo = strCardNo;

FName = LName = string.Empty;

OpenMode = FingerCount = 0;

Finger1 = new string[3];

Finger2 = new string[3];

}

..........

..........

}
于 2012-12-17T13:49:41.467 に答える
1

これには aconstructorを使用できます。MSDN を見てください。

struct cell
{
    public cell(int size)
    {
         domain = new char[size];
         this.Peers = Peers;
         this.NumberOfPeers = NumberOfPeers;
         this.assignValue = assignValue;
    }    
}
于 2012-12-17T13:45:56.100 に答える
1

この質問の最初のコメントを参照してください C
# array within a struct
Fixed Size Buffers - msdn.microsoft.com/en-us/library/zycewsya.aspx

于 2014-09-22T15:07:28.140 に答える