Listeler kullanılabilir olduğunda diziyi kullanmak için bir neden var mı? [kapalı]


30

Görünüşe göre List<T>C #, bir dizinin yapabileceği her şeyi yapabilir ve daha fazlasını yapar ve aynı zamanda bellek ve performansta bir dizi kadar verimli görünebilir.

Peki neden bir dizi kullanmak isteyeyim ki?

Açıkçası bir API veya başka bir harici kısıtlamanın (yani Ana işlev) bir dizi kullanmamı gerektirdiği durumlar hakkında soru sormuyorum ... Sadece kendi kodumda yeni veri yapıları oluşturma hakkında soruyorum.


56
UygulamakList<T>
cırcır ucube

43
is also just as efficient in memory and performance as an array- um. Bu fikri nereden aldın?
Oded

12
Gibi çoklu boyutlar var test = new string[5,5];)
Knerd

7
Ayrıca yaygın olarak kullanılan byte [] dizisi de vardır.
SBoss,

11
Özellikle C # için Eric Lippert bunu blogs.msdn.com/b/ericlippert/archive/2008/09/22/… 'de yazdı .
Mephy

Yanıtlar:


26

Aynı sebepten işe giderken kamyon kullanmam. Özelliklerini kullanmayacağım bir şey kullanmıyorum.

Her şeyden önce bir dizi ilkel bir yapıdır, bu yüzden bir dizi kesin bir List <> den daha hızlı ve daha verimlidir, yani argümanınız doğru değildir. Dizi ayrıca her yerde bulunur ve farklı diller ve platformlar kullanan geliştiriciler tarafından bilinir.

Liste <> yerine bir dizi kullanmamın en önemli nedeni, verilerin sabit uzunluklu olduğunu ima etmektir . Bu veri koleksiyonundan hiçbir öğe eklemez veya çıkarmazsam, türün bunu yansıttığından emin olmak istiyorum.

Başka bir şey, yeni bir veri yapısı uyguladığınızı ve bununla ilgili bazı makaleler okuduğunuzu varsayalım. Şimdi belirli algoritmaları uygularken, her zaman başkasının genel amaçlı bir tür uygulamasına güvenemezsiniz. .NET'ten Mono'ya ve hatta çerçevenin farklı sürümleri arasında bile değişiyor.

Ve bazen bir çerçeveye bağımlı tür yerine bir diziyi kullanan bir kod parçasını taşımak daha kolaydır.


4
Bir dizi List<T>kullanılarak uygulandığını göz önünde bulundurarak bir dizi bir listeden nasıl daha hızlıdır ? Öğe sayımını önceden biliyorsanız (bir dizi kullanırken bilmeniz gerekir), bu bilgiyi listeyi başlatırken de kullanabilirsiniz.
Theodoros Chatzigiannakis

1
@TheodorosChatzigiannakis Bir dizi kullanırken hafızayı ayırır ve basit ödevler yaparız, düz malloc (), ek yükü yok. Liste <> kullanırken, "Ekleme" yapacaksınız ve öğe eklerken Liste <> bazı sınır kontrolü yapıyor ve mevcut kapasite yeterli değilse, içeriği yeni atanmış bir diziye kopyalayacak EnsureCapacity yöntemini çağırıyor. Dinamik olarak yeni bellek ayırmanız gerekmiyorsa, List'in performansı dizi kadar iyi değildir.
Mert Akcakaya,

4
Ne diyorsun doğrudur, ama biz önceden eleman sayısını bilmiyorum ya (bu durumda, diziler değil kullanışlı zaten vardır) olduğunu varsayar ya da biz o do önceden eleman sayısını biliyoruz ancak kasıtlı kullanımı yok liste halinde. Biz ise bunu arzu kapasiteli liste başlatmak için eleman sayısını kullanın biz (o kapasiteye ulaşıncaya kadar), böylece aynı performans maliyetlerini ödemek Yalnızca bir dizi tahsisi olsun. Diğer tüm işlemler eşittir (arama, dizine göre alma, dizine göre atama), başka ekler dışında (hangi dizilere sahip olmayan).
Theodoros Chatzigiannakis

3
@TheodorosChatzigiannakis: Diziler vardır hızlı listelerine göre. Sadece kontrol etmek için basit bir kıyaslama yapın.
Mehrdad

1
@TheodorosChatzigiannakis, Evet, ancak hala sınır kontrolleri var.
Mert Akcakaya

18

Elbette değişken yapılar koleksiyonunuzu yönetmek için dizilere ihtiyacınız var ve bunlar olmadan ne yapardık?

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

(Bir dizi değişken yapının arzu edilebildiği bazı durumlar olabileceğine dikkat edin, ancak genellikle dizilerdeki diğer değişkenlere karşı değişken yapıların bu farklı davranışı kaçınılması gereken bir hata kaynağıdır.


Daha ciddi olarak, bir öğeyi referans olarak iletmek istiyorsanız bir diziye ihtiyacınız vardır . yani

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

Kilitli olmayan güvenli güvenlik kodu için faydalı olabilir.


Sabit boyutlu koleksiyonunuzu varsayılan değerle hızlı ve verimli bir şekilde başlatmak istiyorsanız, bir diziye ihtiyacınız vardır .

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

(Liste için aynı şeyi yapan bir kurucu uygulamanın mümkün olacağına dikkat edin, c # bu özelliği sunmaz)


Koleksiyonun bölümlerini etkin bir şekilde kopyalamak istiyorsanız bir diziye ihtiyacınız var.

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

(yine, bu Liste için de uygulanabilecek bir şeydir, ancak bu özellik c # da mevcut değildir)


Bir türün, koli bandıyla (örneğin bir noktanın koordinatları) birbirine yapışmış, ilişkili ancak bağımsız değişkenler grubunu temsil etmesi gerekiyorsa, maruz kalan bir alan en iyi gösterimidir. Bir değişkenin bu gruplardan bir demetini tutması gerekiyorsa, bu yapı türünün bir dizisi en iyi temsildir. Kişi, bir nesneyi bir nesneyi istediği yerlerde değişken yapıları kullanmamalı, ancak bu, kişinin bir koli bandıyla birbirine yapışmış değişkenlerin bir demetini istediği yerlerde nesneler gibi görünen nesneleri kullanması gerektiği anlamına gelmez.
supercat

En son performansa ihtiyaç duyduğunuz ve yığın tahsis ve referanslarını karşılayamayacağınız zamanlar gibi değişken bir yapı isteyebileceğiniz durumlar olabilir ve bu durumda bir dizi yapı en iyi seçimdir. Burada iyi deneme . Ancak bir sınıfın "birbirine yapışmış bir sürü değişken" temsil etmemesi gerektiği konusunda hemfikir olurdum. Kavramsal olarak yapılar ve sınıflar çoğunlukla aynıdır, farklılıklar öncelikle uygulama detaylarından kaynaklanmaktadır.
HugoRune

Bir bağımsız değişkenler bağımsız değişken grupları topluluğu olarak değiştirilebilir nesne referansları koleksiyonu kullanmak isterse, her öğenin evrende herhangi bir yerde başka hiçbir geçici olmayan referansın bulunmadığı bir nesneyi tanımlaması konusunda değişmez olanı oluşturmak ve sürdürmek gerekir. Bu kesinlikle yapılabilir (ve çoğu zaman), ancak programcıya bu değişmezi korumada yardımcı olacak dilde veya çerçevede hiçbir şey yoktur. Buna karşılık, dört örnek alanlı bir yapı tipi uzunluk-100 dizisi otomatik ve kalıcı olarak 400 bağımsız değişkeni içine alacaktır.
supercat

Bu yorumları daha fazla tartışmak için yanlış bir yer olduğunu düşünüyorum ve kendi cevabınızı eklerken , bu bilgiyi burada çoğaltmaya gerek yok gibi görünüyor. Söylemek yeterli, sıralar değişken yapıları yönetmek için kullanılabilir. Belli veri kısıtlamalarını uygulamak için bu yapıların uygulama davranışının kullanılıp kullanılmayacağı gerçekten cevabımın kapsamını aşıyor.
HugoRune

15

Peki neden bir dizi kullanmak isteyeyim ki?

Nadiren , belirli sayıda elemana ihtiyaç duyduğunuzu bildiğiniz bir senaryoya sahip olacaksınız. Tasarım açısından, bundan kaçınılmalıdır. Eğer 3 şeye ihtiyacınız varsa, işin doğası bir sonraki sürümde çok sık 4'e ihtiyacınız olacak demektir.

Yine de, bu nadir senaryo gerçekten gerçekleştiğinde, sabit büyüklüğün değişmezliğini zorlamak için bir dizi kullanmak yararlıdır. Diğer programcılara sabit bir boyut olduğuna dair bir sinyal verir ve birinin kod ekleyen başka bir yerde beklentileri eklemesi veya kaldırması durumunda kötüye kullanımı önlemeye yardımcı olur.


23
Birinin kod yazdığı sırada dizilerin boyutu taşa ayarlanmamış. Bir çalışma zamanı değişkeni olabilir ve sık sık. Dizi oluşturulduktan sonra hiçbir zaman değişmez .

11
Sabit sayıda element ile uğraşmak sıra dışı değildir. 3D noktalarla çalışıyorsanız, gelecekte herhangi bir noktada 5D noktalarla çalışmayacaksınız. Dizilerle ilgili en büyük sorun, değişken olmaları ve öğelerine eklenmiş uygun etiketlere sahip olmamasıdır.
Doval

3
@JanDvorak Listeler küçültülebilir veya büyüyebilir ve bu nedenle sabit sayıda öğe içeren herhangi bir bağlamda anlam ifade etmez.
Doval

9
Nadiren? Herkes süper karmaşık ultra yapılandırılabilir işletme canavarlıkları üzerinde çalışmamaktadır.
whatsisname

3
Sabit sayıda elemana sahip olmak çok yaygındır. Uzunluğun sabit olarak tanımlandığından emin olun, böylece bir sonraki sürüm öğelerin sayısını 3'ten 4'e yükselttiğinde, sabiti değiştirirsiniz ve buna bağlı olan her şey uyarlanır.
Hans

9

Sorunuz aslında daha önce cevaplanmış .

ve aynı zamanda bir dizi kadar hafıza ve performansta da etkili görünüyor.

Değil. Bağladığım sorudan:

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

Bazı önemli durumlarda diziler iki kat daha hızlı. Bellek kullanımının önemsiz olmayan bir şekilde farklılık gösterdiğinden de eminim.

Sorunuzun ana önceliği bu nedenle mağlup edildiğinden, bunun sorunuzu yanıtladığını varsayıyorum. Buna ek olarak, bazen diziler sizi Win32 API veya GPU'nuzun gölgelendiricisi veya diğer bazı DotNet olmayan kütüphaneler tarafından zorlarlar.

DotNet içinde bile, bazı yöntemler dizileri tüketir ve / veya döndürür (örneğin String.Split). Hangi araçlar artık çağrı maliyeti yemelidir ya ToListve ToArrayher zaman ya da belki zayıf alt kullanıcılara bu çoğaltım yoluyla döngüsü devam uyum ve kullanım dizisi gerekir senin kod.

Bu konu hakkında Stack Overflow hakkında daha fazla soru ve cevaplar:


İlginçtir, sen (eski moda endeksli döngüler kullanırsanız dikkat cevabın noktaları için yerine foreach ) performans farkı çok az.
user949300

3

Diğer cevaplarda listelenen nedenlere ek olarak, dizi değişmezinin bildirilmesi daha az karakter alır:

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

Yerine diziyi kullanmak List, kodu biraz kısaltır ve sadece biraz daha okunabilir kılar (1) bir IEnumerable<T>hazır bilgiyi geçirmeniz gerektiğinde veya (2) başka işlevselliklerin Listönemli olmadığı ve bazı liste benzeri şeyler kullanmanız gerektiğinde değişmezi.

Bunu bazen birim testlerinde yaptım.


1
Evet, sadece eklemek için. Ayrıca, bir IList <T>
Esben Skov Pedersen

+1, genellikle aynı türde bir koleksiyonda olmayan birkaç nesne için işlemim olur. Bu yazmak kolay, kısa ve açık foreach( var x in new []{ a, b, c ) ) DoStuff( x )ya da new []{ a, b, c ).Select( ... )vb
stijn

3

Bu kesinlikle bir OO perspektifinden.

Etrafında sadece bir dizi iletmek için bir neden düşünemesem de, kesinlikle sınıfın içindeki bir dizi gösteriminin muhtemelen en iyi seçenek olduğu durumları görebiliyorum.

Benzer özellikler veren başka seçenekler olsa da, hiçbiri işleme izinleriyle ilgilenen, döngüler için iç içe geçmiş, matris gösterimi, bitmapler ve veri araya sokma algoritmalarıyla ilgili sorunlar için bir dizi olarak sezgisel görünmemektedir.

Çok geniş bir matris matematiğine dayanan çok sayıda bilimsel alan vardır. (örneğin görüntü işleme, veri hatası düzeltme, dijital sinyal işleme, uygulamalı matematik problemlerinin bir parçası). Bu alanlardaki algoritmaların çoğu, çok boyutlu diziler / matrisler kullanılarak yazılmıştır. Bu yüzden algoritmaları tanımladıkları gibi uygulamak, algoritmaların dayandığı kağıtlara doğrudan bağları kaybetmek pahasına, onları daha "yazılım" dostu yapmaktan daha doğal olacaktır.

Dediğim gibi, bu durumlarda muhtemelen listeleri kullanmaktan kurtulabilirsiniz ama bu zaten karmaşık algoritmaların üstüne başka bir karmaşıklık katmanı ekler.


3

Bu aslında listeleri de içeren diğer diller için de geçerlidir (Java veya Visual Basic gibi). Bir yöntem Liste yerine bir dizi döndürdüğü için dizi kullanmanız gereken durumlar vardır.

Gerçek bir programda, bir dizinin çok sık kullanılacağını sanmıyorum, ancak bazen verilerin sabit bir boyut olacağını biliyorsunuz ve dizi kullanmaktan aldığınız küçük performans kazancını seviyorsunuz. Mikro-optimizasyon, bir listeyi döndüren bir yöntem veya çok boyutlu bir veri yapısına duyulan ihtiyaç olarak geçerli bir sebep olabilir.


1
Birçok dilde ayrı liste ve dizi koleksiyonları bile yoktur. Diğer yandan, list<T>nerede vector<T>çalışacağını kullanmak C / C ++ 'da feci derecede kötü bir fikirdir.
Robotu

1
"Bir yöntem bir dizi döndürdüğü için" - bu, programcıları kodu "Arrays.asList (x)" ile kapatmaya zorlayan, Java'nın yanlış bir özelliğidir. T [] en azından yinelenebilir <T> uygulamalıdır
kevin cline

4
@StevenBurnap - C’de kesinlikle feci derecede kötü, çünkü bu kodu derlemenin bir yolu yok.
Pete Becker,

@PeteBecker İfade vector<T> x , C için benim için iyi derler . :-)
svick

Maalesef, C'ye elle haddelenmiş eşdeğeri demek istedim list<T>. Temel olarak, bir dizi daha iyi bir seçim olduğunda, yalnızca varsayılan olarak listeleri kullanan geliştiricilerin neden olduğu birçok performans sorunu gördüm.
Robotu

1

Yazdığım bir oyunda diziler için bir kullanım buldum. Sabit sayıda slotu olan bir envanter sistemi oluşturmak için kullandım. Bunun birkaç faydası vardı:

  1. Oyun alanının ne kadar açık envanter yuvası olduğunu ve hangi yuvaların boş olduğunu görerek ve görerek olduğunu biliyordum.
  2. Her öğenin tam olarak hangi endekste olduğunu biliyordum.
  3. Hala bir "yazılı" dizisiydi (Öğe [] Envanter), bu yüzden "Öğe" türündeki nesneleri ekleyebilir / kaldırabilirim.

Envanterin boyutunu "artırmam" gerekirse, eski öğeleri yeni diziye aktararak yapabilirim, ancak envanter ekran alanıyla sabitlendiğinden ve dinamik olarak daha büyük hale getirme gereği duymadığımı düşündüm. / daha küçük, kullandığım amaç için işe yaradı.


1

Bir listenin tüm öğelerini geçiyorsanız, hayır, bir dizi gerekli değildir, 'sonraki' veya isteğe bağlı 'değiştirme olmadan seçim' iyi sonuç verir.

Ancak, algoritmanızın koleksiyondaki öğelere rasgele erişime ihtiyacı varsa, o zaman, evet, bir dizi gereklidir.

Bu, "Gitmek gerekli midir?" E benzer. Makul bir modern dilde hiç gerekli değildir. Ancak, soyutlamaları kaldırırsanız, bir noktada, aslında sizin için mevcut olan tek şey budur, yani, bu soyutlamaları uygulamanın tek yolu 'gereksiz' özelliktir. (Elbette, analoji mükemmel değildir, kimsenin dizilerin zayıf programlama uygulaması olduğunu söylemediğini sanmıyorum; anlaşılması ve düşünülmesi kolaydır).


<T> listesi ayrıca rasgele erişim sunar. Elbette, bir dizi ile uygulandı , ancak kullanıcının sizi rahatsız etmesine gerek yok. Dolayısıyla, en iyi ihtimalle, dizileri kullanmak için tek bir neden önerdiniz: Uygulamak List<T>.

@delnan Sanırım soyutlamalar açısından benim açımdan. Bazen sadece verimlilik nedeniyle değil, bir dizi olarak düşünmek daha iyidir. (tabii ki bazen bağlantılı bir listeyi düşünmek ve bir listeyi düşünmekten daha iyidir (linkleri veya başka şekilde nasıl uygulandığını düşünmeden), ve sadece bir koleksiyon daha iyidir.
Mitch

0

Eski uyumluluk.

Tüm form kişisel deneyim:

Eski programcılar - meslektaşım her yerde dizileri kullanıyor, 30 yıldan uzun bir süredir devam ediyor, yeni meraklı fikirlerinizle fikrini değiştirmekte iyi şanslar.

Eski kod - foo (dizi çubuğu []) bir liste / vektör / toplama toarray işlevini kullanabildiğinizden emin olun, ancak orada herhangi bir ek özellik kullanmazsanız, başlangıçta tür değiştirme olmadan genellikle daha okunaklı olan bir diziyi kullanmak daha kolaydır.

Eski patron - Patronum yıllar önce yönetime girmeden önce iyi bir programcıydı ve hala bir koleksiyonun herkesin öğle yemeğine ne kadar pahalıya mal olabileceğini açıklayan, "dizileri kullanıyor" bir toplantıyı sonlandırabileceğini düşünüyor.


3
Eğrinin 20 yıl arkasındaki meslektaşlarım ve hangi veri türlerini kullandığınızı bilmek isteyen bir patron ... Bu siteyi işimin ne kadar daha kötü olabileceğini hatırlattığım için seviyorum
JoelFan

1
yaptığımız
işlerin

0

1) Listenin çok boyutlu bir versiyonu yoktur. Verileriniz birden fazla boyuta sahipse listeleri kullanmak çok verimsiz olacaktır.

2) Çok sayıda küçük veri türü ile uğraşırken (örneğin, sahip olduğunuz alanın tümü için bir bayt olan bir harita) önbellekleme nedeniyle önemli performans farklılıkları olabilir. Dizi sürümü, okuma başına birkaç öğe yüklüyor, liste sürümü yalnızca birini yüklüyor. Ayrıca, dizi sürümü, önbellekteki liste sürümünden birkaç kez daha fazla hücreye sahiptir - verileri tekrar tekrar işliyorsanız, dizi sürümü önbelleğe sığıyorsa ancak liste sürümü uymuyorsa, bu büyük bir fark yaratabilir.

Aşırı bir durum için Minecraft'ı düşünün. (Evet, C # ile yazılmış değildir. Aynı sebep geçerlidir.)



0

Bazı T tipindeki 100 elementli bir dizi, T tipindeki 100 bağımsız değişkeni kapsar. Eğer T, Q tipinde değişken bir ortak alana ve R tipinden birine sahip olan bir değer tipi olursa, dizinin her elemanı bağımsız değişkenleri içerecektir. Q ve R tiplerinin tümü, bir bütün olarak dizi, Q tipindeki 100 bağımsız değişkeni ve R tipindeki 100 bağımsız değişkeni içerecektir; Bu değişkenlerden herhangi birine, başkalarını etkilemeden tek tek erişilebilir. Dizilerden başka hiçbir toplama türü yapı alanlarının bağımsız değişken olarak kullanılmasına izin veremez.

Bunun yerine T, Q ve R türünde ortak değişken alanlara sahip bir sınıf türü olduysa, dizinin her öğesi tek bir referansı, evrenin herhangi bir yerinde, bir örneğine Tve dizinin öğelerinin hiçbiri hiç alamazsa Herhangi bir dış referansın var olduğu bir nesneyi tanımlamak için değiştirildikten sonra, dizi etkin bir şekilde Q tipi 100 bağımsız değişkeni ve 100 tipi R bağımsız değişkeni içerecektir. Diğer toplama türleri böyle bir dizinin davranışını taklit edebilir, ancak tek amaç bu ise dizi, Q değişkeninin 100 değişkenini ve R tipindeki 100 değişkenini kapsüllemek içindir, her bir değişken çiftini kendi sınıf nesnesine kapsüllemek bunu yapmak için pahalı bir yoldur. Daha ileri,Bir dizi veya değişken sınıf tipinde bir koleksiyon kullanmak, dizi elemanları tarafından tanımlanan değişkenlerin bağımsız olmaması ihtimalini yaratır .

Bir türün bir tür nesne gibi davranması gerekiyorsa, o zaman sınıf türü veya değiştirme dışında hiçbir mutasyon yolu sağlamayan özel alan yapısı olmalıdır. Ancak bir tür bağımsız ilişkili ama-değişkenlerin bir demet gibi koli bandı ile birbirine yapışmış davranmaya gerekiyordu, o zaman bir türü kullanması gereken edilir açıktaki alan yapı - değişkenlerin bir demet koli bandı ile birbirine yapışmış . Bu türden diziler, çalışmak için çok verimli ve çok temiz bir semantikaya sahip. Başka bir türün kullanılması, karışık anlambilim, düşük performans veya her ikisine de yol açacaktır.


0

Önemli olan önemli bir tanesi hafıza dağılımıdır. Örneğin, bağlı bir listeyi gezinmek, çok fazla önbellek eksikliğine ve daha yavaş performansa yol açabilir; oysa bir dizi, belirli bir veri türünün birden fazla örneğini tutan bitişik bir bellek yığınını temsil eder ve sırayla CPU'yu vurmak için daha muhtemeldir. önbelleği.

Tabii ki, bir nesne referansları dizisi önbellek vuruşlarından o kadar fazla yararlanamayabilir, çünkü kayıttan çıkarma işlemi sizi bellekte herhangi bir yere götürebilir.

Sonra bir dizi kullanarak bir liste uygulayan ArrayList gibi liste uygulamaları vardır. Onlar sahip olması gereken ilkel.


2
Soru özellikle List<T>bağlantılı bir liste kullanılarak değil, bir dizi kullanarak (aslında ArrayList<T>Java ile eşdeğerdir ) .Net türünü sorar .
svick

-2

İşte ne zaman Arrayve ne zaman seçeceğiniz konusunda kullanabileceğiniz bazı rehberler List.

  • ArrayBir yöntemden dönerken kullanın .
  • ListDönüş değerini oluştururken değişken olarak kullanın (yöntemin içinde). Sonra .ToArray()yöntemden dönerken kullanın .

Genel olarak, Arraytüketiciyi, koleksiyona öğe eklemek niyetinde olmadığınız zamanlarda kullanın . ListTüketiciyi koleksiyona öğeler eklemek istediğinizde kullanın .

Arrayise "statik" koleksiyonları ile uğraşan içindir List"dinamik" koleksiyonları ile uğraşan içindir.


2
Önerdiğiniz kural keyfidir ve gereksiz kopyalamayı yapan verimsiz kodla sonuçlanabilir. En azından bunun için bir tür gerekçeye ihtiyacınız var.
Jules

@Jules Geliştirici deneyimini mikro optimizasyonlardan çok daha önemli buldum. Bu düzeyde hiçbir zaman performans sorunum yok.
Daniel Lidström

Bununla birlikte, geliştirici deneyiminin bu kural tarafından nasıl geliştirildiğini anlamıyorum. Kodunuzun hangi istemcilerinin geri döndürülen değerlerle yapmak istediklerini tahmin etmenizi gerektirir ve yanlış yaptığınızda kodunuzun kullanımını daha az uygun hale getirir ve yine de herhangi bir avantaj göremiyorum. Performans ikincil bir endişe olabilir, ama hiçbir şey kazanmayan bir kuralı takip etmek için onu feda etmem.
Jules,

@Jules o zaman kendi tercihine bağlı sanırım. Dönüş değerlerini sabit olarak değerlendirmeyi tercih ederim, Arraybunun yerine kullanmayı tercih ederim List. Yine de düşüncelerinizi duymak güzel!
Daniel Lidström

UmmodifiableLists kullanmayı düşündünüz mü?
Jules
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.