Sdílet prostřednictvím


Rozšíření metody (Visual Basic)

Rozšíření metody vývojářům datové typy, které jsou již definovány bez vytvoření nového typu odvozené přidat vlastní funkce.Rozšíření metody provést metodu, která může být volána, jako by šlo o metodu instance typu stávajícího zápisu.

Poznámky

Metodu rozšíření mohou být pouze Sub postup nebo Function postup.Nelze definovat vlastnost extension, pole nebo události.Všechny metody rozšíření musí být označena atributem rozšíření <Extension()> z System.Runtime.CompilerServices oboru názvů.

První parametr metody definici rozšíření určuje, který typ metody rozšiřuje.Při spuštění metody instance datového typu, která vyvolá metodu vázán první parametr.

Příklad

Bb384936.collapse_all(cs-cz,VS.110).gifDescription

Následující příklad definuje Print rozšíření String datového typu.Metoda používá Console.WriteLine zobrazí řetězec.Parametr Print metody, aString, stanoví, že metoda rozšiřuje String třídy.

Imports System.Runtime.CompilerServices

Module StringExtensions

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

End Module

Všimněte si, že definice metody rozšíření je označen atributem rozšíření <Extension()>.Modul, ve kterém je metoda definována označení je volitelný, ale každý způsob rozšíření musí být označeny.System.Runtime.CompilerServicesmusí být importovány přístup k atributu rozšíření.

Rozšíření metody lze deklarovat pouze v rámci modulů.Modul, ve kterém je definován metodu rozšíření obvykle není stejný jako ten, který se nazývá modul.Místo toho modulu, který obsahuje rozšíření metodu importu, pokud je třeba jej do oboru.Po modul, který obsahuje Print je v oboru, lze volat metody, jako by šlo o metodu instance běžným, který nevyžaduje žádné argumenty, například 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

Další příklad PrintAndPunctuate, je také rozšíření String, tentokrát definovány dva parametry.První parametr aString, stanoví, že metoda rozšíření rozšiřuje String.Druhý parametr punc, má být řetězec interpunkční znaménka, který je předán jako argument při volání metody.Metoda zobrazí řetězec následuje interpunkční znaménka.

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

Je volána metoda odesláním řetězec argumentu punc:example.PrintAndPunctuate(".")

Následující příklad ukazuje Print a PrintAndPunctuate definovány a názvem.System.Runtime.CompilerServicesv modulu definice je importován umožňující přístup k atributu rozšíření.

Bb384936.collapse_all(cs-cz,VS.110).gifKód

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

Dále jsou metody rozšíření do oboru a názvem.

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(cs-cz,VS.110).gifKomentáře

Všechny požadované spouštět tyto nebo podobné rozšíření metody je, že mohou být v oboru.Pokud modul, který obsahuje metodu rozšíření v oboru, je zobrazen v technologii IntelliSense a může být volána, jako by šlo o metodu instance běžné.

Všimněte si, že když jsou vyvolána metody, žádný argument je odesláno jako první parametr.Parametr aString v předchozí metoda definice vázán na example, instance String , jejich volání.Použije kompilátor example jako argument odeslaný do první parametr.

Pokud metodu rozšíření nazývá pro objekt, který je nastaven na Nothing, metoda rozšíření.To se nevztahuje na běžné instance metody.Explicitně lze zjišťovat Nothing v metodě rozšíření.

Typy, které lze rozšířit

Můžete definovat metodu rozšíření na většině typů, které mohou být zastoupeny v seznamu parametrů jazyka Visual Basic, včetně následujících:

  • Třídy (typy odkazů)

  • Struktury (hodnota typy)

  • Rozhraní

  • Delegáti

  • Argumenty typu ByRef a ByVal

  • Obecná metoda parametry

  • Matice

Protože první parametr určuje typ dat, která rozšiřuje metody rozšíření, je nutné a nemůže být volitelné.Z tohoto důvodu Optional parametry a ParamArray parametry nemohou být první parametr v seznamu parametrů.

Rozšíření metody nejsou považovány za v pozdní vazbu.V následujícím příkladu příkazu anObject.PrintMe() zvýší MissingMemberException výjimku, stejné výjimky by naleznete, pokud druhý PrintMe rozšíření definice metody byly odstraněny.

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

Doporučené postupy

Rozšíření metody poskytují pohodlný a účinný způsob rozšíření existujícího typu.Chcete-li úspěšně použít, existují však některé body zvážit.Tyto úvahy platí hlavně pro autory knihoven tříd, ale mohou ovlivnit všechny aplikace používající rozšíření metody.

Většina obecně jsou zranitelnější než metody rozšíření typů, které můžete přidat rozšíření metody, které přidáte do seznamu typů, které nevlastníte.Situace může nastat několik tříd, které nevlastníte, které mohou narušit vaše rozšíření metody.

  • Pokud člen přístupné instance obsahující podpis, který je kompatibilní s argumenty v příkazu volání s bez zužujícího převodu z argument pro parametr, metoda instance se použije přednostně k jakýkoli způsob rozšíření.Proto pokud metody příslušné instance třídy někdy přidán, může být existujícího člena rozšíření, které spoléhají na nepřístupná.

  • Autor rozšíření metody nelze zabránit zápisu konfliktní rozšíření metody, které mohou původní přípony mají přednost před jinými programátory.

  • Můžete zvýšit odolnost uvedení rozšíření metody v jejich vlastním oboru názvů.Spotřebitelé knihovny můžete zahrnout oboru názvů nebo vyloučíte nebo vybrat mezi obory názvů, odděleně od ostatních knihovny.

  • Může být bezpečnější než je rozšíření třídy, zvláště pokud nemá vlastní třídy nebo rozhraní rozšiřovat rozhraní.Změna rozhraní ovlivňuje každé třídy, která implementuje.Autor může být tedy méně pravděpodobné, že přidání nebo změna metod v rozhraní.Pokud však třída implementuje dvě rozhraní, které mají příponu metod se stejným podpisem, ani způsob rozšíření je viditelná.

  • Většina určitého typu, kterou můžete rozšířit.V hierarchii typů vyberete typ, z níž jsou odvozeny mnoho typů, jsou vrstvy možnosti zavedení metody instance nebo jiných metod rozšíření, které by mohly kolidovat s vaším.

Rozšíření metody Instance metody a vlastnosti

Podpis, který je kompatibilní s argumenty volající prohlášení po metodu instance v oboru je přednostně na jakýkoli způsob rozšíření zvolili metodu instance.Metoda instance má přednost, i když způsob rozšíření je lepší shoda.V následujícím příkladu ExampleClass obsahuje metodu instance pojmenovanou ExampleMethod , která má jeden parametr typu Integer.Rozšíření metody ExampleMethod rozšiřuje ExampleClass, a má jeden parametr typu 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

První volání ExampleMethod následující kód zavolá metodu rozšíření, protože arg1 je Long a je kompatibilní pouze s Long parametr metody rozšíření.Druhé volání ExampleMethod má Integer argument, arg2, a volá metodu instance.

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

Nyní zpětné datové typy parametrů ve dvou metod:

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

Tento kód v časové Main volá metodu instance oba časy.Totiž i arg1 a arg2 mít rozšiřujícího převodu na Long, a metodu instance přednost metodě rozšíření v obou případech.

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

Proto nelze metodu rozšíření nahradit existující metody instance.Však metodu rozšíření má stejný název jako metoda instance, ale podpisy nejsou v rozporu, obě metody možný.Například pokud třída ExampleClass obsahuje metodu pojmenovanou ExampleMethod žádné argumenty, rozšíření metody se stejným názvem, která má ale různé podpisy jsou povoleny, jak je znázorněno v následujícím kódu.

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

Výstup z tohoto kódu je následující:

Extension method

Instance method

Situace je jednodušší s vlastnostmi: metodu rozšíření má stejný název jako vlastnost rozšiřuje třídu, metodu rozšíření není viditelný a nelze získat přístup.

Metoda prioritu rozšíření

Pokud dvě rozšíření metody, které mají shodné podpisy v oboru a přístupný, bude vyvolána s vyšší prioritou.Metodu rozšíření priorita je založena na mechanismu použité metody uvedou do oboru.Následující seznam zobrazuje hierarchii priority od nejvyšší po nejnižší.

  1. Rozšíření metody definované uvnitř aktuálního modulu.

  2. Rozšíření metody definovány uvnitř datové typy v aktuálním oboru názvů nebo jeden z jeho rodičů podřízené obory s vyšší prioritou než nadřazený obory názvů.

  3. Rozšíření metody definované uvnitř jakýkoli typ dovozu v aktuálním souboru.

  4. Rozšíření metody definované uvnitř žádný dovoz oboru názvů v aktuálním souboru.

  5. Rozšíření metody definované uvnitř žádný dovoz typu projektu.

  6. Rozšíření metody definované uvnitř žádný dovoz projektu obor názvů.

Pokud Priorita dvojznačnosti nevyřeší, můžete určit metodu, kterou voláte plně kvalifikovaný název.Pokud Print metoda v předchozím příkladu je definováno v modulu s názvem StringExtensions, plně kvalifikovaný název je StringExtensions.Print(example) namísto example.Print().

Viz také

Referenční dokumentace

System.Runtime.CompilerServices

Příkaz Module

Atributy (C# a Visual Basic)

ExtensionAttribute

Koncepty

Postup parametry a argumenty (Visual Basic)

Volitelné parametry (Visual Basic)

Parametr matice (Visual Basic)

Obor v jazyce Visual Basic