3

C# では、 を定義できますがconst string、配列は であるため、配列は定義できませんobjects。文字列は、配列と同じように値で渡される参照オブジェクトであるため、実際 には s であると理解しています。object

では、どのようにしてこれを行うことができるのでしょうか:

const string NewLine = "\r\n";

しかし、これではありません:

const byte[] AesSwapBytes = new byte[] { ... };

文字列 ( ) では個々の文字を変更できないNewLine[0] = '\n'が、配列 ( arr[0] = i) では変更できるからでしょうか?

4

4 に答える 4

2

変数を作成できるかどうかは、それがオブジェクトであるか構造体であるかとは関係ありません。変数を作成するために必要なconstのは、代入の右側のサイズがコンパイル時のリテラルでなければならないということです。コンパイル時のリテラルを持つ型はほんの一握りです。 、、およびその他の数値型のstring1 つです。別の回答で述べたように、コンパイル時のリテラルであるため、本当に必要な場合は、null 許容型を割り当ててnull を割り当てることができます (実際に役立つわけではありません)。C# が配列になるコンパイル時のリテラル (null 以外) を追加する場合、意味のある配列を作成できます。それまでは、他のメカニズムを使用してやりたいことを行う必要があります。intdoublenullconstconst

于 2012-08-19T05:27:01.263 に答える
1

この MSDN の投稿によるとreadonly、C# で配列を定義できます。constantC# では特に、代入式が定数ではないため、配列を as として宣言できません。

public readonly string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };

ただし、最初のコメントでは、これはとにかく役に立たないことを詳しく説明しています。

配列を再割り当てすることはできませんが、個々の値を置き換えることはできます。

スタックオーバーフローの詳細はこちら

于 2012-08-19T03:45:15.090 に答える
1

const実際には、初期化子がコンパイル時の定数である限り、キーワードを使用して配列定数を宣言できます。

const byte[] Nothing = null;

原則として、参照型の場合、 onlynullはコンパイル時の定数です。

.NET は、文字列リテラルも許可する特別な例外を作成します。

于 2012-08-19T03:48:37.997 に答える
1

そのまま宣言された配列の問題はreadonly、フィールドが読み取り専用 (別の配列を参照するようにすることはできません) であっても、配列自体の内容を変更できることです。

コンテンツを変更できない「不変配列」が必要な場合の答えは、配列を使用しないことです。配列は変更可能であり、それについてできることは何もありません。

考えられる回避策は、読み取り専用コレクションを使用することです。

static readonly IList<byte> AesSwapBytes =
    new ReadOnlyCollection<byte>(new byte[] { ... });

配列として使用する必要がある場合は、ToArray拡張メソッドを呼び出すだけです。元の配列ではなく、データのコピーを含む配列を返します。したがって、 の結果を変更してもToArray、元のコレクションには影響しません。

于 2012-08-19T03:58:47.693 に答える