cari
  • Log masuk
  • Daftar
Penetapan semula kata laluan berjaya

Ikuti proiects vou berminat dengan andi aet terbaru mengenai mereka

Jadual Kandungan
Apa yang sebenarnya dilakukan oleh pembina utama dalam C# 12
Bagaimana untuk mengisytiharkan dan menggunakan parameter pembina utama
Rumah pembangunan bahagian belakang Tutorial C#.Net Bagaimana untuk menggunakan C# Primary Constructors dalam .NET 8?

Bagaimana untuk menggunakan C# Primary Constructors dalam .NET 8?

Jan 26, 2026 am 12:21 AM

Pembina utama dalam C# 12 mengisytiharkan parameter secara langsung pada jenis, menjadikannya dalam skop untuk permulaan dan logik ahli; mereka mensintesis pembina yang sepadan dengan senarai parameter, bukan tanpa parameter dan melumpuhkan jika mana-mana pembina eksplisit diisytiharkan.

Bagaimana untuk menggunakan C# Primary Constructors dalam .NET 8?

Apa yang sebenarnya dilakukan oleh pembina utama dalam C# 12

Pembina utama membenarkan anda mengisytiharkan parameter pembina terus pada kelas atau pengisytiharan struct, dan parameter tersebut menjadi *dalam skop* untuk keseluruhan jenis badan — bermakna anda boleh menggunakannya untuk memulakan medan, sifat atau menjalankan logik dalam definisi ahli. Mereka tidak menghasilkan kaedah pembina yang berasingan melainkan anda memerlukannya (cth, untuk lebihan atau atribut). Pengkompil mensintesis pembina tanpa parameter awam *hanya jika tiada pembina lain wujud* — tetapi dengan pembina utama, itu tidak berlaku: pembina yang disintesis sepadan dengan senarai parameter utama anda.

Bagaimana untuk mengisytiharkan dan menggunakan parameter pembina utama

Anda menulis senarai parameter sejurus selepas nama jenis, sebelum jenis asas atau antara muka. Parameter tersebut adalah baca sahaja dan skop kepada badan jenis — ia bukan medan sendiri, jadi anda mesti menetapkannya secara eksplisit jika anda ingin menyimpannya.

  • Gunakan this.fieldName = param dalam medan/pemula hartanah atau ahli contoh
  • Anda tidak boleh merujuk parameter utama dalam ahli statik atau pemula medan *di luar* konteks contoh
  • Jika anda mengisytiharkan sebarang pembina eksplisit, pembina utama dinyahdayakan — tiada sintesis berlaku
  • Pengubah suai parameter seperti ref , out , atau params tidak dibenarkan

Contoh:

 Orang kelas awam(rentetan firstName, string lastName)
{
    rentetan awam FullName => $"{firstName} {lastName}";
    rentetan baca sahaja peribadi _cachedName = $"{firstName.ToUpper()} {lastName.ToUpper()}";
}

Apabila pembina utama pecah dengan warisan atau atribut

Pembina utama tidak berfungsi dengan panggilan pembina kelas asas menggunakan : base(...) — kerana tiada pembina eksplisit untuk dirantai. Anda akan mendapat CS7036: There is no argument given that corresponds to the required parameter jika kelas asas anda tidak mempunyai pembina tanpa parameter.

  • Untuk mewarisi daripada kelas asas yang memerlukan args, elakkan pembina utama - gunakan pembina eksplisit sebaliknya
  • Atribut seperti [JsonConstructor] atau [ActivatorUtilitiesConstructor] tidak boleh digunakan pada pembina utama (tiada sokongan sintaks), jadi DI atau siri mungkin gagal secara senyap atau kembali ke refleksi
  • Rekod mendapat pembina utama secara automatik, tetapi kelas/struktur memerlukan ikut serta — dan anda kehilangan kawalan ke atas keterlihatan (ia sentiasa terbuka melainkan anda menambah pembina eksplisit)

Mengapa pembina utama private atau internal tidak boleh dilakukan

Spesifikasi bahasa tidak membenarkan pengubah suai akses pada pembina utama — ia sentiasa terbuka. Jika anda memerlukan pembinaan bukan awam, anda mesti mengisytiharkan pembina eksplisit dan menggugurkan yang utama.

Ini mengecewakan orang apabila cuba menguatkuasakan corak kilang atau menghalang instantiasi langsung. Sebagai contoh, ini tidak akan menyusun:

 Perkhidmatan kelas awam(rentetan apiKey) // ← sentiasa awam, tiada cara untuk menjadikannya dalaman
{
    private Service() { } // ← kini anda mempunyai dua pembina, dan primary dilumpuhkan
}

Sebaik sahaja anda menambah mana-mana pembina eksplisit, yang utama akan hilang — tiada sandaran, tiada amaran. Itulah senapang kaki yang paling biasa.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan C# Primary Constructors dalam .NET 8?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

Stock Market GPT

Stock Market GPT

Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

Alat popular

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk mengesahkan alamat e-mel dalam C#? (Corak regex) Bagaimana untuk mengesahkan alamat e-mel dalam C#? (Corak regex) Mar 08, 2026 am 12:06 AM

Adalah disyorkan untuk menggunakan biasa rasmi ringan Microsoft ^[a-zA-Z0-9._% -] @[a-zA-Z0-9.-] \.[a-zA-Z]{2,}$ untuk pengesahan format e-mel asas, meliputi 99% daripada input sebenar; cara yang lebih dipercayai ialah menggunakan pembina MailAddress dan hanya menangkap FormatException, sambil mengesahkan rentetan null/kosong terlebih dahulu.

Bagaimana untuk menggunakan refleksi untuk mendapatkan nilai harta dalam C#? (GetType) Bagaimana untuk menggunakan refleksi untuk mendapatkan nilai harta dalam C#? (GetType) Mar 06, 2026 am 12:15 AM

GetProperty harus digunakan bersama dengan GetValue untuk mendapatkan nilai harta dan bukannya hanya memanggil GetType; adalah perlu untuk memberi perhatian kepada butiran seperti keterlihatan harta, perhubungan warisan dan pengindeks, dan disyorkan untuk cache PropertyInfo untuk meningkatkan prestasi.

Bagaimana untuk menggunakan sifat dengan get set dalam C#? (Encapsulation) Bagaimana untuk menggunakan sifat dengan get set dalam C#? (Encapsulation) Mar 10, 2026 am 12:33 AM

get/set tidak hanya menambah kurungan, tetapi merangkum titik permulaan: medan eksplisit diperlukan, operasi yang memakan masa dielakkan, ArgumentException dilemparkan apabila pengesahan gagal, pengubah suai akses berbeza disokong, init terhad kepada senario permulaan dan atribut logik pada asasnya ialah kaedah. Perhatian khusus mesti diberikan kepada penyahpepijatan dan prestasi.

Bagaimana untuk memisahkan rentetan dengan pembatas dalam C#? (String.Split) Bagaimana untuk memisahkan rentetan dengan pembatas dalam C#? (String.Split) Mar 12, 2026 am 12:21 AM

Ya, String.Split mengembalikan rentetan kosong secara lalai, menyebabkan item kosong disebabkan oleh pembatas berterusan atau pertama dan terakhir; anda perlu menggunakan StringSplitOptions.RemoveEmptyEntries untuk menapis, atau menapis secara manual; char[] digunakan untuk pemisahan aksara tunggal, dan rentetan[] digunakan untuk pemisahan subrentetan; Span.Split boleh mengelakkan peruntukan; melepasi had atas nombor akan memotong keputusan.

Bagaimana untuk menulis ke fail teks dalam C#? (Contoh StreamWriter) Bagaimana untuk menulis ke fail teks dalam C#? (Contoh StreamWriter) Mar 05, 2026 am 12:14 AM

Anda mesti menggunakan menggunakan untuk memastikan bahawa StreamWriter dikeluarkan dengan betul. Laluan perlu dibina dengan Path.Combine dan direktori mesti dibuat terlebih dahulu. File.WriteAllText atau File.AppendAllText lebih disukai untuk memudahkan operasi.

Bagaimana untuk menggunakan jenis nullable dalam C#? (Jenis rujukan boleh batal) Bagaimana untuk menggunakan jenis nullable dalam C#? (Jenis rujukan boleh batal) Mar 06, 2026 am 12:14 AM

Selepas mendayakan nullable, rentetan bermaksud bukan nol (ralat akan dilaporkan jika null diberikan atau dereference tidak dikesan), string? secara eksplisit membenarkan null; fail lama perlu #nullableenable secara eksplisit untuk berkuat kuasa; API luaran lalai kepada kemungkinan null.

Bagaimana untuk menyertai rentetan dengan pemisah dalam C#? (String.Join) Bagaimana untuk menyertai rentetan dengan pemisah dalam C#? (String.Join) Mar 13, 2026 am 12:02 AM

String.Join direka khas untuk penyambungan rentetan. Ia selamat, cekap dan sangat mudah dibaca. Hanya masukkan pembatas dan tatasusunan rentetan, dan elemen nol akan dilangkau secara automatik. Tatasusunan kosong atau null akan mengembalikan rentetan kosong. Pemformatan eksplisit diperlukan untuk mengendalikan jenis bukan rentetan. Dalam senario sensitif prestasi, tatasusunan diluluskan dahulu dan bukannya IEnumerable. StringBuilder sesuai untuk logik yang kompleks.

Bagaimana untuk mengukur masa pelaksanaan dalam C#? (Kelas jam randik) Bagaimana untuk mengukur masa pelaksanaan dalam C#? (Kelas jam randik) Mar 16, 2026 am 12:13 AM

Jam randik.Start() perlu dipanggil untuk kejadian yang tidak dimulakan, jika tidak InvalidOperationException akan dilemparkan; StartNew() ialah kaedah statik yang boleh dibuat dan dimulakan dalam satu langkah, menjadikannya lebih selamat dan lebih biasa digunakan.

Artikel berkaitan