Di .NET, tipe nilai (C # struct
) tidak dapat memiliki konstruktor tanpa parameter. Menurut posting ini ini diamanatkan oleh spesifikasi CLI. Apa yang terjadi adalah bahwa untuk setiap tipe nilai konstruktor default dibuat (oleh kompiler?) Yang menginisialisasi semua anggota ke nol (atau null
).
Mengapa tidak diizinkan untuk mendefinisikan konstruktor default seperti itu?
Satu penggunaan sepele adalah untuk bilangan rasional:
public struct Rational {
private long numerator;
private long denominator;
public Rational(long num, long denom)
{ /* Todo: Find GCD etc. */ }
public Rational(long num)
{
numerator = num;
denominator = 1;
}
public Rational() // This is not allowed
{
numerator = 0;
denominator = 1;
}
}
Menggunakan versi C # saat ini, Rasional default adalah 0/0
yang tidak begitu keren.
PS : Akankah parameter default membantu menyelesaikan ini untuk C # 4.0 atau akankah konstruktor default yang ditentukan CLR dipanggil?
Jon Skeet menjawab:
Untuk menggunakan contoh Anda, apa yang Anda inginkan terjadi ketika seseorang melakukannya:
Rational[] fractions = new Rational[1000];
Haruskah itu berjalan melalui konstruktor Anda 1000 kali?
Tentu harus, itu sebabnya saya menulis konstruktor default di tempat pertama. CLR harus menggunakan konstruktor zeroing default ketika tidak ada konstruktor default eksplisit didefinisikan; dengan begitu Anda hanya membayar untuk apa yang Anda gunakan. Lalu jika saya ingin 1000 kontainer non-default Rational
(dan ingin mengoptimalkan 1000 konstruksi), saya akan menggunakan List<Rational>
bukan array.
Alasan ini, dalam pikiran saya, tidak cukup kuat untuk mencegah definisi konstruktor default.
Rational()
memanggil ctor parameterless daripada Rational(long num=0, long denom=1)
.
new Rational()
akan memanggil konstruktor jika ada, namun jika tidak ada, new Rational()
akan setara dengan default(Rational)
. Bagaimanapun Anda didorong untuk menggunakan sintaks default(Rational)
ketika Anda ingin "nilai nol" dari struct Anda (yang merupakan angka "buruk" dengan desain yang Anda usulkan Rational
). Nilai default untuk tipe nilai T
selalu default(T)
. Jadi new Rational[1000]
tidak akan pernah memanggil konstruktor struct.
denominator - 1
di dalam struct, sehingga nilai default menjadi 0/1
Then if I want a container of 1000 non-default Rationals (and want to optimize away the 1000 constructions) I will use a List<Rational> rather than an array.
Mengapa Anda mengharapkan array untuk memanggil konstruktor yang berbeda ke Daftar untuk struct?