Apakah mungkin untuk membuat array kosong tanpa menentukan ukurannya?
Misalnya, saya membuat:
String[] a = new String[5];
Bisakah kita membuat array string di atas tanpa ukuran?
Apakah mungkin untuk membuat array kosong tanpa menentukan ukurannya?
Misalnya, saya membuat:
String[] a = new String[5];
Bisakah kita membuat array string di atas tanpa ukuran?
Jawaban:
Jika Anda akan menggunakan koleksi yang sebelumnya tidak Anda ketahui ukurannya, ada opsi yang lebih baik daripada array.
Gunakan List<string>
sebaliknya - itu akan memungkinkan Anda untuk menambahkan item sebanyak yang Anda butuhkan dan jika Anda perlu mengembalikan array, panggil ToArray()
variabel tersebut.
var listOfStrings = new List<string>();
// do stuff...
string[] arrayOfStrings = listOfStrings.ToArray();
Jika Anda harus membuat array kosong, Anda dapat melakukan ini:
string[] emptyStringArray = new string[0];
string[]
yang tidak memiliki elemen. Jika Anda mencoba mengakses emptyStringArray[0]
, Anda akan mendapatkanIndexOutOfRangeException
Coba ini:
string[] a = new string[] { };
int[] variable = new int[]{}
dan menggunakannya misalnya dalam satu lingkaran seperti foreach (var s in variable){ Console.WriteLine(s);}
kode dikompilasi ke: int[] args1 = new int[0];
dan foreach (int num in args1){Console.WriteLine(num);}
. Jadi seharusnya tidak ada perbedaan antara menggunakan new int[0]
dan new int[]{}
karena keduanya dikompilasi ke kode yang sama.
var
, meskipun hanya untuk variabel lokal (bukan untuk bidang). Namun dalam C # 2.0 (Visual Studio 2005) dan sebelumnya, Anda harus menggunakan sintaks dari jawaban ini (atau string[] a = new string[0];
).
NET 4.6 cara disukai adalah dengan menggunakan metode baru, Array.Empty
:
String[] a = Array.Empty<string>();
The implementasi adalah ringkas, menggunakan bagaimana anggota statis di kelas generik berperilaku 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];
}
(kode kontrak terkait kode dihapus untuk kejelasan)
Lihat juga:
Array.Empty
kode sumber pada Sumber ReferensiArray.Empty<T>()
Enumerable.Empty<T>().ToArray()
Array.Empty<T>()
tidak tidak membuat sebuah array. Ini mengembalikan referensi ke array yang dialokasikan sebelumnya.
Tidak banyak gunanya mendeklarasikan array tanpa ukuran. Array adalah tentang ukuran . Ketika Anda mendeklarasikan array ukuran tertentu, Anda menentukan jumlah slot tetap yang tersedia dalam koleksi yang dapat menampung barang-barang, dan karenanya memori dialokasikan. Untuk menambahkan sesuatu ke dalamnya, Anda harus tetap menginisialisasi ulang array yang ada (bahkan jika Anda mengubah ukuran array, lihat utas ini ). Salah satu kasus langka di mana Anda ingin menginisialisasi array kosong adalah dengan melewatkan array sebagai argumen.
Jika Anda ingin mendefinisikan koleksi ketika Anda tidak tahu ukurannya mungkin berapa, array bukan pilihan Anda, tetapi sesuatu seperti List<T>
atau serupa.
Yang mengatakan, satu-satunya cara untuk mendeklarasikan array tanpa menentukan ukuran adalah dengan memiliki array kosong ukuran 0 . Hemant dan Alex Dn menyediakan dua cara. Alternatif lain yang lebih sederhana adalah dengan :
string[] a = { };
[ Elemen-elemen di dalam braket harus secara implisit dapat dikonversi ke tipe yang ditentukan, misalnya,string[] a = { "a", "b" };
]
Atau yang lain:
var a = Enumerable.Empty<string>().ToArray();
Ini cara yang lebih deklaratif :
public static class Array<T>
{
public static T[] Empty()
{
return Empty(0);
}
public static T[] Empty(int size)
{
return new T[size];
}
}
Sekarang Anda dapat menelepon:
var a = Array<string>.Empty();
//or
var a = Array<string>.Empty(5);
Sederhana dan elegan!
string[] array = {}
array
menjadi adil a
, seperti array
kata kunci saat ditulis dengan huruf besar. Hanya praktik buruk untuk menggunakan nama kata kunci sebagai nama variabel - bahkan jika kasusnya berbeda. Dan pada dasarnya sama dengan jawaban saya kecuali yang saya miliki String.Empty
di sana.
a
itu buruk?
string[] a = new string[0];
atau notasi singkat:
string[] a = { };
Cara yang disukai sekarang adalah:
var a = Array.Empty<string>();
Saya telah menulis ekspresi reguler pendek yang dapat Anda gunakan di Visual Studio jika Anda ingin mengganti alokasi panjang nol misalnya new string[0]
. Gunakan Cari (cari) di Visual Studio dengan opsi Ekspresi Reguler dihidupkan:
new[ ][a-zA-Z0-9]+\[0\]
Sekarang Temukan Semua atau F3 (Temukan Selanjutnya) dan ganti semua dengan Array.Empty <…> ()!
Anda dapat menentukan ukuran array saat runtime .
Ini akan memungkinkan Anda untuk melakukan apa pun untuk menghitung ukuran array secara dinamis. Tapi, begitu didefinisikan ukurannya tidak berubah.
Array a = Array.CreateInstance(typeof(string), 5);
int i = 5; string[] a = new string[i];
Saya sudah mencoba:
string[] sample = new string[0];
Tapi saya hanya bisa memasukkan satu string ke dalamnya, dan kemudian saya mendapat kesalahan exceptionOutOfBound, jadi saya cukup memberikan ukuran untuk itu, seperti
string[] sample = new string[100];
Atau cara lain yang cocok untuk saya:
List<string> sample = new List<string>();
Menetapkan Nilai untuk daftar:
sample.Add(your input);
Menggabungkan saran @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];
}
}
Contoh penggunaan:
Array<string>.Empty
UPDATE 2019-05-14
(kredit ke @Jaider ty)
Lebih baik gunakan .Net API:
public static T[] Empty<T> ();
https://docs.microsoft.com/en-us/dotnet/api/system.array.empty?view=netframework-4.8
Berlaku untuk:
.NET Core: 3.0 Preview 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 Standard: 2.1 Preview 2.0 1.6 1.5 1.4 1.3
...
HTH
arr = Array.Empty<string>();
Anda dapat melakukan:
string[] a = { String.Empty };
Catatan: OP berarti tidak harus menentukan ukuran, tidak membuat array tidak masuk akal
specify
ukuran, tidak membuat array sizeless
.
Ini adalah contoh dunia nyata. Dalam hal ini perlu menginisialisasi array foundFiles
terlebih dahulu ke nol panjang.
(Seperti yang ditekankan dalam jawaban lain: Ini menginisialisasi bukan elemen dan terutama bukan elemen dengan indeks nol karena itu berarti array memiliki panjang 1. Array memiliki panjang nol setelah baris ini!).
Jika bagian = string[0]
tersebut dihilangkan, ada kesalahan kompiler!
Ini karena blok tangkap tanpa rethrow. Compiler C # mengenali jalur kode, bahwa fungsi tersebut Directory.GetFiles()
dapat membuang Pengecualian, sehingga array dapat diinisialisasi.
Sebelum ada yang mengatakan, tidak mengubah kembali pengecualian akan menjadi penanganan kesalahan yang buruk: Ini tidak benar. Penanganan kesalahan harus sesuai dengan persyaratan.
Dalam hal ini diasumsikan bahwa program harus melanjutkan dalam kasus direktori yang tidak dapat dibaca, dan tidak rusak- contoh terbaik adalah fungsi yang melintasi struktur direktori. Di sini penanganan kesalahan hanya mencatatnya. Tentu saja ini bisa dilakukan dengan lebih baik, misalnya mengumpulkan semua direktori dengan GetFiles(Dir)
panggilan gagal dalam daftar, tetapi ini akan mengarah terlalu jauh di sini.
Cukup dengan menyatakan bahwa menghindar throw
adalah skenario yang valid, dan array harus diinisialisasi dengan panjang nol. Ini akan cukup untuk melakukan ini di blok tangkap, tapi ini akan menjadi gaya yang buruk.
Panggilan untuk GetFiles(Dir)
mengubah ukuran array.
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);