Penggunaan kata kunci "ini" dalam parameter formal untuk metode statis di C #

286

Saya telah menemukan beberapa contoh kode C # seperti berikut:

public static int Foo(this MyClass arg)

Saya belum dapat menemukan penjelasan tentang arti thiskata kunci dalam kasus ini. Ada wawasan?

kpozin
sumber
10
Selain jawaban yang diterima, untuk Metode Ekstensi C # seseorang harus memeriksa dokumentasi MSDN resmi .
gagak vulcan
4
Metode ekstensi memang nyaman, tetapi kita harus berhati-hati saat membuat / menggunakannya - metode itu bisa rusak! Kutipan dari Pedoman Umum dalam dokumentasi resmi MSDN : "Secara umum, kami sarankan Anda menerapkan metode ekstensi dengan hemat dan hanya ketika Anda harus ... Ketika menggunakan metode ekstensi untuk memperluas jenis yang kode sumbernya tidak dapat Anda ubah, Anda jalankan risiko bahwa perubahan dalam implementasi tipe akan menyebabkan metode ekstensi Anda rusak. "
Krishna Gupta
Apakah itu berarti ini akan mungkin? Karena itulah yang saya cari.
facepalm42

Jawaban:

274

Ini adalah metode ekstensi . Lihat di sini untuk penjelasan .

Metode ekstensi memungkinkan pengembang untuk menambahkan metode baru ke kontrak publik dari tipe CLR yang ada, tanpa harus mensubklasifikasikan atau mengkompilasi ulang tipe aslinya. Metode Penyuluhan membantu memadukan fleksibilitas dukungan "mengetik bebek" yang populer di dalam bahasa dinamis saat ini dengan kinerja dan validasi waktu kompilasi dari bahasa yang diketik dengan kuat.

Metode Ekstensi memungkinkan berbagai skenario yang berguna, dan membantu memungkinkan kerangka kerja kueri LINQ yang sangat kuat ....

itu berarti Anda dapat menelepon

MyClass myClass = new MyClass();
int i = myClass.Foo();

daripada

MyClass myClass = new MyClass();
int i = Foo(myClass);

Hal ini memungkinkan pembangunan antarmuka yang lancar seperti yang dinyatakan di bawah ini.

Praha Sangha
sumber
subklasifikasi sulit
Gerry
@Gerry - apa maksudmu?
Preet Sangha
9
Maaf, sedikit sarkasme - banyak sintaks akhir-akhir ini tampaknya menyelesaikan masalah yang bahkan tidak saya ketahui masalah. Keterbacaan harus menjadi prioritas yang sangat tinggi.
Gerry
2
Sejujurnya @Gerry, sepertinya Anda berada di Blub Paradox klasik . Banyak sintaks hari ini memecahkan masalah yang tidak Anda miliki karena Anda tidak tahu ada cara yang lebih baik, atau Anda tidak melakukan jenis tugas yang membuat sintaks ini hebat. Sebagian besar komentar tentang ' ini adalah solusi dalam mencari masalah ' sebenarnya adalah contoh dari ' Saya tidak tahu bagaimana fitur itu bekerja, jadi itu pasti tidak berguna '.
Myrddin Emrys
53

Posting blog yang dikutip oleh Scott Gu menjelaskannya dengan baik.

Bagi saya, jawaban atas pertanyaan tersebut adalah dalam pernyataan berikut di pos itu:

Perhatikan bagaimana metode statis di atas memiliki kata kunci "ini" sebelum argumen parameter pertama dari tipe string. Ini memberitahu kompiler bahwa Metode Ekstensi khusus ini harus ditambahkan ke objek tipe "string". Di dalam implementasi metode IsValidEmailAddress (), saya kemudian dapat mengakses semua properti / metode / peristiwa publik dari instance string aktual yang digunakan oleh metode tersebut, dan mengembalikan true / false tergantung pada apakah itu email yang valid atau tidak.

James Wiseman
sumber
9
Ini harus menjadi jawaban yang diterima. Ini satu-satunya jawaban yang benar-benar menjelaskan apa tujuan sebenarnya dari thiskata kunci dalam metode tanda tangan. Jawaban lain hanya mengatakan, "ini metode ekstensi." Saya tidak pernah sepenuhnya memahami bagaimana metode ekstensi "melampirkan" pada jenis yang mereka kembangkan sampai membaca jawaban ini. Terima kasih!
Lews Therin
13

Selain penjelasan Preha Sangha:
Intellisense menampilkan metode ekstensi dengan panah biru (misalnya di depan "Agregat <>"):

masukkan deskripsi gambar di sini

Anda membutuhkan

using the.namespace.of.the.static.class.with.the.extension.methods;

untuk metode ekstensi muncul dan tersedia, jika mereka berada dalam namespace yang berbeda dari kode yang menggunakannya.

Olivier Jacot-Descombes
sumber
4

Saya baru belajar ini sendiri beberapa hari yang lalu: kata kunci ini mendefinisikan bahwa metode telah menjadi perpanjangan dari kelas yang menghasilkannya. Jadi untuk contoh Anda, MyClass akan memiliki metode ekstensi baru yang disebut Foo (yang tidak menerima parameter apa pun dan mengembalikan int; dapat digunakan seperti metode publik lainnya).

jpoh
sumber
1

"Ini" memperluas kelas berikutnya dalam daftar parameter

Jadi dalam metode tanda tangan di bawah "this" extends "String". Baris dilewatkan ke fungsi sebagai argumen normal ke metode. public static string [] SplitCsvLine (baris string ini)

Dalam contoh di atas, kelas "this" memperluas kelas "String" bawaan.

dcarl661
sumber