Aracılığıyla paylaş


Uzantı yöntemleri (Visual Basic)

Uzantı yöntemleri, geliştiricilerin yeni türetilmiş bir tür oluşturmadan önceden tanımlı veri türleri için özel işlevler eklemek etkinleştirin.Uzantı yöntemleri, varolan türünde bir örnek yöntemi yokmuş gibi çağrılabilir bir yöntem yazmak olanaklı kılar.

Notlar

Bir uzantı yöntemi yalnızca kullanılabilir bir Sub yordam veya bir Function yordam.Extension özelliği, alan ya da olay tanımlayamazsınız.Tüm uzantısı yöntemleri uzantısı özniteliğiyle işaretlenmesi <Extension()> dan System.Runtime.CompilerServices ad.

İlk parametre uzantısı yöntem tanımının içinde yöntemi genişletir hangi veri türünü belirtir.Yöntemi çalıştırıldığında, ilk parametresi yöntemini çağıran veri türü örneğine bağlı.

Örnek

Bb384936.collapse_all(tr-tr,VS.110).gifDescription

Aşağıdaki örnek tanımlayan bir Print uzantısı String veri türü.Yöntemi kullanan Console.WriteLine bir dizesini görüntülemek için.Parametresini Print yöntemi, aString, yöntemin genişleten kurar String sınıfı.

Imports System.Runtime.CompilerServices

Module StringExtensions

    <Extension()> 
    Public Sub Print(ByVal aString As String)
        Console.WriteLine(aString)
    End Sub

End Module

Uzantı yöntem tanımının uzantısı özniteliğiyle işaretlenmiş dikkat edin <Extension()>.İşaretleme yöntemi tanımlandığı modülü isteğe bağlıdır, ancak her bir uzantı yöntemi işaretlenmelidir.System.Runtime.CompilerServicesUzantı özniteliği erişmek için alınması gerekir.

Uzantı yöntemleri yalnızca modülleri içinde bildirilebilir.Genellikle, bir uzantısı yöntemi tanımlandığı modülü adlı olanla aynı modülü değil.Kapsam getirilecek olması gerekiyorsa, bunun yerine uzantısı yöntemi içeren modülün, içe aktarılır.İçeren modülün sonra Print olduğu gibi hiçbir bağımsız değişken alır bir sıradan bir oluşum yöntemi olan gibi kapsam içinde yöntem çağrılabilir ToUpper:

Module Class1

    Sub Main()

        Dim example As String = "Hello"
        ' Call to extension method Print.
        example.Print()

        ' Call to instance method ToUpper.
        example.ToUpper()
        example.ToUpper.Print()

    End Sub

End Module

Sonraki örnek, PrintAndPunctuate, ayrıca bir uzantısıdır String, bu kez iki parametre ile tanımlanmış.Birinci parametre, aString, uzantısı yöntemi genişleten kurar String.İkinci parametre, punc, yöntem çağrıldığında bir bağımsız değişken olarak geçirilen dize noktalama işaretlerinin olması amaçlanmıştır.Noktalama işaretleri ve ardından dize yöntemini görüntüler.

<Extension()> 
Public Sub PrintAndPunctuate(ByVal aString As String, 
                             ByVal punc As String)
    Console.WriteLine(aString & punc)
End Sub

Bir dize bağımsız değişkeni için göndererek yöntemi çaðrýlýr punc:example.PrintAndPunctuate(".")

Aşağıdaki örnekte gösterildiği Print ve PrintAndPunctuate adı verilen ve tanımlanmış.System.Runtime.CompilerServicestanım modülünde uzantısı özniteliğine erişimi etkinleştirmek için alınır.

Bb384936.collapse_all(tr-tr,VS.110).gifKod

Imports System.Runtime.CompilerServices

Module StringExtensions

    <Extension()> 
    Public Sub Print(ByVal aString As String)
        Console.WriteLine(aString)
    End Sub

    <Extension()> 
    Public Sub PrintAndPunctuate(ByVal aString As String, 
                                 ByVal punc As String)
        Console.WriteLine(aString & punc)
    End Sub

End Module

Daha sonra uzantısı yöntemleri kapsamına duruma ve denir.

Imports ConsoleApplication2.StringExtensions
Module Module1

    Sub Main()

        Dim example As String = "Example string"
        example.Print()

        example = "Hello"
        example.PrintAndPunctuate(".")
        example.PrintAndPunctuate("!!!!")

    End Sub
End Module

Bb384936.collapse_all(tr-tr,VS.110).gifComments

Tüm bunlar çalıştırmaları gereken veya benzer uzantısı yöntemleri kapsamında olmaları.Bir uzantı yöntemi içeren modülü kapsamında ise, IntelliSense görülebilir ve onu, bir sıradan bir oluşum yöntemi olsaydı gibi çağrılabilir.

Yöntem çağrıldığında, hiçbir bağımsız değişken ilk parametre için gönderildiğini dikkat edin.Parametre aString önceki yöntemde tanımları bağlı olduğu example, örneğini String , çağırır.Derleyici kullanacağı example gönderilen ilk parametre bağımsız değişkeni olarak.

Ayarlanmış olan bir nesne için bir uzantısı yöntemi çağrılır, Nothing, uzantısı yöntemi çalıştırılır.Bu sıradan örnek yöntemleri için geçerli değildir.Açıkça denetleyebilirsiniz Nothing uzantısı yöntemi.

Uzatılan türleri

Aşağıdakiler de dahil olmak üzere bir Visual Basic parametre listesinde, temsil edilebilir birçok türü uzantısı yöntemi tanımlayabilirsiniz:

  • Sınıflar (başvuru türleri)

  • Yapıları (değer türleri)

  • Arayüzler

  • Temsilciler

  • ByRef ve ByVal bağımsız değişkenleri

  • Genel yöntem parametreleri

  • Diziler

İlk parametre uzantısı yöntemi genişleten veri türünü belirtir çünkü gerekli ve isteğe bağlı olamaz.Bu nedenle, Optional parametreleri ve ParamArray parametreleri parametre listesindeki ilk parametre olmalıdır.

Geç bağlama uzantısı yöntemleri dikkate alınmaz.Aşağıdaki örnekte, ifade anObject.PrintMe() harekete geçiren bir MissingMemberException özel durum, aynı durum, görmelisiniz ikinci PrintMe uzantısı yöntem tanımının silindi.

Option Strict Off
Imports System.Runtime.CompilerServices

Module Module4

    Sub Main()
        Dim aString As String = "Initial value for aString"
        aString.PrintMe()

        Dim anObject As Object = "Initial value for anObject"
        ' The following statement causes a run-time error when Option
        ' Strict is off, and a compiler error when Option Strict is on.
        'anObject.PrintMe()
    End Sub

    <Extension()> 
    Public Sub PrintMe(ByVal str As String)
        Console.WriteLine(str)
    End Sub

    <Extension()> 
    Public Sub PrintMe(ByVal obj As Object)
        Console.WriteLine(obj)
    End Sub

End Module

En İyi Yöntemler

Uzantısı yöntemi varolan bir türünü genişletmek için kullanışlı ve güçlü bir yol sağlayın.Ancak, başarılı bir şekilde kullanmak için vardır bazı noktaları göz önünde bulundurun.Çoğunlukla sınıf kitaplıkları yazarlar için aşağıdaki önemli noktalar geçerlidir, ancak uzantısı yöntemleri kullanan herhangi bir uygulama etkileyebilir.

En genel olarak, sizin sahip olmadığınız türlerine eklemek uzantısı sizin denetiminizde türleri eklenmiş uzantısı yöntemlerine göre daha savunmasız yöntemlerdir.Birçok şeyi kendi uzantısı yöntemleriyle engelleyebilir, sahibi olmadığınız sınıfları ortaya çıkabilir.

  • Bağımsız değişkenden parametresi için gerekli hiçbir daraltma dönüşümleri çağıran deyimi bağımsız değişkenleri ile uyumlu olan bir imzaya sahip herhangi bir erişilebilir örnek üye varsa, herhangi bir uzantısı yöntemi tercih edin örnek yöntemi kullanılır.Bu nedenle, belirli bir noktada bir sınıfa uygun örnek yöntemi eklediyseniz, bağlı olduğunuz varolan bir uzantı üyeye erişilemez hale gelebilir.

  • Yazar bir uzantısı yöntemin diğer programcılar öncelik özgün uzantısı olabilir çakışan uzantısı yöntemleri yazma engelleyemez.

  • Kendi ad uzantısı yöntemleri yerleştirerek sağlamlık artırabilirsiniz.Sonra kitaplığınızın tüketiciler bir ad alanı eklemek veya dışlamak veya kitaplığı kalanından ayrı ayrı ad boşlukları arasında seçin.

  • Özellikle, arabirim veya sınıf ROM'unuz yoksa sınıflar, genişletmek için olduğundan daha arabirimleri uzatmak daha güvenli olabilir.Bunu uygulayan her sınıfın arabirim değişikliği etkiler.Bu nedenle, yazar eklemek veya bir arabirim yöntemleri değiştirmek daha az olasıdır.Ancak, bir sınıfın uzantısı yöntemleriyle aynı imzaya sahip iki arabirimi uygulayan, hiçbiri uzantısı yöntemi görülebilir.

  • Yapabilecekleriniz en belirgin türü genişletir.Türleri hiyerarşisinde, diğer birçok türetilir, bir tür seçerseniz örnek yöntemleri veya sizinkiyle etkileyebilir diğer uzantısı yöntemleri giriş olasılıklarını katmanı vardır.

Uzantı yöntemleri, örnek yöntemleri ve özellikleri

Bir kapsam içindeki örnek yöntemini çağıran deyimi bağımsız değişkenleri ile uyumlu olan bir imza varsa, herhangi bir uzantısı yöntemi tercih edin örnek yöntemi seçilir.Daha iyi bir eşleşme uzantısı yöntemi olsa bile örnek yöntemi göre önceliğe sahiptir.Aşağıdaki örnekte, ExampleClass adlı bir oluşum yöntemi içeren ExampleMethod bir parametre türü olan Integer.Uzantısı yöntemi ExampleMethod genişleten ExampleClass, ve bir parametre türü olan Long.

Class ExampleClass
    ' Define an instance method named ExampleMethod.
    Public Sub ExampleMethod(ByVal m As Integer)
        Console.WriteLine("Instance method")
    End Sub
End Class

<Extension()> 
Sub ExampleMethod(ByVal ec As ExampleClass, 
                  ByVal n As Long)
    Console.WriteLine("Extension method")
End Sub

İlk çaðrýdan ExampleMethod aşağıdaki kodda olduğundan uzantısı yöntemini çağırır arg1 olan Long ve yalnızca uyumlu Long uzantısı yöntemi parametre.İkinci çağrı ExampleMethod olan bir Integer bağımsız değişkeni arg2, ve oluşum yöntemini çağırır.

Sub Main()
    Dim example As New ExampleClass
    Dim arg1 As Long = 10
    Dim arg2 As Integer = 5

    ' The following statement calls the extension method.
    example.exampleMethod(arg1)
    ' The following statement calls the instance method.
    example.exampleMethod(arg2)
End Sub

Şimdi geriye doğru iki yöntem parametrelerini veri türleri:

Class ExampleClass
    ' Define an instance method named ExampleMethod.
    Public Sub ExampleMethod(ByVal m As Long)
        Console.WriteLine("Instance method")
    End Sub
End Class

<Extension()> 
Sub ExampleMethod(ByVal ec As ExampleClass, 
                  ByVal n As Integer)
    Console.WriteLine("Extension method")
End Sub

Bu kod, zaman Main iki kez oluşum yöntemini çağırır.Çünkü her ikisi de arg1 ve arg2 için widening conversion sahip Long, ve örnek yöntemi her iki durumda uzantısı yönteminde göre öncelik kazanır.

Sub Main()
    Dim example As New ExampleClass
    Dim arg1 As Long = 10
    Dim arg2 As Integer = 5

    ' The following statement calls the instance method.
    example.ExampleMethod(arg1)
    ' The following statement calls the instance method.
    example.ExampleMethod(arg2)
End Sub

Bu nedenle, bir uzantısı yöntemi, varolan bir oluşum yöntemi değiştirilemiyor.Ancak, her iki yöntem bir uzantısı yöntemi bir oluşum yöntemi aynı ada sahip ancak imzaları çakışmasını erişilebilir.Örneğin, sınıf ExampleClass adındaki bir yöntemi içeren ExampleMethod hiçbir bağımsız değişken, aynı adı taşıyan uzantısı yöntemi alır ancak farklı imzalar başarısının, aşağıdaki kodda gösterildiği gibi.

Imports System.Runtime.CompilerServices

Module Module3

    Sub Main()
        Dim ex As New ExampleClass
        ' The following statement calls the extension method.
        ex.ExampleMethod("Extension method")
        ' The following statement calls the instance method.
        ex.ExampleMethod()
    End Sub

    Class ExampleClass
        ' Define an instance method named ExampleMethod.
        Public Sub ExampleMethod()
            Console.WriteLine("Instance method")
        End Sub
    End Class

    <Extension()> 
    Sub ExampleMethod(ByVal ec As ExampleClass, 
                  ByVal stringParameter As String)
        Console.WriteLine(stringParameter)
    End Sub

End Module

Bu programýn çýktýsý aþaðýdaki gibidir:

Extension method

Instance method

Durum özellikleri ile daha basittir: bir uzantısı yöntemi onu uzatır sınıfının bir özelliği olarak aynı adı taşıyorsa, uzantısı yöntemi görünmez ve erişilemiyor.

Uzantısı yöntemi önceliği

Daha yüksek önceliğe sahip aynı imzaya sahip iki uzantısı yöntem kapsamdaki ve erişilebilir olduğunda çağrılacak.Bir uzantı yöntemin öncelik yöntemi kapsam getirmek için kullanılan mekanizma dayanır.Aşağıdaki liste, en yüksekten en düşük öncelik hiyerarşisini gösterir.

  1. Geçerli modülü içinde tanımlanan uzantısı yöntemleri.

  2. Uzantısı yöntemleri içinde veri türleri geçerli ad veya bunun ana öğelerinden biri üst ad alanları daha yüksek önceliğe sahip alt ad ile tanımlanır.

  3. Geçerli dosyasındaki herhangi bir tür Imports içinde tanımlanmış uzantı yöntemleri.

  4. Geçerli dosyadaki herhangi bir ad Imports içinde tanımlanan uzantısı yöntemleri.

  5. Herhangi bir proje düzeyi türü Imports içinde tanımlanmış uzantı yöntemleri.

  6. Herhangi bir proje düzeyinde ad Imports içinde tanımlanmış uzantı yöntemleri.

Öncelik belirsizlik çözmezse, tam adı aradığınız yöntemini belirtmek için kullanabilirsiniz.Print Yöntemi önceki örnekte adlý bir modülde tanımlanan StringExtensions, tam adı StringExtensions.Print(example) yerine example.Print().

Ayrıca bkz.

Başvuru

System.Runtime.CompilerServices

Modül deyimi

Öznitelikler (C# ve Visual Basic)

ExtensionAttribute

Kavramlar

Yordam parametreleri ve bağımsız değişkenler (Visual Basic)

İsteğe bağlı parametreler (Visual Basic)

Parametre dizileri (Visual Basic)

Visual Basic'te kapsamı