Apakah ada VB.NET yang setara dengan parameter C # out?


95

Apakah VB.NET memiliki ekuivalen langsung dengan outparameter fungsi C # , di mana variabel yang dilewatkan ke suatu fungsi tidak perlu diinisialisasi?

Jawaban:


98

Tidak, tidak ada padanan outkata kunci di VB.

Namun, VB secara otomatis menginisialisasi semua variabel lokal dalam suatu metode, sehingga Anda dapat menggunakan ByReftanpa perlu menginisialisasi variabel secara eksplisit terlebih dahulu.

Contoh:

Sub Main()
  Dim y As Integer
  Test(y)
End Sub

Sub Test(ByRef x As Integer)
  x = 42
End Sub

(Jika Anda memeriksa kode dalam kerangka kerja (misalnya Double.TryParse ), Anda mungkin melihat <OutAttribute>parameter ditambahkan ke, tetapi itu hanya membuat perbedaan ketika panggilan diatur untuk interop COM atau pemanggilan platform.)


2
@Spolto: Jika Anda menerjemahkan VBScript ke VB, Anda harus memastikan untuk menyetel mode Eksplisit dan Ketat. Ini akan memberi Anda lebih banyak pesan kesalahan, tetapi sebagian besar akan mengarah ke sumber masalah (misalnya variabel dideklarasikan tanpa tipe) daripada masalah sekunder (misalnya variabel dideklarasikan tanpa tipe menjadi Object, jadi tidak dapat digunakan untuk ByRef x As Integerparameter).
Guffa

4
@ Guffa: Saya tidak tahu apakah itu hal versi, tetapi saya juga mendapatkan peringatan compiler ketika meneruskan variabel jenis referensi yang tidak diinisialisasi sebagai ByRefparameter. (Ini tidak terjadi dengan parameter tipe nilai.)
Dan Tao

4
@ Dan Tao, Spolto: Sepertinya itu bedanya, saya mendapat peringatan dengan tipe referensi juga. Ketidakmampuan untuk menentukan parameter adalah batasan dalam bahasa, dan Anda hanya perlu menginisialisasi variabel untuk menghilangkan peringatan. Bahkan menugaskan Nothingkepada mereka akan menghilangkan peringatan tersebut meskipun tidak mengubah hasil.
Guffa

1
@ Guffa: Ya, saya telah menugaskan Nothingmereka sejauh ini. Ini hanya memakan waktu karena saya harus melakukannya ratusan kali di situs web lama yang besar. Terima kasih telah menyelidiki.
cspolton

3
@MarkHurd: Maka downvote-nya tidak adil, karena saya sudah membahas bahwa Outatributnya tidak setara dengan outkata kunci C # .
Guffa

32

Tidak, tidak ada konstruk setara yang memungkinkan variabel non-dijalankan untuk diteruskan ke metode tanpa peringatan, tapi, seperti disebutkan dalam saya tanya jawab menentukan sebuah <Out()>atribut pada ByRefdefinisi parameter, meskipun VB mengabaikannya, yang diobati dengan C # sebagai outparameter.

Jadi, saya akan menginisialisasi variabel referensi ke Nothing dan menentukan <Out()> ByRefuntuk menandakan niat (yang akan berfungsi jika pengguna C # pernah mengakses metode Anda).

Jika Anda merasa tahu kapan Anda bermaksud mengakses default Nothingdi variabel referensi yang tidak ditetapkan, Anda dapat mengatur "Konfigurasi peringatan" "Penggunaan variabel sebelum penetapan" ke "Tidak ada" di tingkat Proyek (Properti Proyek> Kompilasi, dan Anda mungkin ingin mengatur Konfigurasi ke "Semua Konfigurasi" sebelum mengubah pengaturan ini), atau, di VS2015 (VB.NET 14), Anda dapat menggunakan #Disable Warning BC42030.


3
Ini penting. Saya memiliki subkelas VB dari MembershipProvider dan kemudian subkelas C # dari subkelas VB. Kode C # tidak mengenali fakta bahwa metode abstrak di MembershipProvider telah diterapkan sampai saya menerapkan atribut di kelas VB untuk parameter yang ditentukan seperti di kelas dasar MembershipProvider.
Richard Collette

@RichardCollette Itu mungkin layak menjadi jawaban atas pertanyaan tertaut saya!
Mark Hurd

9

Versi C #

  void TestFunc(int x, ref int y, out int z) {
  x++;  
  y++;
  z = 5;
}

Versi Vb.net

    Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
  x += 1
  y += 1 
  z = 5 
End Sub

Temukan jawabannya di sini

Memperbarui

Seperti yang dinyatakan di komentar jangan lupa untuk menginisialisasi parameter Anda yang akan digunakan di slot keluar


Secara umum, saya setuju bahwa ByRef adalah yang paling mendekati ke luar . Namun, ByRef masih akan memberikan peringatan jika Anda meneruskan variabel yang tidak diinisialisasi, seperti yang ditanyakan oleh pertanyaan.
Richard

Suara negatif saya berasal dari beberapa waktu yang lalu: Situs web yang Anda tautkan sangat umum; tidak mencantumkan masalah, perbedaan, dan teknis khusus. Juga jawaban Anda masih belum menjawab pertanyaan itu.
Mark Hurd

1

Saya punya masalah di VB.NET yang saya sebut fungsi "oleh ref" yang melewati array kembali.

Meskipun kompilator menandainya sebagai peringatan, itu baik-baik saja. Cara mengatasinya sangat sederhana dan mungkin praktik pemrograman yang baik.

aku berubah

Dim m_arr_values() as Integer

fnRetArray(m_arr_values)

untuk

' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing

fnRetArray(m_arr_values)

Ini juga membantu saat membuat kode jika nama variabel bersifat deskriptif ...

Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
    ...
End Sub

3
Notasi bahasa Hongaria bertentangan dengan pedoman desain kerangka kerja .NET.
Gqqnbig

0

Anda dapat menggunakan metode pass by reference di VB.NET.

Anda memerlukan mekanisme parameter Out di C #, karena ini tidak mengizinkan Anda menggunakan variabel apa pun tanpa memulainya.

VB.NET tidak memerlukan kata kunci khusus karena secara otomatis melakukannya dengan sendirinya.

Cukup gunakan ByRef.


3
Ini tidak menjawab pertanyaan, dan itu salah sehubungan dengan C #.
cspolton

Byref memungkinkan Anda untuk tidak menginisialisasi, dan memungkinkan Anda untuk mengubah nilai params. Tapi, sebagai lawan dari parameter C # out, itu MENGIZINKAN Anda untuk menginisialisasi parameter dengan nilai dan menggunakannya dalam fungsi, sedangkan di C # kata kunci keluar memaksa Anda untuk menggunakan ini HANYA sebagai parameter keluar dan BUKAN sebagai input ke fungsinya. Juga, jika Anda tidak mengubah atau menetapkan nilai ke parameter ini di dalam fungsi Anda, kompilator tidak akan menangkapnya sebagai kesalahan, berbeda dengan C # di mana kesalahan kompilasi akan dikeluarkan.
pashute


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.