Penyelesaian Kaedah Sambungan
Fahami cara pengompil mencari sambungan.
Penyelesaian Kaedah Sambungan ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Akademi C#, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.
Cara Pengompil Mencari Sambungan
Apabila anda menulis value.Method() dan tiada kaedah instans yang sepadan, pengompil akan mencari kaedah sambungan. Namun, pengompil hanya mempertimbangkan sambungan yang ruang namanya berada dalam ruang lingkup melalui arahan using.
Arahan Import Menjadikan Sambungan Berada dalam Ruang Lingkup
Sambungan hanya kelihatan jika anda mengimport ruang namanya. Tanpa using yang betul, kaedah itu kelihatan seolah-olah tidak wujud walaupun telah dikompil ke dalam himpunan.
using System;
using MyHelpers; // brings StringExtensions into scope
namespace MyHelpers
{
public static class StringExtensions
{
public static string Reverse(this string s)
{
var arr = s.ToCharArray();
Array.Reverse(arr);
return new string(arr);
}
}
}
public class Program
{
public static void Main()
{
Console.WriteLine("hello".Reverse());
}
}Kaedah Instans Diperiksa Dahulu
Pengompil menyelesaikan panggilan secara berperingkat: pertama, ia mencari kaedah instans yang sepadan, termasuk kaedah yang diwarisi. Hanya jika tiada kaedah yang sesuai barulah ia mencari kaedah sambungan.
using System;
using System.Collections.Generic;
public static class ListExt
{
// Ignored: List<int> already has Add(int)
public static void Add(this List<int> list, int a, int b)
=> list.Add(a + b);
}
public class Program
{
public static void Main()
{
var list = new List<int>();
list.Add(5); // the built-in instance Add wins for this signature
Console.WriteLine(list[0]);
}
}Ruang Nama yang Lebih Dekat Diutamakan
Jika dua sambungan sepadan, sambungan yang ruang namanya lebih dekat dalam hierarki bersarang akan dipilih. Kekaburan yang tidak dapat diselesaikan oleh pengompil menyebabkan ralat kompilasi dan memaksa anda menjelaskan pilihan.
using System;
namespace Outer
{
public static class A { public static string Tag(this int n) => "A" + n; }
namespace Inner
{
public static class B { public static string Tag(this int n) => "B" + n; }
public class Program
{
public static void Main()
{
// B is in the nearer (Inner) namespace, so it is preferred
Console.WriteLine(7.Tag());
}
}
}
}Menghapuskan Kekaburan dengan Panggilan Statik
Apabila sambungan bertindih atau anda mahu menyatakan pilihan dengan jelas, panggil kaedah statik secara langsung menggunakan nama kelas penuhnya. Cara ini memintas proses penyelesaian sambungan sepenuhnya.
using System;
public static class FormatExt
{
public static string Bracket(this string s) => "[" + s + "]";
}
public class Program
{
public static void Main()
{
// Explicit static call, no ambiguity possible
Console.WriteLine(FormatExt.Bracket("x"));
}
}Penyelesaian Lebihan Beban antara Sambungan
Jika beberapa kaedah sambungan berkongsi nama, penyelesaian lebihan beban biasa akan memilih padanan terbaik berdasarkan jenis parameter, sama seperti lebihan beban kaedah biasa.
using System;
public static class PrintExt
{
public static string Describe(this int n) => "int:" + n;
public static string Describe(this string s) => "str:" + s;
}
public class Program
{
public static void Main()
{
Console.WriteLine(42.Describe());
Console.WriteLine("hi".Describe());
}
}Inferens Generik Semasa Penyelesaian
Bagi sambungan generik, pengompil membuat inferens terhadap argumen jenis daripada penerima dan argumen. Jika inferens gagal, sambungan itu tidak akan dipertimbangkan.
using System;
using System.Collections.Generic;
public static class SeqExt
{
public static T FirstItem<T>(this IEnumerable<T> source)
{
foreach (var item in source) return item;
throw new InvalidOperationException("empty");
}
}
public class Program
{
public static void Main()
{
var nums = new List<int> { 5, 6, 7 };
// T inferred as int from the List<int> receiver
Console.WriteLine(nums.FirstItem());
}
}Import Global dan Import Tersirat
C# moden boleh mengisytiharkan arahan global using supaya sesuatu ruang nama berada dalam ruang lingkup di seluruh projek. Ini menjadikan pustaka sambungan yang dikongsi tersedia di mana-mana tanpa mengulangi import.
using System;
// In a real project a separate file might say: global using MyHelpers;
namespace MyHelpers
{
public static class IntExt { public static int Twice(this int n) => n * 2; }
}
public class Program
{
public static void Main()
{
// Works here because MyHelpers is referenced explicitly
Console.WriteLine(MyHelpers.IntExt.Twice(8));
}
}Apabila Jenis Penerima Penting
Penyelesaian bergantung pada jenis statik penerima, bukan jenis masa jalannya. Sambungan yang diisytiharkan untuk jenis asas tetap digunakan walaupun pemboleh ubah itu menyimpan instans terbitan, kecuali sambungan yang lebih khusus berada dalam ruang lingkup.
using System;
public class Animal { }
public class Cat : Animal { }
public static class AnimalExt
{
public static string Kind(this Animal a) => "animal";
}
public class Program
{
public static void Main()
{
Animal a = new Cat();
// Chosen by static type Animal
Console.WriteLine(a.Kind());
}
}Model Mental untuk Penyelesaian
Anggap susunannya begini: (1) kaedah instans, kemudian (2) kaedah sambungan daripada ruang nama yang diimport, bermula dengan yang paling dekat, kemudian (3) penyelesaian lebihan beban antara calon yang ada. Mengetahui susunan ini menerangkan hampir semua hasil yang mengejutkan.
using System;
public static class Ext
{
public static string Wrap(this string s) => "<" + s + ">";
}
public class Program
{
public static void Main()
{
// No instance Wrap exists, so the extension is used
Console.WriteLine("node".Wrap());
}
}Cuba Sendiri
Tentukan satu sambungan dalam ruang nama, importnya dan panggil sambungan itu. Kemudian panggil kaedah yang sama secara jelas sebagai kaedah statik untuk melihat bahawa kedua-dua cara berfungsi.
using System;
using Text.Helpers;
namespace Text.Helpers
{
public static class StringExtensions
{
public static int Vowels(this string s)
{
int count = 0;
foreach (var c in s.ToLower())
if ("aeiou".IndexOf(c) >= 0) count++;
return count;
}
}
}
public class Program
{
public static void Main()
{
Console.WriteLine("education".Vowels());
Console.WriteLine(Text.Helpers.StringExtensions.Vowels("education"));
}
}Semakan Ringkas
Pertimbangkan perkara yang menjadikan kaedah sambungan kelihatan.
Ringkasan
Penyelesaian kaedah sambungan mengikut susunan yang jelas.
- Kaedah instans dicuba dahulu; sambungan hanya melengkapkan kekurangan.
- Sambungan hanya kelihatan jika ruang namanya berada dalam ruang lingkup melalui
usingatauglobal using. - Ruang nama yang lebih dekat diutamakan; seri yang tidak dapat diselesaikan menyebabkan ralat kompilasi.
- Anda sentiasa boleh memanggil kaedah statik secara jelas untuk menghapuskan kekaburan.
- Penyelesaian menggunakan jenis statik penerima.
Pelajari C# dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 93
- Pelajaran
- 346
Soalan Lazim
Adakah pelajaran “Penyelesaian Kaedah Sambungan” percuma?
Ya — teks penuh “Penyelesaian Kaedah Sambungan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Akademi C#, tingkat taraf kepada CoddyKit PRO. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Penyelesaian Kaedah Sambungan”?
Fahami cara pengompil mencari sambungan. Anda berlatih Akademi C# menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Akademi C#?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Akademi C# di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Penyelesaian Kaedah Sambungan” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Akademi C# ini?
Ya. Setiap pelajaran Akademi C# menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mentakrifkan Kaedah Sambungan
- Melanjutkan Antara Muka dan Generik
- Penyelesaian Kaedah Sambungan
- Mereka Bentuk Sambungan yang Baik