Apakah pernah ada alasan untuk menggunakan array ketika daftar tersedia? [Tutup]

30

Sepertinya List<T>dalam C # dapat melakukan segalanya array dapat melakukan dan banyak lagi, dan tampaknya juga sama efisiennya dalam memori dan kinerja sebagai array.

Jadi mengapa saya ingin menggunakan array?

Saya jelas tidak bertanya tentang kasus di mana API atau kendala eksternal lainnya (yaitu fungsi Utama) mengharuskan saya untuk menggunakan array ... Saya hanya bertanya tentang membuat struktur data baru dalam kode saya sendiri.

JoelFan
sumber
56
Untuk mengimplementasikanList<T>
ratchet freak
43
is also just as efficient in memory and performance as an array- um. Dari mana Anda mendapatkan gagasan itu?
Oded
12
Beberapa dimensi seperti var test = new string[5,5];)
Knerd
7
Ada juga array byte [] yang umum digunakan.
SBoss
11
Khusus untuk C #, Eric Lippert menulis tentang ini di blogs.msdn.com/b/ericlippert/archive/2008/09/22/… .
Mephy

Jawaban:

26

Alasan yang sama saya tidak mengendarai truk ketika akan bekerja. Saya tidak menggunakan sesuatu yang saya tidak akan menggunakan fitur.

Pertama-tama array adalah konstruksi primitif sehingga array lebih cepat dan lebih efisien daripada Daftar <>, jadi argumen Anda tidak benar. Array juga tersedia di mana-mana dan dikenal oleh pengembang menggunakan berbagai bahasa dan platform.

Alasan paling penting saya menggunakan array daripada Daftar <> adalah untuk menyiratkan bahwa data adalah panjang tetap . Jika saya tidak akan menambah atau menghapus item apa pun dari pengumpulan data itu, saya ingin memastikan bahwa jenisnya mencerminkan hal itu.

Hal lain adalah katakanlah Anda menerapkan struktur data baru dan Anda telah membaca beberapa makalah tentang itu. Sekarang saat menerapkan algoritma tertentu, Anda tidak selalu bisa bergantung pada implementasi orang lain dari jenis yang bersifat umum. Ini berubah dari .NET ke Mono dan bahkan antara versi kerangka kerja yang berbeda.

Dan kadang-kadang lebih mudah untuk mem-porting sepotong kode yang menggunakan array daripada tipe kerangka bergantung.

Mert Akcakaya
sumber
4
Bagaimana sebuah array "lebih cepat" dari daftar, mengingat List<T>array diimplementasikan menggunakan array? Jika Anda tahu jumlah elemen sebelumnya (yang harus Anda ketahui, saat menggunakan array), Anda bisa menggunakan pengetahuan itu saat menginisialisasi daftar juga.
Theodoros Chatzigiannakis
1
@TheodorosChatzigiannakis Saat menggunakan array, kami mengalokasikan memori dan hanya membuat tugas, polos malloc (), tanpa overhead. Ketika Anda menggunakan Daftar <> Anda akan "Tambah" item dan ketika menambahkan item Daftar <> membuat beberapa pemeriksaan batas dan panggilan metode EnsureCapacity yang akan menyalin konten ke array yang baru dialokasikan lainnya jika kapasitas saat ini tidak cukup. Ini berarti jika Anda tidak perlu mengalokasikan memori baru secara dinamis, kinerja Daftar tidak sebaik array.
Mert Akcakaya
4
Apa yang Anda katakan adalah benar, tetapi mengasumsikan bahwa baik kita tidak tahu jumlah elemen sebelumnya (dalam hal ini, array tidak pula berguna) atau yang kita lakukan tahu jumlah elemen sebelumnya tapi kami sengaja tidak digunakan dalam hal daftar. Jika kita lakukan menggunakan hitungan elemen untuk menginisialisasi daftar dengan kapasitas yang diinginkan, kita mendapatkan hanya satu alokasi array (sampai Anda mencapai kapasitas), dengan demikian kita membayar biaya kinerja yang sama. Semua operasi umum lainnya adalah sama (pencarian, pencarian berdasarkan indeks, penetapan berdasarkan indeks), kecuali untuk penambahan lebih lanjut (array yang tidak memiliki sama sekali).
Theodoros Chatzigiannakis
3
@TheodorosChatzigiannakis: Array yang lebih cepat dari daftar. Cukup jalankan tolok ukur sederhana untuk memeriksa.
Mehrdad
1
@TheodorosChatzigiannakis, Ya, tapi masih ada pemeriksaan batas.
Mert Akcakaya
18

Anda perlu array untuk mengelola koleksi struct yang bisa berubah , tentu saja, dan apa yang akan kami lakukan tanpa itu.

struct EvilMutableStruct { public double X; } // don't do this

EvilMutableStruct[] myArray = new EvilMutableStruct[1];
myArray[0] = new EvilMutableStruct()
myArray[0].X = 1; // works, this modifies the original struct

List<EvilMutableStruct> myList = new List<EvilMutableStruct>();
myList.Add(new EvilMutableStruct());
myList[0].X = 1; // does not work, the List will return a *copy* of the struct

(perhatikan bahwa mungkin ada beberapa kasus di mana array struct yang dapat diubah diinginkan, tetapi biasanya perilaku yang berbeda dari struct yang bisa berubah dalam array versus koleksi lainnya adalah sumber kesalahan yang harus dihindari)


Lebih serius, Anda memerlukan sebuah array jika Anda ingin melewatkan elemen dengan referensi . yaitu

Interlocked.Increment(ref myArray[i]);  // works
Interlocked.Increment(ref myList[i]);   // does not work, you can't pass a property by reference

Itu bisa berguna untuk kode threadsafe bebas kunci.


Anda memerlukan array jika Anda ingin menginisialisasi koleksi ukuran tetap dengan cepat dan efisien dengan nilai default .

double[] myArray = new double[1000]; // contains 1000 '0' values
                                     // without further initialisation

List<double> myList = new List<double>(1000) // internally contains 1000 '0' values, 
                                             // since List uses an array as backing storage, 
                                             // but you cannot access those
for (int i =0; i<1000; i++) myList.Add(0);   // slow and inelegant

(perhatikan bahwa mungkin untuk mengimplementasikan konstruktor untuk Daftar yang melakukan hal yang sama, hanya saja c # tidak menawarkan fitur ini)


Anda memerlukan sebuah array jika Anda ingin menyalin bagian koleksi secara efisien

Array.Copy(array1, index1, array2, index2, length) // can't get any faster than this

double[,] array2d = new double[10,100];
double[] arraySerialized = new double[10*100];
Array.Copy(array2d, 0, arraySerialized, 0, arraySerialized.Length);
// even works for different dimensions

(sekali lagi, ini adalah sesuatu yang bisa diterapkan untuk Daftar juga, tetapi fitur ini tidak ada di c #)

HugoRune
sumber
Jika suatu tipe seharusnya mewakili sekelompok variabel terkait-tetapi-independen yang menempel bersama lakban (misalnya koordinat suatu titik), struct bidang-terbuka adalah representasi terbaik. Jika suatu variabel dianggap memiliki banyak grup seperti itu, sebuah array dari tipe struktur itu adalah representasi terbaik. Seseorang seharusnya tidak menggunakan struct yang bisa berubah-ubah di tempat-tempat di mana seseorang menginginkan sebuah objek, tetapi itu tidak berarti kita harus menggunakan objek atau benda-benda yang berpura-pura menjadi objek di tempat-tempat di mana kita ingin sekelompok variabel menempel bersama-sama dengan lakban.
supercat
Ada beberapa situasi di mana Anda mungkin menginginkan struct yang bisa berubah-ubah, seperti ketika Anda membutuhkan sedikit kinerja terakhir dan tidak mampu membeli alokasi tumpukan dan referensi, dan dalam hal itu array struct adalah taruhan terbaik Anda. Esai bagus di sini . Tapi saya tidak setuju bahwa kelas tidak boleh mewakili "banyak variabel yang menempel bersama". Struktur dan kelas secara konseptual sebagian besar sama, perbedaannya terutama karena detail implementasi.
HugoRune
Jika seseorang ingin menggunakan koleksi referensi objek yang bisa berubah-ubah sebagai kumpulan kelompok independen variabel independen, kita harus menetapkan dan memelihara invarian yang setiap elemen mengidentifikasi objek yang tidak ada referensi non-sesaat lainnya di mana pun di alam semesta. Itu tentu bisa dilakukan (dan sering kali), tetapi tidak ada dalam bahasa atau kerangka kerja untuk membantu programmer dalam menjunjung tinggi invarian itu. Sebaliknya, panjang array-100 dari jenis struktur dengan empat bidang contoh akan secara otomatis dan permanen merangkum 400 variabel independen.
supercat
Saya pikir komentar ini adalah tempat yang salah untuk membahas masalah ini lebih lanjut, dan melihat ketika Anda menambahkan jawaban Anda sendiri , sepertinya tidak ada kebutuhan untuk menggandakan informasi ini di sini. Cukuplah untuk mengatakan, array dapat digunakan untuk mengelola struct yang bisa berubah. Apakah dan kapan harus menggunakan perilaku implementasi dari struct tersebut untuk menegakkan batasan data tertentu benar-benar melampaui ruang lingkup jawaban saya.
HugoRune
15

Jadi mengapa saya ingin menggunakan array?

Jarang , Anda akan memiliki skenario di mana Anda tahu bahwa Anda memerlukan sejumlah elemen. Dari perspektif desain, ini harus dihindari. Jika Anda memerlukan 3 hal, sifat bisnis berarti Anda akan sangat membutuhkan 4 di rilis berikutnya.

Namun, ketika skenario langka ini benar-benar terjadi, menggunakan array untuk memastikan bahwa invarian ukuran tetap berguna. Ini memberikan sinyal kepada programmer lain bahwa itu adalah ukuran tetap, dan membantu mencegah penyalahgunaan di mana seseorang menambah atau menghapus elemen - melanggar harapan di tempat lain dalam kode.

Telastyn
sumber
23
Ukuran array tidak ditetapkan pada batu pada saat seseorang menulis kode. Itu bisa, dan sering, variabel run-time. Itu tidak pernah berubah setelah array telah dibuat .
11
Sudah biasa berurusan dengan sejumlah elemen tetap. Jika Anda bekerja dengan poin 3D, Anda mungkin tidak akan bekerja dengan poin 5D di masa mendatang. Masalah yang lebih besar dengan array adalah mereka bisa berubah dan tidak memiliki label yang nyaman yang melekat pada elemen mereka.
Doval
3
@JanDvorak Daftar dapat menyusut atau tumbuh dan dengan demikian tidak masuk akal dalam konteks apa pun yang melibatkan sejumlah elemen tetap.
Doval
9
Jarang? Tidak semua orang bekerja pada monstrositas perusahaan dengan konfigurasi ultra-rumit.
whatsisname
3
Sangat umum memiliki jumlah elemen yang tetap. Pastikan panjangnya ditentukan oleh konstanta, jadi ketika rilis berikutnya menambah jumlah elemen dari 3 menjadi 4, Anda cukup mengubah konstanta dan semua yang bergantung pada ini diadaptasi.
Hans
9

Pertanyaan Anda sebenarnya sudah dijawab sebelumnya .

dan tampaknya juga sama efisiennya dalam memori dan kinerja sebagai array.

Bukan itu. Dari pertanyaan yang saya tautkan:

List/foreach:  3054ms (589725196)
Array/foreach: 1860ms (589725196)

Array dua kali lebih cepat dalam kasus-kasus penting tertentu. Saya yakin penggunaan memori juga berbeda secara non-sepele.

Karena premis utama pertanyaan Anda dikalahkan, saya menganggap ini menjawab pertanyaan Anda. Selain itu, terkadang array dipaksakan pada Anda oleh Win32 API, atau shader GPU Anda, atau pustaka non-DotNet lainnya.

Bahkan di dalam DotNet, beberapa metode mengkonsumsi dan / atau mengembalikan array (seperti String.Split). Yang berarti Anda sekarang harus memakan biaya panggilan ToListdan ToArraysepanjang waktu, atau Anda harus menyesuaikan dan menggunakan array, mungkin melanjutkan siklus dengan menyebarkan ini kepada pengguna hilir kode Anda yang buruk .

Lebih banyak pertanyaan dan jawaban tentang Stack Overflow pada topik ini:

Hebat
sumber
Menariknya, jawaban itu menunjukkan bahwa jika Anda menggunakan loop indeks kuno ( untuk bukannya foreach ) perbedaan kinerja minimal.
user949300
3

Selain alasan yang tercantum dalam jawaban lain, array literal membutuhkan lebih sedikit karakter untuk menyatakan:

var array = new [] { "A", "B", "C" };
var list = new List<string>() { "A", "B", "C" };

Menggunakan array daripada Listmembuat kode sedikit lebih pendek dan hanya sedikit lebih mudah dibaca dalam kasus ketika (1) Anda harus melewati IEnumerable<T>literal apa pun , atau (2) di mana fungsi lain dari Listtidak masalah dan Anda perlu menggunakan beberapa daftar seperti harfiah.

Saya telah melakukan ini sesekali dalam unit test.

ikh
sumber
1
Ya hanya untuk menambahkan. Ini juga berfungsi untuk Anda yang perlu melewati IList <T>
Esben Skov Pedersen
+1, sering saya memiliki beberapa operasi untuk beberapa objek dari jenis yang sama yang tidak ada dalam koleksi. Sangat mudah, singkat dan jelas untuk menulis foreach( var x in new []{ a, b, c ) ) DoStuff( x )atau yang new []{ a, b, c ).Select( ... )lainnya
stijn
3

Ini benar-benar dari perspektif OO.

Walaupun saya tidak dapat memikirkan alasan untuk melewatkan array, saya tentu dapat melihat situasi di mana representasi array internal ke kelas mungkin merupakan pilihan terbaik.

Walaupun ada opsi lain yang memberikan karakteristik serupa, tidak ada yang tampak seintuitif array untuk masalah yang berhubungan dengan pemrosesan permutasi, bersarang untuk loop, representasi matriks, bitmap dan algoritma interleaving data.

Ada sejumlah besar bidang ilmiah yang mengandalkan matematika matriks secara luas. (misalnya pemrosesan gambar, koreksi kesalahan data, pemrosesan sinyal digital, rim masalah matematika terapan). Sebagian besar algoritma di bidang tersebut ditulis dalam hal menggunakan array / matriks multidimensi. Jadi akan lebih alami untuk mengimplementasikan algoritma karena mereka didefinisikan daripada membuatnya lebih ramah "perangkat lunak" dengan mengorbankan kehilangan ikatan langsung ke makalah yang menjadi dasar algoritma.

Seperti yang saya katakan, dalam kasus-kasus ini Anda mungkin bisa lolos menggunakan daftar tetapi itu menambah lapisan kompleksitas di atas apa yang sudah algoritma kompleks.

Dunk
sumber
3

Ini sebenarnya berlaku untuk bahasa lain yang memiliki daftar juga (seperti Java atau Visual Basic). Ada beberapa kasus di mana Anda perlu menggunakan array karena suatu metode mengembalikan sebuah array daripada sebuah Daftar.

Dalam program yang sebenarnya, saya tidak berpikir array akan digunakan sangat sering, tetapi kadang-kadang Anda tahu data akan menjadi ukuran yang tetap dan Anda menyukai kenaikan kinerja kecil yang Anda dapatkan dari menggunakan array. Mikro-optimasi akan menjadi alasan yang valid, sama seperti metode mengembalikan daftar, atau kebutuhan untuk struktur data multidimensi.

Dylan Meeus
sumber
1
Banyak bahasa bahkan tidak memiliki koleksi daftar dan larik terpisah. Di sisi lain, menggunakan di list<T>mana vector<T>akan bekerja adalah ide buruk yang buruk di C / C ++.
Gort the Robot
1
"Karena sebuah metode mengembalikan sebuah array" - ini adalah kesalahan Java, memaksa pemrogram untuk menyusun kode dengan "Arrays.asList (x)". T [] setidaknya harus menerapkan Iterable <T>
kevin cline
4
@StevenBurnap - tentu saja sangat buruk di C, karena tidak ada cara untuk mengkompilasi kode itu.
Pete Becker
@PeteBecker Ekspresi vector<T> x mengkompilasi baik-baik saja bagi saya di C . :-)
svick
Maaf, saya berarti setara dengan C linting tangan list<T>. Pada dasarnya, saya telah melihat banyak masalah kinerja yang disebabkan oleh pengembang hanya menggunakan daftar secara default ketika array adalah pilihan yang lebih baik.
Gort the Robot
1

Yah, saya menemukan penggunaan untuk array dalam permainan yang telah saya tulis. Saya menggunakannya untuk membuat sistem inventaris dengan jumlah slot tetap. Ini memiliki beberapa manfaat:

  1. Saya tahu persis berapa banyak slot inventaris terbuka yang dimiliki objek game dengan melihat dan melihat slot mana yang nol.
  2. Saya tahu persis di mana indeks setiap item.
  3. Itu masih array "diketik" (Item [] Persediaan), jadi saya bisa menambah / menghapus objek jenis "Item".

Saya pikir jika saya perlu "menambah" ukuran inventaris, saya bisa melakukannya dengan mentransfer item lama ke array baru, tetapi karena inventaris diperbaiki oleh ruang layar dan saya tidak perlu secara dinamis membuatnya lebih besar / lebih kecil, itu bekerja dengan baik untuk tujuan saya menggunakannya.

mt
sumber
1

Jika Anda melintasi semua elemen daftar, maka tidak, array tidak diperlukan, 'selanjutnya' atau arbitrer 'pemilihan tanpa penggantian' akan baik-baik saja.

Tetapi jika algoritma Anda membutuhkan akses acak ke elemen-elemen dalam koleksi, maka, ya, sebuah array diperlukan.

Ini agak analog dengan "apakah perlu dilakukan?". Dalam bahasa modern yang masuk akal tidak diperlukan sama sekali. Tetapi jika Anda mengupas abstraksi, pada titik tertentu, hanya itu yang sebenarnya tersedia untuk Anda, yaitu, satu-satunya cara untuk mengimplementasikan abstraksi ini adalah dengan fitur 'tidak perlu'. (Tentu saja, analoginya tidak sempurna, saya tidak berpikir ada yang mengatakan bahwa array adalah praktek pemrograman yang buruk; mereka mudah dimengerti dan dipikirkan).

Mitch
sumber
Daftar <T> juga menawarkan akses acak. Tentu, ini diimplementasikan dengan sebuah array, tetapi itu tidak perlu mengganggu Anda, pengguna. Jadi yang terbaik, Anda menawarkan satu alasan untuk menggunakan array: Untuk diimplementasikan List<T>.
@delnan saya pikir itu poin saya sehubungan dengan abstraksi. Terkadang lebih baik untuk berpikir dalam hal array, bukan hanya karena alasan efisiensi. (tentu saja kadang-kadang lebih baik memikirkan daftar yang ditautkan, dan lebih baik dari pada memikirkan daftar (tanpa peduli tentang tautan atau cara penerapannya), dan lebih baik hanya koleksi.
Mitch
0

Kompatibilitas warisan.

Semua bentuk pengalaman pribadi:

Programer lama - kolega saya menggunakan array di mana-mana, telah melakukannya selama lebih dari 30 tahun, semoga berhasil mengubah pikirannya dengan ide-ide baru Anda yang ketinggalan jaman.

Kode lawas - foo (bilah array []) yakin Anda dapat menggunakan fungsi toarray daftar / vektor / koleksi tetapi jika Anda tidak menggunakan salah satu fitur tambahan, lebih mudah menggunakan array untuk memulainya, seringkali lebih mudah dibaca tanpa beralih jenis.

Legacy boss - bos saya adalah programmer yang baik sebelum dia pergi ke manajemen bertahun-tahun yang lalu dan masih berpikir dia up to date, "menggunakan array" dapat mengakhiri pertemuan, menjelaskan berapa koleksi yang dapat menghabiskan biaya makan siang untuk semua orang.

Skeith
sumber
3
kolega yang berada 20 tahun di belakang kurva dan bos yang ingin tahu tipe data apa yang Anda gunakan ... Saya suka situs ini karena mengingatkan diri saya sendiri betapa jauh lebih buruknya pekerjaan saya
JoelFan
1
sekitar 40% dari apa yang kami lakukan adalah desain yang disematkan di mana diskusi diadakan di KB, ia suka memberi tahu saya bahwa dia tidak ketinggalan zaman dan specalised lol
Skeith
0

1) Tidak ada versi multidimensi Daftar. Jika data Anda memiliki lebih dari satu dimensi, akan sangat tidak efisien untuk menggunakan daftar.

2) Ketika Anda berhadapan dengan sejumlah besar tipe data kecil (katakanlah, peta di mana yang Anda miliki adalah satu byte untuk tipe terrain), mungkin ada perbedaan kinerja yang cukup besar karena caching. Versi array memuat beberapa item per memori yang dibaca, versi daftar memuat hanya satu. Selain itu, versi array menampung beberapa kali lebih banyak sel dalam cache daripada versi daftar - jika Anda berulang kali memproses data ini dapat membuat perbedaan besar jika versi array cocok dengan cache tetapi versi daftar tidak.

Untuk kasus ekstrem, pertimbangkan Minecraft. (Ya, itu tidak ditulis dalam bahasa C #. Alasan yang sama berlaku.)

Loren Pechtel
sumber
0

Array 100-elemen dari beberapa tipe T merangkum 100 variabel independen dari tipe T. Jika T adalah tipe nilai yang memiliki bidang publik yang bisa berubah dari tipe Q dan salah satu dari tipe R, maka setiap elemen dari array akan merangkum variabel independen tipe Q dan R. Array secara keseluruhan dengan demikian akan merangkum 100 variabel independen dari tipe Q dan 100 variabel independen dari tipe R; variabel-variabel tersebut dapat diakses secara individual tanpa mempengaruhi variabel lainnya. Tidak ada tipe koleksi selain array yang memungkinkan bidang struktur digunakan sebagai variabel independen.

Jika T kebetulan bukan tipe kelas dengan bidang publik yang bisa berubah dari tipe Q dan R, setiap elemen array memegang satu - satunya referensi, di mana saja di alam semesta, ke instance T, dan jika tidak ada elemen array yang akan pernah dimodifikasi untuk mengidentifikasi objek yang memiliki referensi luar, maka array akan secara efektif merangkum 100 variabel independen tipe Q dan 100 variabel independen tipe R. Jenis koleksi lainnya dapat meniru perilaku array seperti itu, tetapi jika satu-satunya tujuan array adalah untuk merangkum 100 variabel tipe Q dan 100 tipe R, merangkum setiap pasangan variabel dalam objek kelasnya sendiri adalah cara yang mahal untuk melakukan itu. Lebih lanjut,menggunakan array atau kumpulan tipe kelas yang dapat diubah menciptakan kemungkinan bahwa variabel yang diidentifikasi oleh elemen array mungkin tidak independen .

Jika suatu tipe seharusnya berperilaku seperti semacam objek, maka itu haruslah tipe kelas atau struktur bidang pribadi yang tidak menyediakan sarana mutasi selain penggantian. Namun, jika suatu tipe seharusnya berperilaku seperti sekelompok variabel terkait-tetapi-independen yang menempel bersama lakban, maka seseorang harus menggunakan jenis yang merupakan sekelompok variabel yang menempel bersama lakban - sebuah struktur bidang terbuka . Susunan jenis tersebut sangat efisien untuk digunakan, dan memiliki semantik yang sangat bersih. Penggunaan jenis apa pun akan menyebabkan semantik yang kacau, kinerja yang lebih rendah, atau keduanya.

supercat
sumber
0

Satu perbedaan penting adalah alokasi memori. Sebagai contoh, melintasi daftar tertaut dapat mengakibatkan banyak kesalahan cache dan kinerja lebih lambat, sedangkan array mewakili potongan memori yang berdekatan yang menyimpan beberapa instance dari beberapa tipe data tertentu, dan melakukan traversenya agar lebih mungkin mengenai CPU. cache.

Tentu saja, array referensi objek mungkin tidak mendapat manfaat sebanyak dari hit cache, karena dereferencing masih bisa membawa Anda ke mana saja dalam memori.

Lalu ada implementasi daftar seperti ArrayList, yang mengimplementasikan daftar menggunakan array. Mereka primitif yang berguna untuk dimiliki.

Rory Hunter
sumber
2
Pertanyaannya secara khusus menanyakan tentang tipe .Net List<T>, yang tidak diimplementasikan menggunakan daftar tertaut, tetapi menggunakan array (pada dasarnya setara dengan ArrayList<T>di Jawa).
svick
-2

Berikut adalah beberapa panduan yang dapat Anda gunakan kapan harus memilih Arraydan kapan harus memilih List.

  • Gunakan Arraysaat kembali dari suatu metode.
  • Gunakan Listsebagai variabel ketika Anda membangun nilai kembali (di dalam metode). Kemudian gunakan .ToArray()ketika kembali dari metode.

Secara umum, gunakan Arraysaat Anda tidak bermaksud konsumen untuk menambahkan item ke koleksi. Gunakan Listsaat Anda bermaksud konsumen untuk menambahkan item ke koleksi.

Arraydimaksudkan untuk berurusan dengan koleksi "statis" sementara Listitu dimaksudkan untuk berurusan dengan koleksi "dinamis".

Daniel Lidström
sumber
2
Aturan yang Anda sarankan sewenang-wenang dan cenderung menghasilkan kode yang tidak efisien yang melakukan penyalinan yang tidak perlu. Paling tidak Anda membutuhkan beberapa bentuk pembenaran untuk itu.
Jules
@ Jules Saya menemukan pengalaman pengembang jauh lebih penting daripada optimasi mikro. Saya tidak pernah memiliki masalah kinerja pada level ini.
Daniel Lidström
Saya tidak melihat bagaimana pengalaman pengembang ditingkatkan oleh aturan ini. Ini mengharuskan Anda untuk menebak apa yang ingin dilakukan oleh klien dari kode Anda dengan nilai yang dikembalikan, dan membuat kode Anda kurang nyaman untuk digunakan ketika Anda salah, namun saya gagal melihat ada manfaat sama sekali untuk itu. Kinerja mungkin menjadi perhatian sekunder, tetapi saya tidak akan mengorbankannya untuk mengikuti aturan yang tidak menghasilkan apa-apa.
Jules
@ Jules Saya kira itu turun ke preferensi Anda sendiri. Saya lebih suka memperlakukan nilai kembali sebagai konstanta, karena itu saya lebih suka menggunakan Arrayalih-alih List. Senang mendengar pikiran Anda!
Daniel Lidström
Sudahkah Anda mempertimbangkan untuk menggunakan UmmodifiableLists?
Jules