Perlu interpretasi bagian dalam spesifikasi C #

11

Saya membaca spesifikasi C # . Saya dapat menggunakan klarifikasi pada segmen:

C # memiliki sistem tipe terpadu. Semua tipe C #, termasuk tipe primitif seperti int dan dobel, mewarisi dari tipe objek root tunggal. Dengan demikian, semua jenis berbagi satu set operasi umum, dan nilai-nilai dari jenis apa pun dapat disimpan, diangkut, dan dioperasikan secara konsisten. Lebih lanjut, C # mendukung kedua jenis referensi dan tipe nilai yang ditentukan pengguna, memungkinkan alokasi objek yang dinamis serta penyimpanan in-line dari struktur ringan.

Apa arti "penyimpanan in-line dari struktur ringan" dalam konteks ini?

ChuckT
sumber

Jawaban:

11

Jawaban Svick baik tetapi saya pikir saya akan menambahkan beberapa poin tambahan.

Pertama, paragraf cacat. Jenis pointer tidak mewarisi dari objek. Nilai yang pada waktu kompilasi dikenal sebagai tipe antarmuka atau tipe tipe parameter akan, pada saat runtime, bisa berupa referensi yang tidak valid atau contoh yang bonafide dari sesuatu yang mewarisi dari objek, tetapi selalu membuat saya aneh untuk mengatakan bahwa tipe ini " mewarisi "dari objek; warisan adalah properti yang anggota leluhur adalah anggota keturunan, tetapi Anda biasanya tidak menganggap "ToString" sebagai anggota IEnumerable. Anda menganggapnya sebagai anggota hal yang mengimplementasikan IEnumerable .

Paragraf ini juga cacat karena ini adalah satu-satunya tempat "tipe primitif" muncul dalam spesifikasi, dan muncul tanpa definisi. Karena itu keduanya tidak perlu dan membingungkan dan harus dihilangkan.

Saya ingin paragraf ini diperbaiki untuk sementara waktu. Lain kali aku melihat Mads, aku akan mengingatkannya.

Untuk menjawab pertanyaan spesifik Anda: svick tentu saja benar tetapi akan sangat membantu untuk melihat contoh spesifik. Ketika Anda mengatakan:

struct ColorfulInt
{
    int value;
    Color color;
    ...
}

dan Anda membuat, katakanlah, sebuah array:

ColorfulInt[] x = new ColorFulInt[100];

Kemudian penyimpanan untuk 100 int dan 100 Warna masuk dalam array itu sendiri . Jika ColorfulInt bukan kelas maka array akan berisi 100 referensi ke ColorfulInt, yang masing-masing harus dialokasikan secara individual. Secara individual mengalokasikan seratus elemen tersebut jauh lebih efisien baik dalam waktu maupun ruang daripada hanya mengalokasikan hak penyimpanan dalam array itu sendiri.

Eric Lippert
sumber
Jadi, apakah pentingnya dalam abstraksi memori dari objek-objek itu, di mana ketika Anda siap untuk memanipulasinya, mereka lebih mudah diakses jika mereka berada dalam satu blok yang berdekatan dari ayat-ayat ruang yang dapat dialamatkan petunjuk kepada siapa yang tahu di mana? Apakah itu benar, atau apakah saya masih melewatkan sesuatu?
ChuckT
@ ChuckT: Benar. Anda tidak membayar biaya tidak langsung, dan Anda juga mendapatkan lokasi cache yang bagus.
Eric Lippert
12

Ini berarti bahwa tipe nilai disimpan secara langsung di tempat Anda mendefinisikannya, yang membuatnya lebih efisien jika dibandingkan dengan tipe referensi.

Apa sebenarnya artinya itu? Jika Anda memiliki variabel lokal dari tipe nilai, biasanya akan disimpan langsung di stack (tetapi ada banyak pengecualian). Jika Anda memiliki bidang tipe nilai, itu akan disimpan langsung di kelas atau struktur terlampir.

svick
sumber
1
Itu masuk akal. Terima kasih telah menyempurnakan itu untukku, svick!
ChuckT