Saya membaca versi C ++ dari pertanyaan ini tetapi tidak terlalu memahaminya.
Bisakah seseorang tolong jelaskan jika itu bisa dilakukan dan bagaimana caranya?
Saya membaca versi C ++ dari pertanyaan ini tetapi tidak terlalu memahaminya.
Bisakah seseorang tolong jelaskan jika itu bisa dilakukan dan bagaimana caranya?
Di C # 7 dan di atas, lihat jawaban ini .
Dalam versi sebelumnya, Anda dapat menggunakan Tuple .NET 4.0 + :
Sebagai contoh:
public Tuple<int, int> GetMultipleValue()
{
return Tuple.Create(1,2);
}
Tuple dengan dua nilai memiliki Item1
dan Item2
sebagai properti.
public (int sum, int count) GetMultipleValues() { return (1, 2); }
Contoh ini diambil dari contoh topik Dokumentasi kami tentang ini .Sekarang setelah C # 7 telah dirilis, Anda dapat menggunakan sintaks Tuples yang baru disertakan
yang kemudian bisa digunakan seperti ini:
Anda juga dapat memberikan nama ke elemen Anda (jadi mereka bukan "Item1", "Item2" dll). Anda dapat melakukannya dengan menambahkan nama ke tanda tangan atau metode pengembalian:
atau
Mereka juga dapat didekonstruksi, yang merupakan fitur baru yang cukup bagus:
Lihat tautan ini untuk melihat lebih banyak contoh tentang apa yang dapat dilakukan :)
sumber
Anda dapat menggunakan tiga cara berbeda
1. parameter ref / out
menggunakan referensi:
menggunakan:
2. struct / kelas
menggunakan struct:
menggunakan kelas:
3. Tuple
Kelas Tuple
C # 7 Tuples
sumber
Anda tidak dapat melakukan ini dalam C #. Yang dapat Anda lakukan adalah memiliki
Menggunakan parameter keluar Menggunakan kelas khusus (atau struct)out
parameter atau mengembalikan kelas Anda sendiri (atau struct jika Anda ingin itu tidak berubah).sumber
async
metode.Tuple
adalah cara untuk pergi. (Saya menggunakanout
parameter dalam operasi sinkron; mereka memang berguna dalam kasus-kasus itu.)Jika Anda bermaksud mengembalikan beberapa nilai, Anda dapat mengembalikan kelas / struct yang berisi nilai yang ingin Anda kembalikan, atau menggunakan kata kunci "out" pada parameter Anda, seperti:
sumber
Poster sebelumnya benar. Anda tidak dapat mengembalikan beberapa nilai dari metode C #. Namun, Anda memiliki beberapa opsi:
Pro dan kontra di sini seringkali sulit dipecahkan. Jika Anda mengembalikan struktur, pastikan itu kecil karena struct adalah tipe nilai dan diteruskan pada stack. Jika Anda mengembalikan instance kelas, ada beberapa pola desain di sini yang mungkin ingin Anda gunakan untuk menghindari masalah - anggota kelas dapat dimodifikasi karena C # melewati objek dengan referensi (Anda tidak memiliki ByVal seperti yang Anda lakukan di VB ).
Akhirnya Anda dapat menggunakan parameter output tetapi saya akan membatasi penggunaan ini untuk skenario ketika Anda hanya memiliki pasangan (seperti 3 atau kurang) parameter - jika tidak semuanya menjadi jelek dan sulit untuk dipelihara. Selain itu, penggunaan parameter output dapat menjadi penghambat kelincahan karena tanda tangan metode Anda harus berubah setiap kali Anda perlu menambahkan sesuatu ke nilai kembali sedangkan mengembalikan contoh struct atau kelas Anda dapat menambahkan anggota tanpa memodifikasi tanda tangan metode.
Dari sudut pandang arsitektur, saya akan merekomendasikan untuk tidak menggunakan pasangan kunci-nilai atau kamus. Saya menemukan gaya pengkodean ini membutuhkan "pengetahuan rahasia" dalam kode yang menggunakan metode ini. Ia harus mengetahui sebelumnya apa yang akan menjadi kunci dan apa nilai-nilai artinya dan jika pengembang bekerja pada implementasi internal mengubah cara kamus atau KVP dibuat, itu bisa dengan mudah membuat kaskade kegagalan di seluruh aplikasi.
sumber
Exception
jika nilai kedua yang ingin Anda kembalikan terpisah dari yang pertama: seperti ketika Anda ingin mengembalikan salah satu jenis nilai sukses, atau semacam nilai tidak berhasil.Anda baik mengembalikan contoh kelas atau menggunakan keluar parameter. Berikut ini contoh parameter keluar:
Sebut saja seperti ini:
sumber
Ada banyak cara; tetapi jika Anda tidak ingin membuat Obyek atau struktur baru atau sesuatu seperti ini, Anda dapat melakukannya seperti di bawah ini setelah C # 7.0 :
sumber
Di C # 7 Ada
Tuple
sintaks baru :Anda dapat mengembalikan ini sebagai catatan:
Anda juga dapat menggunakan sintaks dekonstruktor baru:
Berhati-hatilah dengan serialisasi, semua ini adalah gula sintaksis - dalam kode terkompilasi yang sebenarnya, ini akan menjadi
Tuple<string, int>
( sesuai jawaban yang diterima ) denganItem1
danItem2
bukannyafoo
danbar
. Itu berarti bahwa serialisasi (atau deserialisation) akan menggunakan nama-nama properti sebagai gantinya.Jadi, untuk serialisasi mendeklarasikan kelas rekaman dan mengembalikannya sebagai gantinya.
Juga baru di C # 7 adalah sintaks yang ditingkatkan untuk
out
parameter. Anda sekarang dapat mendeklarasikanout
inline, yang lebih cocok dalam beberapa konteks:Namun, sebagian besar Anda akan menggunakan ini di perpustakaan .NET sendiri, bukan di fungsi Anda sendiri.
sumber
Jawaban lain dinyatakan menggunakan Tuple, yang saya sarankan juga tetapi menggunakan fitur baru yang diperkenalkan di C # 7.0.
Informasi lebih lanjut dapat ditemukan di sini .
sumber
Ada beberapa cara untuk melakukan ini. Anda dapat menggunakan
ref
parameter:Ini meneruskan referensi ke fungsi sehingga memungkinkan fungsi untuk mengubah objek dalam tumpukan kode panggilan. Meskipun ini bukan nilai "kembali" secara teknis, ini adalah cara agar fungsi melakukan hal yang serupa. Dalam kode di atas fungsi akan mengembalikan
int
dan (berpotensi) memodifikasibar
.Pendekatan lain yang serupa adalah dengan menggunakan
out
parameter. Sebuahout
parameter identik denganref
parameter dengan tambahan compiler ditegakkan aturan,. Aturan ini adalah bahwa jika Anda melewatkanout
parameter ke suatu fungsi, fungsi itu diperlukan untuk mengatur nilainya sebelum kembali. Selain aturan itu,out
parameter berfungsi sepertiref
parameter.Pendekatan terakhir (dan yang terbaik dalam banyak kasus) adalah membuat tipe yang merangkum kedua nilai dan memungkinkan fungsi mengembalikannya:
Pendekatan akhir ini lebih sederhana dan lebih mudah dibaca dan dipahami.
sumber
Tidak, Anda tidak dapat mengembalikan beberapa nilai dari fungsi dalam C # (untuk versi yang lebih rendah dari C # 7), setidaknya tidak dengan cara yang dapat Anda lakukan dengan Python.
Namun, ada beberapa alternatif:
Anda bisa mengembalikan array tipe objek dengan beberapa nilai yang Anda inginkan di dalamnya.
Anda dapat menggunakan
out
parameter.sumber
Di C # 4, Anda akan dapat menggunakan dukungan bawaan untuk tupel untuk menangani ini dengan mudah.
Sementara itu, ada dua opsi.
Pertama, Anda dapat menggunakan parameter ref atau out untuk menetapkan nilai ke parameter Anda, yang akan diteruskan kembali ke rutinitas pemanggilan.
Ini terlihat seperti:
Kedua, Anda bisa membungkus nilai pengembalian Anda ke dalam struktur atau kelas, dan meneruskannya kembali sebagai anggota struktur itu. KeyValuePair berfungsi dengan baik untuk 2 - untuk lebih dari 2 Anda membutuhkan kelas atau struct khusus.
sumber
Anda dapat mencoba "KeyValuePair" ini
Keluaran:
Output: 1, 2
sumber
Kelas, Struktur, Koleksi dan Array dapat berisi beberapa nilai. Parameter keluaran dan referensi juga dapat diatur dalam suatu fungsi. Mengembalikan beberapa nilai dimungkinkan dalam bahasa yang dinamis dan fungsional dengan menggunakan tupel, tetapi tidak dalam C #.
sumber
Terutama ada dua metode. 1. Gunakan parameter out / ref 2. Kembalikan Array objek
sumber
Berikut adalah
Two
metode dasar :1) Penggunaan '
out
' sebagai parameter Anda dapat menggunakan 'keluar' untuk versi 4.0 dan minor juga.Contoh 'keluar':
Keluaran:
Luas Persegi Panjang adalah 20
Perimeter Persegi Panjang adalah 18
* Catatan: *
out
-keyword menjelaskan parameter yang lokasi variabel aktualnya disalin ke tumpukan metode yang dipanggil, di mana lokasi yang sama dapat ditulis ulang. Ini berarti bahwa metode panggilan akan mengakses parameter yang diubah.2)
Tuple<T>
Contoh Tuple:
Mengembalikan beberapa nilai Tipe Data menggunakan
Tuple<T>
Keluaran
CATATAN: Penggunaan Tuple valid dari Framework 4.0 dan di atasnya .
Tuple
tipe adalah aclass
. Ini akan dialokasikan di lokasi terpisah pada tumpukan yang dikelola dalam memori. Setelah Anda membuatTuple
, Anda tidak dapat mengubah nilai-nilainyafields
. Ini membuatTuple
lebih seperti astruct
.sumber
Anda dapat menerima kode seperti
Saya harap ini berhasil.
sumber
Metode mengambil delegasi dapat memberikan beberapa nilai kepada pemanggil. Ini meminjam dari jawaban saya di sini dan menggunakan sedikit dari jawaban Hadas yang diterima .
Penelepon menyediakan lambda (atau fungsi bernama) dan intellisense membantu dengan menyalin nama-nama variabel dari delegasi.
sumber
Cukup gunakan dengan cara OOP kelas seperti ini:
Anggota fungsi mengembalikan hasil bagi sebagian besar penelepon yang terutama tertarik. Selain itu, anggota fungsi menyimpan sisanya sebagai anggota data, yang mudah diakses oleh penelepon sesudahnya.
Dengan cara ini Anda dapat memiliki banyak "nilai pengembalian" tambahan, sangat berguna jika Anda menerapkan panggilan basis data atau jaringan, di mana banyak pesan kesalahan mungkin diperlukan tetapi hanya jika terjadi kesalahan.
Saya memasukkan solusi ini juga dalam pertanyaan C ++ yang dirujuk OP.
sumber
Dari artikel ini , Anda dapat menggunakan tiga opsi seperti tulisan di atas.
KeyValuePair adalah cara tercepat.
keluar di yang kedua.
Tuple adalah yang paling lambat.
Bagaimanapun, ini tergantung pada apa yang terbaik untuk skenario Anda.
sumber
Versi C # yang akan datang akan memasukkan tuple bernama. Lihatlah sesi channel9 ini untuk demo https://channel9.msdn.com/Events/Build/2016/B889
Lompat ke 13:00 untuk hal-hal tuple. Ini akan memungkinkan hal-hal seperti:
(contoh tidak lengkap dari video)
sumber
Anda bisa menggunakan objek dinamis. Saya pikir ini memiliki keterbacaan yang lebih baik daripada Tuple.
sumber
Cara melakukannya:
1) KeyValuePair (Kinerja Terbaik - 0,32 ns):
2) Tuple - 5,40 ns:
3) keluar (1,64 ns) atau ref 4) Buat kelas / struct khusus Anda sendiri
ns -> nanodetik
Referensi: beberapa-return-nilai .
sumber
Anda bisa mencoba ini
sumber
yield return "value1"; yield return "value2";
karena tidak harus secara eksplisit membuat yang barustring[]
?Anda juga dapat menggunakan OperationResult
sumber
Jawaban cepat khusus untuk pengembalian tipe array:
Menggunakan:
sumber