Saya mencoba menggunakan metode ekstensi untuk menambahkan kelebihan operater ke kelas C # StringBuilder
. Khususnya, mengingat StringBuilder
sb
, saya ingin sb += "text"
menjadi setara sb.Append("text")
.
Berikut sintaks untuk membuat metode ekstensi untuk StringBuilder
:
public static class sbExtensions
{
public static StringBuilder blah(this StringBuilder sb)
{
return sb;
}
}
Berhasil menambahkan blah
metode ekstensi ke StringBuilder
.
Sayangnya, overloading operator tampaknya tidak berfungsi:
public static class sbExtensions
{
public static StringBuilder operator +(this StringBuilder sb, string s)
{
return sb.Append(s);
}
}
Di antara masalah lain, kata kunci this
tidak diperbolehkan dalam konteks ini.
Apakah menambah kelebihan operator melalui metode ekstensi dimungkinkan? Jika demikian, apa cara yang tepat untuk melakukannya?
c#
extension-methods
operator-overloading
Jude Allred
sumber
sumber
Jawaban:
Saat ini tidak memungkinkan, karena metode ekstensi harus dalam kelas statis, dan kelas statis tidak dapat memiliki kelebihan operator.
Mads Torgersen, C # Language PM mengatakan:
Edit:
Saya baru saja memperhatikan, Mads menulis lebih banyak di artikel yang sama :
Fitur ini saat ini di atas meja (berpotensi) untuk C # 8.0. Mads berbicara lebih banyak tentang penerapannya di sini .
sumber
String
ke PowerShellScriptBlock
.true.Xor(false)
itu^
adalah operator utama untuk C #Jika Anda mengontrol tempat-tempat di mana Anda ingin menggunakan "operator ekstensi" ini (yang biasanya Anda lakukan dengan metode ekstensi), Anda dapat melakukan sesuatu seperti ini:
The
StringBuilderWrapper
kelas menyatakan sebuah operator konversi implisit dariStringBuilder
dan menyatakan yang diinginkan+
operator. Dengan cara ini, aStringBuilder
dapat diteruskan keReceiveImportantMessage
, yang akan secara diam-diam dikonversi menjadi aStringBuilderWrapper
, di mana+
operator dapat digunakan.Untuk membuat fakta ini lebih transparan bagi penelepon, Anda dapat mendeklarasikan
ReceiveImportantMessage
sebagai mengambilStringBuilder
dan hanya menggunakan kode seperti ini:Atau, untuk menggunakannya sebaris di mana Anda sudah menggunakan
StringBuilder
, Anda bisa melakukan ini:Saya membuat posting tentang menggunakan pendekatan yang sama untuk membuat
IComparable
lebih mudah dimengerti.sumber
StringBuilderWrapper
yang memungkinkan.StringBuilder
tipe itu dan menyediakan operator konversi implisit darinya. Setelah itu, dapat digunakan dengan string literal, seperti yang ditunjukkan dalam contoh:sb += "Hello World!";
String
:PushIndent(" ".X(4))
(bisa juga dipanggilTimes
). Atau mungkin menggunakan konstruktor ini:PushIndent(new String(' ', 4))
.Tampaknya saat ini tidak memungkinkan - ada masalah umpan balik terbuka yang meminta fitur ini di Microsoft Connect:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=168224
menyarankan itu mungkin muncul dalam rilis mendatang tetapi tidak diimplementasikan untuk versi saat ini.
sumber
Meskipun tidak mungkin melakukan operator, Anda selalu bisa membuat metode Tambah (atau Peduli), Kurangi, dan Bandingkan ....
sumber
Hah! Saya mencari "extension operator overloading" dengan keinginan yang persis sama, untuk sb + = (hal).
Setelah membaca jawaban di sini (dan melihat bahwa jawabannya adalah "tidak"), untuk kebutuhan khusus saya, saya pergi dengan metode ekstensi yang menggabungkan sb.AppendLine dan sb.AppendFormat, dan terlihat lebih rapi daripada keduanya.
Sehingga,
Bukan jawaban umum, tetapi mungkin menarik bagi para pencari masa depan melihat hal semacam ini.
sumber
AppendLine
bukanLine
.Mungkin untuk rigg dengan bungkus dan ekstensi tetapi tidak mungkin melakukannya dengan benar. Anda berakhir dengan sampah yang benar-benar mengalahkan tujuannya. Saya punya posting di suatu tempat di sini yang melakukannya, tetapi itu tidak berharga.
Btw Semua konversi numerik membuat sampah di pembuat string yang perlu diperbaiki. Saya harus menulis pembungkus untuk apa yang berfungsi dan saya menggunakannya. Itu layak dibaca.
sumber