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?
c#
arrays
initialization
yogesh
sumber
sumber
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, panggilToArray()
variabel tersebut.Jika Anda harus membuat array kosong, Anda dapat melakukan ini:
sumber
string[]
yang tidak memiliki elemen. Jika Anda mencoba mengaksesemptyStringArray[0]
, Anda akan mendapatkanIndexOutOfRangeException
Coba ini:
sumber
int[] variable = new int[]{}
dan menggunakannya misalnya dalam satu lingkaran sepertiforeach (var s in variable){ Console.WriteLine(s);}
kode dikompilasi ke:int[] args1 = new int[0];
danforeach (int num in args1){Console.WriteLine(num);}
. Jadi seharusnya tidak ada perbedaan antara menggunakannew int[0]
dannew 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 (ataustring[] a = new string[0];
).NET 4.6 cara disukai adalah dengan menggunakan metode baru,
Array.Empty
:The implementasi adalah ringkas, menggunakan bagaimana anggota statis di kelas generik berperilaku Net :
(kode kontrak terkait kode dihapus untuk kejelasan)
Lihat juga:
Array.Empty
kode sumber pada Sumber ReferensiArray.Empty<T>()
sumber
Enumerable.Empty<T>().ToArray()
Array.Empty<T>()
tidak tidak membuat sebuah array. Ini mengembalikan referensi ke array yang dialokasikan sebelumnya.Anda bisa menginisialisasi dengan ukuran 0, tetapi Anda harus menginisialisasi ulang, ketika Anda tahu apa ukurannya, karena Anda tidak dapat menambahkan ke array.
sumber
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 :
[ Elemen-elemen di dalam braket harus secara implisit dapat dikonversi ke tipe yang ditentukan, misalnya,
string[] a = { "a", "b" };
]Atau yang lain:
Ini cara yang lebih deklaratif :
Sekarang Anda dapat menelepon:
sumber
Sederhana dan elegan!
sumber
array
menjadi adila
, sepertiarray
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 milikiString.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 <…> ()!
sumber
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.
sumber
int i = 5; string[] a = new string[i];
Saya sudah mencoba:
Tapi saya hanya bisa memasukkan satu string ke dalamnya, dan kemudian saya mendapat kesalahan exceptionOutOfBound, jadi saya cukup memberikan ukuran untuk itu, seperti
Atau cara lain yang cocok untuk saya:
Menetapkan Nilai untuk daftar:
sumber
Seperti yang saya tahu Anda tidak dapat membuat array tanpa ukuran, tetapi Anda bisa menggunakannya
dan kemudian
l.ToArray()
.sumber
Menggabungkan saran @nawfal & @Kobi:
Contoh penggunaan:
UPDATE 2019-05-14
(kredit ke @Jaider ty)
Lebih baik gunakan .Net API:
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
sumber
arr = Array.Empty<string>();
Anda dapat melakukan:
Catatan: OP berarti tidak harus menentukan ukuran, tidak membuat array tidak masuk akal
sumber
specify
ukuran, tidak membuat arraysizeless
.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.sumber