Saya coba lakukan hal berikut:
GetString(
inputString,
ref Client.WorkPhone)
private void GetString(string inValue, ref string outValue)
{
if (!string.IsNullOrEmpty(inValue))
{
outValue = inValue;
}
}
Ini memberi saya kesalahan kompilasi. Saya pikir cukup jelas apa yang saya coba capai. Pada dasarnya saya ingin GetString
menyalin isi string input ke WorkPhone
properti Client
.
Apakah mungkin untuk melewati properti dengan referensi?
c#
properties
pass-by-reference
yogibear
sumber
sumber
Jawaban:
Properti tidak dapat dilewati dengan referensi. Berikut adalah beberapa cara untuk mengatasi keterbatasan ini.
1. Nilai Pengembalian
2. Mendelegasikan
3. Ekspresi LINQ
4. Refleksi
sumber
code
string public static GetValueOrDefault (string ini s, string isNullString) {if (s == null) {s = isNullString; } return s; } membatalkan Main () {person.MobilePhone.GetValueOrDefault (person.WorkPhone); }getOutput
tidak perlu.GetString
yang seharusnya mengatur properti jelas salah nama.tanpa menduplikasi properti
sumber
GetString
menjadiNullSafeSet
, karena yang pertama tidak masuk akal di sini.Saya menulis pembungkus menggunakan varian ExpressionTree dan c # 7 (jika seseorang tertarik):
Dan gunakan seperti:
sumber
Jika Anda ingin mendapatkan dan mengatur properti keduanya, Anda dapat menggunakan ini di C # 7:
sumber
Trik lain yang belum disebutkan adalah memiliki kelas yang mengimplementasikan properti (misalnya
Foo
tipeBar
) juga mendefinisikan delegasidelegate void ActByRef<T1,T2>(ref T1 p1, ref T2 p2);
dan mengimplementasikan metodeActOnFoo<TX1>(ref Bar it, ActByRef<Bar,TX1> proc, ref TX1 extraParam1)
(dan mungkin versi untuk dua dan tiga "parameter tambahan" juga) yang akan melewati representasi internalFoo
untuk prosedur yang disediakan sebagairef
parameter. Ini memiliki beberapa keuntungan besar dibandingkan metode lain untuk bekerja dengan properti:Melewati segala sesuatu
ref
adalah pola yang sangat baik; Sayang sekali itu tidak digunakan lagi.sumber
Hanya sedikit ekspansi ke solusi Ekspresi Linq Nathan . Gunakan param multi generik sehingga properti tidak terbatas pada string.
sumber
Ini tercakup dalam bagian 7.4.1 dari spesifikasi bahasa C #. Hanya referensi-variabel yang dapat diberikan sebagai parameter ref atau out dalam daftar argumen. Properti tidak memenuhi syarat sebagai referensi variabel dan karenanya tidak dapat digunakan.
sumber
Ini tidak mungkin. Anda bisa mengatakan
di mana properti yang
WorkPhone
dapat ditulisistring
dan definisiGetString
diubah menjadiIni akan memiliki semantik yang sama seperti yang Anda coba.
Ini tidak mungkin karena properti benar-benar sepasang metode yang menyamar. Setiap properti menyediakan getter dan setter yang dapat diakses melalui sintaksis mirip bidang. Ketika Anda mencoba menelepon
GetString
seperti yang Anda usulkan, apa yang Anda sampaikan adalah nilai dan bukan variabel. Nilai yang Anda lewati adalah yang dikembalikan dari pengambilget_WorkPhone
.sumber
Apa yang bisa Anda coba lakukan adalah membuat objek untuk menyimpan nilai properti. Dengan begitu Anda bisa melewati objek dan masih memiliki akses ke properti di dalamnya.
sumber
Properti tidak bisa diteruskan dengan referensi? Jadikan sebagai bidang, lalu gunakan properti untuk merujuknya secara publik:
sumber
Anda tidak dapat
ref
memiliki properti, tetapi jika fungsi Anda membutuhkan keduanyaget
danset
akses, Anda dapat membagikan turunan kelas dengan properti yang ditentukan:Contoh:
sumber
Jawaban yang diterima baik jika fungsi itu ada dalam kode Anda dan Anda dapat memodifikasinya. Tetapi kadang-kadang Anda harus menggunakan objek dan fungsi dari beberapa perpustakaan eksternal dan Anda tidak dapat mengubah definisi properti dan fungsi. Kemudian Anda bisa menggunakan variabel sementara.
sumber
Untuk memberi suara pada masalah ini, berikut adalah satu saran aktif tentang bagaimana ini dapat ditambahkan ke bahasa. Saya tidak mengatakan ini adalah cara terbaik untuk melakukan ini (sama sekali), jangan ragu untuk mengeluarkan saran Anda sendiri. Tetapi membiarkan properti untuk diteruskan oleh ref seperti Visual Basic sudah dapat lakukan akan sangat membantu menyederhanakan beberapa kode, dan cukup sering!
https://github.com/dotnet/csharplang/issues/1235
sumber