Aracılığıyla paylaş


Yordam Sorunlarını Giderme (Visual Basic)

Bu sayfa yordamlar ile çalışırken oluşabilecek bazı ortak sorunları listeler.

Bir dizi türü döndüren bir işlev yordamı

Yoksa bir Function yordam bir dizi veri türü verir, kullanamazsınız Function dizi öğelerinin değerlerini depolamak için ad.Bunu denerseniz, derleyici, bir çağrı olarak yorumlayan Function.Aşağıdaki örnek, derleyici hataları oluşturur.

Function allOnes(ByVal n As Integer) As Integer()

For i As Integer = 1 To n - 1

' The following statement generates a COMPILER ERROR.

allOnes(i) = 1

Next i

' The following statement generates a COMPILER ERROR.

Return allOnes()

End Function

İfade allOnes(i) = 1 aranacak göründüğünden bir derleyici hatası oluşturur allOnes yanlış veri türünde bir bağımsız değişken ile (tek Integer yerine bir Integer dizisi).İfade Return allOnes() aranacak göründüğünden bir derleyici hatası oluşturur allOnes ile herhangi bir bağımsız değişken.

Doğru bir yaklaşım: iç dizi verilir bir dizinin öğeleri değiştirmek için yerel bir değişken olarak tanımlayın.Aşağıdaki örnek, hatasız derler.

Function allOnes(ByVal n As Integer) As Integer()
    Dim i As Integer, iArray(n) As Integer 
    For i = 0 To n - 1
        iArray(i) = 1
    Next i
    Return iArray
End Function

Bağımsız değişken değil değiştirilmesini yordam çağrısı tarafından

Bir yordamı çağıran kodun bir bağımsız değişken temel programlama bir öğeyi değiştirmek izin vermek istiyorsanız, başvuruya göre geçmesi gerekir.Ancak değerine göre geçmesi bile bir yordam bir başvuru türü değişkeni öğelerden erişebilirsiniz.

  • Değişken temel.Yordam öğesinin değerini temel değişken kendisini değiştirmek izin vermek için yordam parametresi bildirmek ByRef (Visual Basic).Geçersiz olduğundan Ayrıca, çağıran kodun bağımsız değişkeni parantez içine almalýsýnýz değil ByRef mekanizması geçirerek.

  • Başvuru türü öğeler.Bir parametre bildirirseniz ByVal (Visual Basic), yordam temel değişken element değiştiremezsiniz.Ancak, bağımsız bir başvuru türündeyse, değişkenin değeri değiştirilemiyor olsa yordamı, gösterdiği, nesne üyeleri değiştirebilir.Örneğin, bağımsız değişken bir dizi değişkeni ise, yordam için yeni bir dizi atayamazsınız, ancak bir veya daha fazlasını öğelerini değiştirebilirsiniz.Değiştirilen öğeler çağıran kodun temel dizi değişkeni yansıtılır.

Aşağıdaki örnek, bir dizi değişkeninin değerine göre yararlanmak ve işletmek iki yordam üzerinde öğelerini tanımlar.Yordam increase sadece biri her öğe ekler.Yordam replace yeni bir dizi parametresi atar a() ve her öğe için bir tane ekler.Ancak, yeniden atamayı çağıran kodun temel dizi değişkeni etkilemez çünkü a() bildirilmiş ByVal.

Public Sub increase(ByVal a() As Long)
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Public Sub replace(ByVal a() As Long)
    Dim k() As Long = {100, 200, 300}
    a = k
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub

Aşağıdaki örnek çağrılar increase ve replace.

Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " & 
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " & 
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))

İlk MsgBox çağrısı görüntüler "increase(n) sonra: 11, 21, 31, 41".Çünkü n bir başvuru türü olan increase geçirilen halde kendi üyeleri değiştirebilir ByVal.

İkinci MsgBox çağrısı görüntüler "replace(n) sonra: 11, 21, 31, 41".Çünkü n geçirilen ByVal, replace değişkeni değiştirilemez n yeni bir dizi için atayarak.Zaman replace yeni bir array örneği oluşturur k ve yerel bir değişkene atar a, referansı kaybediyor n çağıran kodun tarafından geçirilen.Ne zaman onu artırır üyelerini a, yalnızca yerel dizi k etkilenir.

Doğru bir yaklaşım: temel değişken öğenin kendisini değiştirmek için referans geçirmek.Aşağıdaki örnek bildiriminde değişiklik gösterir replace bir dizi arama kodu diğeriyle değiştirmek için sağlar.

Public Sub replace(ByRef a() As Long)

Aşırı tanımlamak için

Bir yordam aşırı yüklü bir sürümünü tanımlamak istiyorsanız, aynı ada ancak farklı imza kullanmanız gerekir.Derleyici, bildirimde aynı imzaya sahip aşırı ayrım, bir hata üretir.

İmza yordamı yordamın adını ve parametre listesi tarafından belirlenir.Her aşırı diğer aşırı ile aynı ada sahip, ancak bunları en az bir imza diğer bileşenlerinin tümünden farklı olması.Daha fazla bilgi için bkz. Yordam Aşırı Yüklemesi (Visual Basic).

Parametre listesine ait oldukları halde aşağıdaki öğeler bir yordamın imzanın bileşenleri değil:

  • Yordam değiştirici anahtar sözcükler gibi Public, Shared, veStatic

  • Parametre adları

  • Parametre değiştirici anahtar sözcükler gibi ByRef veOptional

  • (Dışında için bir dönüştürme işleci) değerin veri türü

Bir veya daha fazla önceki öğeleri yalnızca değişen tarafından bir yordam aþýrý yükleyemezsiniz.

Doğru bir yaklaşım: yordam aşırı tanımlayabilmek için imza değişir.Aynı adı kullanmanız gerekir çünkü numarasını, sipariş veya parametre veri türleri farklı farklı belirlemelisiniz.Genel yordamda türü parametre sayısı değişebilir.İçinde bir Dönüþtürme iþleci (CType İşlevi (Visual Basic)), dönüş türü değişebilir.

Çözünürlük ile isteğe bağlı ve bağımsız değişkenler ParamArray aşırı yükleme

Bir veya daha fazla yordama aşırı yüklenmesini, İsteğe Bağlı (Visual Basic) parametreleri veya bir ParamArray (Visual Basic) parametresi gerekir kaçının herhangi bir çoğaltma örtülü aþýrý yükleme.Daha fazla bilgi için, bkz. Yordamları Aşırı Yüklemeye İlişkin Düşünceler (Visual Basic).

Aşırı yüklü bir yordamı yanlış bir sürümünü çağırmak

Bir yordamın birkaç aşırı yüklü sürümlerini görmek varsa, bunların tüm parametre listeleri ile tanıdık ve anlamak nasıl Visual Basic çağrıları arasında aşırı giderir.Aksi halde aşırı dışındaki hedeflenen çağırabilir.

Aramak istediğiniz hangi aşırı belirlediğinizde, aşağıdaki kuralları aklınızda bulundurun dikkatli olun:

  • Bağımsız değişkenler ve doğru sırada doğru numarayı sağlarsınız.

  • İdeal olarak, kendi bağımsız tam aynı veri türlerine karşılık gelen bir parametre olmalıdır.Her durumda, her bağımsız değişken veri türü, kendine karşılık gelen parametrenin genişletmek gerekir.Bu doğru olsa da Option Strict Deyimi için Off.Aşırı tekrar kendi bağımsız değişken listesinde, herhangi bir daraltma dönüştürmesi gerektiriyorsa çağrılması için uygun değil.

  • Widening gerektiren bağımsız sağlarsanız, kendi veri türlerine karşılık gelen parametre veri türleri için mümkün olduğunca yakın olun.İki veya daha fazla aşırı değişken veri türlerini kabul ederseniz, derleyici genişletmenin en az miktarı için çağırır aşırı aradığınızda giderir.

Kullanarak veri türü uyuşmazlığı olasılığını azaltabilirsiniz CType İşlevi (Visual Basic) değişkenlerinizin hazırlanırken dönüştürme anahtar sözcüğü.

Aşırı çözümleme hatası

Aşırı yüklü bir yordamı çağırdığınızda, biri dışında tüm aşırı ortadan kaldırmak derleyici çalışır.Başarılı olursa, o aşırı çağrısına giderir.Aşırı ortadan kaldırır veya tek bir aday için uygun aşırı daraltamazsınız gerekiyorsa, bir hata üretir.

Aşağıdaki örnekte, aşırı çözümleme işlemi gösterilmektedir.

Overloads Sub z(ByVal x As Byte, ByVal y As Double)
End Sub 
Overloads Sub z(ByVal x As Short, ByVal y As Single)
End Sub 
Overloads Sub z(ByVal x As Integer, ByVal y As Single)
End Sub
Dim r, s As Short 
Call z(r, s)
Dim p As Byte, q As Short 
' The following statement causes an overload resolution error. 
Call z(p, q)

Çünkü derleyici ilk çağrıda ilk aşırı ortadan ilk bağımsız değişkenin türü (Short) karşılık gelen parametrenin türüne daraltır (Byte).Tür bağımsız değişkeni, her çünkü ikinci overload sonra üçüncü aşırı ortadan (Short ve Single) üçüncü aşırı ilgili yazıyla widens (Integer ve Single).Böylece derleyici arama için kullandığı ikinci aşırı daha az widening gerektirir.

İkinci çağrısında derleyici daraltmaya dayanılarak aşırı birini ortadan olamaz.Daha az bağımsız değişken türlerini widening ile ikinci aşırı çağırabilirsiniz çünkü ilk çağrıda olduğu gibi aynı nedenle üçüncü aşırı ortadan.Ancak, derleyici arasında birinci ve ikinci aşırı çözümlenemiyor.Her bir karşılık gelen türü widens tanımlanan parametre türü vardır (Byte için Short, ama Single için Double).Derleyici bu nedenle tekrar yükleme çözümlemesi hata üretir.

Doğru bir yaklaşım: belirsizlik olmadan aşırı yüklü bir yordam çağrısı yapabilmek için CType İşlevi (Visual Basic) parametre türleri için bağımsız değişken veri türleriyle eşleştirmek üzere.Arama için aşağıdaki örnekte gösterildiği z , çözüm için ikinci aşırı zorlar.

Call z(CType(p, Short), CType(q, Single))

Çözünürlük ile isteğe bağlı ve bağımsız değişkenler ParamArray aşırı yükleme

Son parametre olarak bildirilmiş olmasıdır iki aþýrý yüklemesinin bir yordam aynı imzaya sahip, İsteğe Bağlı (Visual Basic) biri ve ParamArray (Visual Basic) diğerine, derleyici bu yordama göre en yakın bir çağrı giderir.Daha fazla bilgi için bkz. Aşırı Yükleme Çözümü (Visual Basic Başvurusu).

Ayrıca bkz.

Kavramlar

Visual Basic'de Yordamlar

Alt Yordamlar (Visual Basic)

İşlev Yordamları (Visual Basic)

Özellik Yordamları (Visual Basic)

İşleç Yordamları (Visual Basic)

Yordam Parametreleri ve Bağımsız Değişkenler (Visual Basic)

Yordam Aşırı Yüklemesi (Visual Basic)

Yordamları Aşırı Yüklemeye İlişkin Düşünceler (Visual Basic)

Aşırı Yükleme Çözümü (Visual Basic Başvurusu)