Bir sinif yerinə bir quruluş istifadə edilməli?

MSDN, açıq obyektlərə ehtiyac duyduğunuz zaman strukturlardan istifadə etməyiniz lazım olduğunu söyləyir. Strukturun üstündəki strukturu üstünlük təşkil edən digər ssenarilər varmı?

Düzenle:
Bəziləri unutmuşdular:
1. Quruluşlarda metodlar ola bilər!
2. Quruluşların miras imkanları yoxdur.

Digər Edit:
Mən texniki fərqləri başa düşürəm, quruluşu istifadə edərkən sadəcə yaxşı bir münasibətim yoxdur.

263
17 сент. Esteban Araya tərəfindən təyin olunan 17 sentyabr. 2008-09-17 20:20 '08 at 20:20 pm 2008-09-17 20:20
@ 14 cavab

MSDN cavabına var: Derslər və quruluşlar arasında seçim.

Əsasən, bu səhifə sizə 4 maddənin bir siyahısı verir və tipiniz bütün meyarlara cavab vermirsə, sinfi istifadə etmək üçün deyir.

Türün aşağıdakı xüsusiyyətlərə malik olması halında bir quruluş müəyyən etməyin:

  • Bu mantıksız bir nümunəni ibtidai növlərə (tamsayı, ikiqat və s.) Bənzəyir.
  • Bir nümunə ölçüsü 16 baytdan azdır.
  • Bu dəyişməzdir.
  • Tez-tez qutuya daxil edilməsinə ehtiyac yoxdur.
275
17 сент. OwenP tərəfindən verilmiş cavab 17 sentyabr. 2008-09-17 20:34 '08 at 8:34 pm 2008-09-17 20:34

Mən ən önəmli aspekt hesab edən əvvəlki cavablardan heç birini oxumadığımdan təəccübləndim:

Bir id olmadan bir növü lazım olduqda mən structs istifadə. Məsələn, üç ölçülü nöqtə:

border=0
 public struct ThreeDimensionalPoint { public readonly int X, Y, Z; public ThreeDimensionalPoint(int x, int y, int z) { this.X = x; this.Y = y; this.Z = z; } public override string ToString() { return "(X=" + this.X + ", Y=" + this.Y + ", Z=" + this.Z + ")"; } public override int GetHashCode() { return (this.X + 2) ^ (this.Y + 2) ^ (this.Z + 2); } public override bool Equals(object obj) { if (!(obj is ThreeDimensionalPoint)) return false; ThreeDimensionalPoint other = (ThreeDimensionalPoint)obj; return this == other; } public static bool operator ==(ThreeDimensionalPoint p1, ThreeDimensionalPoint p2) { return p1.X == p2.X  p1.Y == p2.Y  p1.Z == p2.Z; } public static bool operator !=(ThreeDimensionalPoint p1, ThreeDimensionalPoint p2) { return !(p1 == p2); } } 

Bu strukturun iki nümunəsi varsa, onlar bir və ya iki yaddaşdan ibarət olan bir məlumatdır. Yalnız saxladığınız dəyərlərə diqqət yetirirsiniz.

49
22 янв. Cavab Andrei Rîne tərəfindən 22 Yanvar verildi 2009-01-22 22:08 '09 at 10:08 pm 2009-01-22 22:08

Bill Vaqnerin "Effektiv C #" adlı kitabında bu barədə bir fəsli vardır ( http://www.amazon.com/Effective-Specific-Ways-Develop -Your / dr / 0321245660 ). O, aşağıdakı prinsipdən istifadə edir:

  • Məlumat növünün saxlanılmasının əsas məsuliyyəti varmı?
  • Onun ictimai interfeysi məlumatın elementlərini təmin edən və ya dəyişən xüsusiyyətləri tam olaraq müəyyən edirmi?
  • Sizin tipinizin alt sinifləri olmayacağına əminsinizmi?
  • Tipiniz polimorfik olaraq işlənməyəcəkdir.

Bütün 4 sualına bəli cavab verərsən: struct istifadə edin. Əks halda sinfi istifadə edin.

25
14 июня '11 в 15:50 2011-06-14 15:50 Cavab Bart Gijssens tərəfindən 14 İyun 'da 15:50' də verildi 2011-06-14 15:50

Bir istinad növü yerinə dəyər növü semantikasına ehtiyacınız varsa strukturdan istifadə edin. Quruluşlar dəyərlə kopyalanır, buna görə diqqətli olun!

Məsələn, əvvəlki suallara da baxın

.NET-də quruluş və sinif arasındakı fərq nədir?

14
17 сент. Simon Steele tərəfindən verilmiş cavab 17 sentyabr. 2008-09-17 20:22 '08 saat 20:22 'da 2008-09-17 20:22

Mən aşağıdakıları istifadə edərdim:

  • obyektin yalnız oxumaq lazımdır (hər bir köçürdüyünüz və nüsxə verən bir struktur təyin edəcəyi). Yalnız oxunan obyektlər çox işıqlı emal üçün çox yaxşıdır, çünki əksər hallarda kilidləmə tələb etmir.

  • obyekt kiçik və qısa müddətli. Bu halda, obyektin idarə olunan bir xovluğa qoyulmasından çox daha səmərəli olan yığın üzərində yerləşdirilməsi yaxşı bir şans var. Bundan başqa, obyektin ayırdığı yaddaş öz həcmindən kənara çıxmazdan sonra azad ediləcək. Başqa sözlə, Kollektor çöp və yaddaş üçün daha az səmərəli iş daha səmərəli istifadə olunur.

8
17 сент. Cavab Pawel Pabich 17 sep tərəfindən verilir . 2008-09-17 20:33 '08 at 8:33 pm 2008-09-17 20:33

Cisim dəyişməzdirsə, bir quruluş və ya sinifdən istifadə olunma məsələsi, ümumiyyətlə, semantik deyil, nəticədir. 32/64 bitlik bir sistemdə, sinif referansları, sinifdəki məlumatların məbləğindən asılı olmayaraq 4/8 bayt saxlama tələb edir; sinif referansının kopyalanması 4/8 baytdan surəti tələb edir. Digər tərəfdən, sinifin hər bir fərdi forması özündə saxlanılan məlumatlara əlavə olaraq 8/16 baytlıq xidmət məlumatı və ona istinad edilən xərcləri ehtiva edir. Dörd 32 bit tamsayılardan ibarət hər biri 500 obyektin bir sıra lazım olduğunu varsayalım. Nesne bir quruluş növüdürsə, array bütün 500 obyektlərin bir-birindən fərqli olub-olmamasından asılı olmayaraq 8000 bayt tələb edəcəkdir. Nesne bir sinif növüdürsə, 500 istinad bir sıra 4000 bayt tutacaq. Bu əlaqələr fərqli obyektlərə işarə edirsə, obyektlərin struktur tipini iki dəfə saxlaya bilməsi üçün əlavə olaraq 24 bayt (bütün 500 üçün 12000 bayt), ümumi 16.000 bayt tələb olunur. Digər tərəfdən, obyektin bir nüsxəsi koddan yaradılıb, sonra bütün 500 array yuvasına keçid kopyalanır, ümumi dəyəri bu misal üçün 24 bayt və ardıcıl üçün 4000 olacaq - yalnız 424 bayt. Böyük qənaət. Çox vəziyyətlər sonuncu kimi işləyəcək, lakin bəzi hallarda bu mübadilənin faydalı olmasını təmin etmək üçün kifayət qədər sayıda array yuvasına bəzi istinadlar çıxarmaq mümkün ola bilər.

Təşkilatın dəyişdirilməsi tələb olunarsa, bir növ və ya strukturdan istifadə olunma məsələsi bir neçə cəhətdən daha sadədir. Bir "şey" ya x deyilən bir tam ədəd olan bir quruluş və ya bir sinifdir və aşağıdakı kodu edir:

   T1, t2;   ...   t2 = t1;   t2.x = 5;

T1.x-ə təsir etmək üçün son bəyanat lazımdırmı?

Thing bir sinif növü varsa, t1 və t2 bərabər olacaq, yəni t1.x və t2.x də bərabər olacaq. Beləliklə, ikinci bəyanat t1.x. Thing strukturlaşdırılmış bir növü olsa, t1 və t2 fərqli hallarda olacaq, yəni t1.x və t2.x fərqli tamsayılara istinad edir. Beləliklə, ikinci bəyanat t1.x.

Ağıllı strukturlar və dəyişkən siniflər əsasən fərqli davranış formalarına malikdir, baxmayaraq ki .net struktur mutasiyaların işlənməsində bəzi xüsusiyyətlərə malikdir. Əgər dəyər növü davranışı tələb olunursa (bu "t2 = t1" məlumatları t1-dən t2-ə təyişdirir, t1 və t2-nin ayrı-ayrı nümunələri kimi çıxarılmasını nəzərdə tutur) və dəyər növlərinin .net əməliyyatında quirks ilə yaşaya bilsəniz, strukturlardan istifadə edin. Siz dəyərin semantiklərini istəyirsinizsə, lakin .net quirks bir tətbiqdə tipin dəyərinin semantikasını pozacaqsa, sinfi istifadə edin və oxuyun.

4
18 нояб. cavab supercat 18 noyabr verilir . 2011-11-18 22:26 '11 saat 10:26 'da 2011-11-18 22:26

Metod çağırışından məlumatların ötürülməsi üçün bir neçə dəyərləri qruplaşdırmaq istədiyimdə həmişə bir quruluş istifadə etdim, amma bu dəyərləri oxuduqdan sonra bir şey istifadə etməyim lazım deyil. Təmiz olmağın bir yolu olaraq. Mən strukturdakı şeyləri "emissiya" və sinifdə olan şeylər daha faydalı və "funksional"

4
17 сент. Cavab Ryan Skarin tərəfindən verilir . 2008-09-17 21:57 '08 at 21:57 pm 2008-09-17 21:57

If sınıftan istifadə edin:

  • Kimlik əhəmiyyətlidir. Strukturlar bir üsula dəyərlə qəbul edildikdə örtük şəkildə kopyalanır.
  • Böyük bir yaddaş tutacaq.
  • Onun sahələrinə ilk başlanğıc lazımdır.
  • Baza sinifini devralmaq lazımdır.
  • Polimorfik davranışa ehtiyacınız var;

Quruluşu istifadə edin:

  • Bu, ibtidai tip (int, uzun, byte, və s.) Kimi çıxış edəcəkdir.
  • Kiçik bir yaddaş olmalıdır.
  • Sizə strukturun dəyərlə ötürülməsini tələb edən P / Invoke metodu zəng edirsiniz.
  • Zibil toplama təsirinin tətbiq performansına təsirini azaltmaq lazımdır.
  • Onun sahələri yalnız default olaraq başlanmalıdır. Bu dəyər ədədi növlər üçün sıfır, Boolean tipləri üçün yanlış və istinad növləri üçün sıfır olacaq.
    • Qeyd edək ki, C # 6-da strukturlar təhlükəsizlik sahələri üçün struktur sahəsini işə salmaq üçün istifadə edilə bilən bir quruluş qurucusu ola bilər.
  • Baza sinifini devralmaya ehtiyac yoxdur (ValueType istisna olmaqla, bütün miras edilmiş strukturlardan).
  • Polimorfik davranışa ehtiyacınız yoxdur.
4
16 дек. Cavab 16 Yanvar, Yaşwanth Chowdary Kata tərəfindən verilir. 2015-12-16 08:21 '15 at 8:21 AM 2015-12-16 08:21

həqiqətən davranışa ehtiyacınız olmadığı halda, sadə bir sıra və ya lüğətdən daha çox struktura ehtiyacınız var.

Təqib Mən ümumi ümumdünya strukturları haqqında düşünürəm. Bilirəm ki, onlar üsulları ola bilər, amma bu ümumi zehni fərqini saxlamaq istərdim.

2
17 сент. Cavab Jim Deville tərəfindən 17 sentyabrda verilir. 2008-09-17 20:22 '08 saat 20:22 'da 2008-09-17 20:22

Bundan əlavə, üstün cavablar:

Quruluşlar dəyərlərdir.

Heç bir şeyə heç bir şey qoyulmur .

Quruluşu qurmaq = Heç bir şey, bütün dəyərləri onların standart dəyərlərinə təyin edir.

2
28 авг. Cavab verilir geo1701 28 aug. 2013-08-28 10:58 '13 at 10:58 2013-08-28 10:58

@Simon dediyi kimi, strukturlar "dəyər-tipli" semantik təmin edir, belə ki, bu davranışa əlaqədar məlumat növü ilə ehtiyac varsa struct istifadə edin. Yapıların surəti ilə qəbul edildiyi üçün, onlar kiçik olduğundan əmin olmaq istəyirəm, təxminən 16 bayt.

2
17 сент. Cavab Scott Dorman tərəfindən 17 sentyabrda verilir. 2008-09-17 20:23 '08 at 8:23 pm 2008-09-17 20:23

Strukturlar yığın üzərində deyil, yığın deyil, beləliklə, iplik təhlükəsizdir və ötürülmə obyekti şablonunu tətbiq edərkən istifadə olunmalıdır, istənməyən yığındakı obyektlərin istifadəsini heç vaxt istəməyəcəksiniz, bu halda Stack çağırışını istifadə etmək istəsəniz, bu bir quruluşdan istifadə etmək üçün əsas bir nümunədir . Burada həftə sonu bütün cavabları təəccübləndirirəm,

1
18 авг. cavab Jack 18 aug verilir . 2014-08-18 20:33 '14 saat 20:33 2014-08-18 20:33

Hmm ...

Mən zibil toplusunu structs vs sinfləri istifadə edərək / qarşı bir arqument kimi istifadə etməyəcəyəm. İdarə edilmiş yığın bir yığın kimi işləyir - bir obyekt yaratmaq sadəcə yığın üstündə yerləşdirilməsi kimi sürətli yığımın üstünə qoyur. Bundan əlavə, obyektin qısa müddətli olması və GC dövründən sağ qalmadığı halda, GC yalnız mövcud yaddaş ilə işləyəndən sonra sərbəst buraxılır. (MSDN'de axtarın, bir sıra .NET yaddaş idarəetmə məqaləsi var, mən də qazmaq üçün çox tənbəl oldum).

Çox hallarda mən quruluşu istifadə edirəm, bunu etmək üçün özümü məcbur etdim, çünki daha sonra mənə istinad semantikası bir şeyləri bir az daha asanlaşdıracağını tapdım.

Hər halda, yuxarıda dərc olunan MSDN məqaləsində bu dörd nöqtə yaxşı bir təlimatdır.

1
17 сент. cavab KG 17 sep verilir . 2008-09-17 22:06 '08 at 10:06 pm 2008-09-17 22:06

İnanıram ki, ən yaxşı cavab, bir əmlak dəsti, bir sinif, əmlak dəsti və davranış olduğunda, sadəcə strukturdan istifadə etməkdir.

-1
05 марта '17 в 19:51 2017-03-05 19:51 Cavab Lucian Gabriel Popescu tərəfindən 05 Mart 'da 19:51 2017-03-05 19:51 tərəfindən verilir

bağlı digər suallar tags və ya bir sual