サイズを指定せずに空の配列を作成することは可能ですか?
たとえば、私は作成しました:
String[] a = new String[5];
サイズなしで上記の文字列配列を作成できますか?
サイズを指定せずに空の配列を作成することは可能ですか?
たとえば、私は作成しました:
String[] a = new String[5];
サイズなしで上記の文字列配列を作成できますか?
回答:
サイズが事前にわからないコレクションを使用する場合は、配列よりも優れたオプションがあります。
List<string>
代わりにa を使用してください。これにより、必要な数の項目を追加でき、配列を返す必要がある場合ToArray()
は、変数を呼び出します。
var listOfStrings = new List<string>();
// do stuff...
string[] arrayOfStrings = listOfStrings.ToArray();
空の配列を作成する必要がある場合、これを行うことができます:
string[] emptyStringArray = new string[0];
string[]
。要素のないaになります。にアクセスしようとするemptyStringArray[0]
と、IndexOutOfRangeException
これを試して:
string[] a = new string[] { };
int[] variable = new int[]{}
してループで使用する場合foreach (var s in variable){ Console.WriteLine(s);}
、コードは次のようにコンパイルされます:int[] args1 = new int[0];
およびforeach (int num in args1){Console.WriteLine(num);}
。したがって、とを使用new int[0]
してnew int[]{}
、両方が同じコードにコンパイルされるので、違いはありません。
var
、(フィールドではなく)ローカル変数のみが使用できますが、を使用した別の単純なフォーマットも使用できます。ただし、C#2.0(Visual Studio 2005)以前では、この回答(またはstring[] a = new string[0];
)の構文を使用する必要がありました。
.NET 4.6では、新しい方法を使用することをお勧めしますArray.Empty
。
String[] a = Array.Empty<string>();
実装が使用して、簡潔で一般的なクラスの静的メンバは.NETでどのように動作しますか:
public static T[] Empty<T>()
{
return EmptyArray<T>.Value;
}
// Useful in number of places that return an empty byte array to avoid
// unnecessary memory allocation.
internal static class EmptyArray<T>
{
public static readonly T[] Value = new T[0];
}
(明確にするためにコード契約関連のコードは削除されました)
以下も参照してください。
Array.Empty
参照ソースのソースコードArray.Empty<T>()
Enumerable.Empty<T>().ToArray()
Array.Empty<T>()
しません。事前に割り当てられた配列への参照を返します。
サイズなしで配列を宣言してもあまり意味がありません。配列のサイズはおよそです。特定のサイズの配列を宣言するときは、物事を保持できるコレクションで使用可能なスロットの固定数を指定し、それに応じてメモリが割り当てられます。何かを追加するには、とにかく既存の配列を再初期化する必要があります(配列のサイズを変更する場合でも、このスレッドを参照してください)。空の配列を初期化するまれなケースの1つは、配列を引数として渡すことです。
コレクションのサイズがわからない場合にコレクションを定義する場合は、配列を選択するのではなく、のようなものを選択しますList<T>
。
つまり、サイズを指定せずに配列を宣言する唯一の方法は、サイズ0の空の配列を持つことです。hemantとAlex Dnは2つの方法を提供します。別のより簡単な代替策は、単に次のことです:
string[] a = { };
[ 括弧内の要素は、たとえば、定義された型に暗黙的に変換できる必要がありますstring[] a = { "a", "b" };
]
またはさらに別の:
var a = Enumerable.Empty<string>().ToArray();
これはより宣言的な方法です:
public static class Array<T>
{
public static T[] Empty()
{
return Empty(0);
}
public static T[] Empty(int size)
{
return new T[size];
}
}
今すぐ呼び出すことができます:
var a = Array<string>.Empty();
//or
var a = Array<string>.Empty(5);
シンプルでエレガント!
string[] array = {}
array
します。大文字と小文字が異なる場合でも、変数名としてキーワード名を使用するのはよくない習慣です。そして、私がそこにいたことを除いて、基本的に私の答えと同じです。a
array
String.Empty
a
悪いと思いますか?
string[] a = new string[0];
または短い表記:
string[] a = { };
現在の推奨方法は次のとおりです。
var a = Array.Empty<string>();
たとえば長さゼロの割り当てを置き換える場合にVisual Studioで使用できる短い正規表現を記述しましたnew string[0]
。正規表現オプションをオンにしてVisual Studioで検索(検索)を使用します。
new[ ][a-zA-Z0-9]+\[0\]
次に、すべてを検索またはF3(次を検索)し、すべてをArray.Empty <…>()に置き換えます。
@nawfalと@Kobiの提案を組み合わせる:
namespace Extensions
{
/// <summary> Useful in number of places that return an empty byte array to avoid unnecessary memory allocation. </summary>
public static class Array<T>
{
public static readonly T[] Empty = new T[0];
}
}
使用例:
Array<string>.Empty
アップデート2019-05-14
(@Jaider tyへのクレジット)
.Net APIをよりよく使用する:
public static T[] Empty<T> ();
https://docs.microsoft.com/en-us/dotnet/api/system.array.empty?view=netframework-4.8
に適用されます:
.NET Core:3.0プレビュー5 2.2 2.1 2.0 1.1 1.0
.NET Framework:4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6
.NET標準:2.1プレビュー2.0 1.6 1.5 1.4 1.3
...
HTH
arr = Array.Empty<string>();
できるよ:
string[] a = { String.Empty };
注:OPは、サイズを指定する必要がないことを意味、配列しないsizelessを
specify
、配列を作成するのではなく、サイズを指定する必要がないことを意味しsizeless
ます。
これが実際の例です。この場合、foundFiles
最初に配列をゼロ長に初期化する必要があります。
(他の回答で強調したように、これは要素ではなく、特にインデックス0の要素を初期化しません。これは、配列の長さが1であることを意味するためです。この行の後、配列の長さはゼロです!)。
パーツ= string[0]
が省略されている場合、コンパイルエラーが発生します。
これは、再スローのないキャッチブロックが原因です。C#コンパイラはコードパスを認識し、関数Directory.GetFiles()
が例外をスローできるため、配列が初期化されない可能性があります。
誰もが言う前に、例外を再スローしないと、エラー処理が悪くなります。これは真実ではありません。エラー処理は要件を満たす必要があります。
この場合、プログラムは、読み取ることができず、破損していない場合でも続行する必要があると想定されます。最良の例は、ディレクトリ構造をたどる関数です。ここでエラー処理はそれをログに記録するだけです。もちろん、これはもっとうまくできます。たとえば、失敗したGetFiles(Dir)
呼び出しのあるすべてのディレクトリをリストに収集することはできますが、これはここまで行き過ぎです。
回避throw
は有効なシナリオであり、配列は長さゼロに初期化する必要があると述べるだけで十分です。catchブロックでこれを行うだけで十分ですが、これは悪いスタイルです。
GetFiles(Dir)
配列のサイズを変更する呼び出し。
string[] foundFiles= new string[0];
string dir = @"c:\";
try
{
foundFiles = Directory.GetFiles(dir); // Remark; Array is resized from length zero
}
// Please add appropriate Exception handling yourself
catch (IOException)
{
Console.WriteLine("Log: Warning! IOException while reading directory: " + dir);
// throw; // This would throw Exception to caller and avoid compiler error
}
foreach (string filename in foundFiles)
Console.WriteLine("Filename: " + filename);