Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfada, yordamlarla çalışırken oluşabilecek bazı yaygın sorunlar listelenir.
bir işlev yordamından dizi türü döndürme
Bir Function yordam bir dizi veri türü döndürürse, dizi öğelerindeki değerleri depolamak için adını kullanamazsınız Function . Bunu yapmaya çalışırsanız, derleyici bunu çağrısı Functionolarak yorumlar. Aşağıdaki örnek derleyici hataları oluşturur:
Function AllOnes(n As Integer) As Integer()
For i As Integer = 1 To n - 1
' The following statement generates a COMPILER ERROR.
AllOnes(i) = 1
Next
' The following statement generates a COMPILER ERROR.
Return AllOnes()
End Function
deyimiAllOnes(i) = 1, yanlış veri türündeki bir bağımsız değişkenle (dizi yerine skalerInteger) çağrılır AllOnes gibi göründüğünden derleyici Integer hatası oluşturur. deyimi Return AllOnes() , bağımsız değişken olmadan çağırdığı AllOnes için bir derleyici hatası oluşturur.
Doğru yaklaşım: Döndürülecek dizinin öğelerini değiştirebilmek için bir iç diziyi yerel değişken olarak tanımlayın. Aşağıdaki örnek hatasız derlenmiş:
Function AllOnes(n As Integer) As Integer()
Dim iArray(n - 1) As Integer
For i = 0 To n - 1
iArray(i) = 1
Next
Return iArray
End Function
Bağımsız değişken yordam çağrısı tarafından değiştirilmedi
Bir yordamın, çağıran koddaki bir bağımsız değişkenin temel aldığı programlama öğesini değiştirmesine izin vermeyi planlıyorsanız, bunu başvuruya göre geçirmeniz gerekir. Ancak bir yordam, değere göre geçirseniz bile başvuru türü bağımsız değişkeninin öğelerine erişebilir.
Temel alınan değişken. Yordamın temel değişken öğesinin değerini değiştirmesine izin vermek için yordamın ByRef parametresini bildirmesi gerekir. Ayrıca, çağıran kod bağımsız değişkeni parantez içine almamalıdır, çünkü bu geçiş mekanizmasını
ByRefgeçersiz kılar.Başvuru türü öğeleri. ByVal parametresini bildirirseniz, yordam temel değişken öğesinin kendisini değiştiremez. Ancak, bağımsız değişken bir başvuru türüyse, değişkenin değerini değiştiremese de yordam, işaret ettiği nesnenin üyelerini değiştirebilir. Örneğin, bağımsız değişken bir dizi değişkeniyse, yordam buna yeni bir dizi atayamaz, ancak bir veya daha fazla öğesini değiştirebilir. Değiştirilen öğeler, çağrı kodundaki temel dizi değişkenine yansıtılır.
Aşağıdaki örnek, bir dizi değişkenini değere göre alan ve öğeleri üzerinde çalışan iki yordamı tanımlar. Yordam increase her öğeye bir tane ekler. Yordam replace parametresine a() yeni bir dizi atar ve ardından her öğeye bir dizi ekler. Ancak, yeniden atama, bildirildiği ByValiçin a() çağıran koddaki temel dizi değişkenini etkilemez.
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 ve replaceiçin increase çağrılar yapar:
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ıda "Artış sonrası(n): 11, 21, 31, 41" görüntülenir. Bir n başvuru türü olduğundan, increase geçirilse ByValbile üyelerini değiştirebilir.
İkinci MsgBox çağrıda "Değiştirildikten sonra(n): 11, 21, 31, 41" görüntülenir.
n geçirildiğindenByVal, replace değişkenine yeni bir dizi atayarak değişkeni n değiştiremez. Yeni dizi örneğini k oluşturup yerel değişkenine aatadığındareplace, çağıran kod tarafından geçirilen başvuruyu n kaybeder. üyelerini aartırdığında yalnızca yerel dizi k etkilenir.
Doğru yaklaşım: Temel alınan değişken öğesinin kendisini değiştirebilmek için, bunu başvuruya göre geçirin. Aşağıdaki örnek, bildirimindeki replace bir diziyi çağıran kodda başka bir diziyle değiştirmesine olanak tanıyan değişikliği gösterir:
Public Sub replace(ByRef a() As Long)
Aşırı yükleme tanımlanamıyor
Bir yordamın aşırı yüklenmiş bir sürümünü tanımlamak istiyorsanız, aynı adı ama farklı bir imzayı kullanmanız gerekir. Derleyici bildiriminizi aynı imzaya sahip bir aşırı yüklemeden ayırt edemiyorsa bir hata oluşturur.
Bir yordamın imzası , yordam adı ve parametre listesi tarafından belirlenir. Her aşırı yüklemenin diğer tüm aşırı yüklemelerle aynı ada sahip olması, ancak imzanın diğer bileşenlerinden en az birinde tümünden farklı olması gerekir. Daha fazla bilgi için bkz. Yordam Aşırı Yükleme.
Parametre listesiyle ilgili olsalar da aşağıdaki öğeler bir yordamın imzasının bileşenleri değildir:
- ,
SharedveStaticgibiPublicyordam değiştirici anahtar sözcükleri. - Parametre adları.
- ve
OptionalgibiByRefparametre değiştirici anahtar sözcükleri. - Dönüş değerinin veri türü (dönüştürme işleci hariç).
Önceki öğelerden yalnızca bir veya daha fazlasını değiştirerek bir yordamı aşırı yükleyemezsiniz.
Doğru yaklaşım: Yordam aşırı yüklemesini tanımlayabilmek için imzayı değiştirmelisiniz. Aynı adı kullanmanız gerektiğinden, parametrelerin sayısını, sırasını veya veri türlerini değiştirmelisiniz. Genel bir yordamda, tür parametrelerinin sayısını değiştirebilirsiniz. Dönüştürme işlecinde (CType İşleci), dönüş türünü değiştirebilirsiniz.
İsteğe Bağlı ve ParamArray bağımsız değişkenleriyle aşırı yükleme çözümlemesi
Bir yordamı bir veya daha fazla İsteğe bağlı parametre veya ParamArray parametresiyle aşırı yüklü kullanıyorsanız, örtük aşırı yüklemelerden herhangi birini yinelemekten kaçınmanız gerekir. Daha fazla bilgi için bkz. Yordamları Aşırı Yükleme konusunda dikkat edilmesi gerekenler.
Aşırı yüklenmiş yordamın yanlış sürümünü çağırma
Bir yordamın birkaç aşırı yüklenmiş sürümü varsa, tüm parametre listelerini biliyor olmanız ve Visual Basic'in aşırı yüklemeler arasındaki çağrıları nasıl çözümlediğini anlamanız gerekir. Aksi takdirde, hedeflenenden farklı bir aşırı yükleme çağırabilirsiniz.
Hangi aşırı yüklemeyi çağırmak istediğinizi belirlediyseniz aşağıdaki kurallara dikkat edin:
- Doğru sayıda bağımsız değişken ve doğru sırada sağlayın.
- İdeal olan, bağımsız değişkenlerinizin karşılık gelen parametrelerle tam olarak aynı veri türlerine sahip olmasıdır. Her durumda, her bağımsız değişkenin veri türü ilgili parametresinin veri türüne genişletilmelidir.
Bu, Option Strict Deyimi olarak ayarlanmış
Offolsa bile geçerlidir. Aşırı yükleme bağımsız değişken listenizden herhangi bir daraltma dönüştürmesi gerektiriyorsa, bu aşırı yükleme çağrılmaya uygun değildir. - Genişletme gerektiren bağımsız değişkenler sağlarsanız, veri türlerini ilgili parametre veri türlerine mümkün olduğunca yakın hale getirin. İki veya daha fazla aşırı yükleme bağımsız değişken veri türlerinizi kabul ederse, derleyici en az miktarda genişletmeyi çağıran aşırı yüklemeye yönelik çağrınızı çözümler.
Bağımsız değişkenlerinizi hazırlarken CType İşlevi dönüştürme anahtar sözcüğünü kullanarak veri türü uyuşmazlıklarının olasılığını azaltabilirsiniz.
Aşırı yükleme çözümleme hatası
Aşırı yüklenmiş bir yordamı çağırdığınızda, derleyici aşırı yüklemelerden biri dışında tümünü ortadan kaldırmaya çalışır. Başarılı olursa, bu aşırı yüklemeye yapılan çağrıyı çözer. Tüm aşırı yüklemeleri ortadan kaldırırsa veya uygun aşırı yüklemeleri tek bir adayla azaltamazsa bir hata oluşturur.
Aşağıdaki örnekte aşırı yükleme çö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)
İlk çağrıda, ilk bağımsız değişkenin türü karşılık gelen parametreninByte (Short) türüne daralttığı için derleyici ilk aşırı yüklemeyi ortadan kaldırır. Ardından, ikinci aşırı yüklemedeki ( ve ) her bağımsız değişken türü üçüncü aşırı yüklemede (ShortIntegerSingleve Single) ilgili türe genişletildiği için üçüncü aşırı yüklemeyi ortadan kaldırır. İkinci aşırı yükleme daha az genişletme gerektirir, bu nedenle derleyici bunu çağrı için kullanır.
İkinci çağrıda derleyici, daraltma temelinde aşırı yüklemelerin hiçbirini ortadan kaldıramaz. Bağımsız değişken türlerinin daha az genişletilmesiyle ikinci aşırı yüklemeyi çağırabildiğinden üçüncü aşırı yüklemeyi ilk çağrıdakiyle aynı nedenle ortadan kaldırır. Ancak, derleyici birinci ve ikinci aşırı yüklemeler arasında çözümlenemez. Her biri, diğerinde karşılık gelen türe (ByteShortiçin, ancak Single ) genişleyen bir tanımlı parametre türüne Doublesahiptir. Bu nedenle derleyici bir aşırı yükleme çözümleme hatası oluşturur.
Doğru yaklaşım: Belirsizlik olmadan aşırı yüklenmiş bir yordamı çağırabilmek için, bağımsız değişken veri türlerini parametre türleriyle eşleştirmek için CType İşlevi'ni kullanın. Aşağıdaki örnekte, çözümlemeyi z ikinci aşırı yüklemeye zorlayan bir çağrı gösterilmektedir.
Call z(CType(p, Short), CType(q, Single))
İsteğe Bağlı ve ParamArray bağımsız değişkenleriyle aşırı yükleme çözümlemesi
Bir yordamın iki aşırı yüklemesi aynı imzalara sahipse, son parametrenin birinde İsteğe bağlı , diğerinde ParamArray olarak bildirilirse, derleyici bu yordama yönelik çağrıyı en yakın eşleşmeye göre çözümler. Daha fazla bilgi için bkz . Aşırı Yükleme Çözümü.