MulticastDelegate Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Reprezentuje delegata multiemisji; oznacza to, delegat, który może mieć więcej niż jeden element na liście wywołań.
public ref class MulticastDelegate abstract : Delegate
public abstract class MulticastDelegate : Delegate
[System.Serializable]
public abstract class MulticastDelegate : Delegate
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class MulticastDelegate : Delegate
type MulticastDelegate = class
inherit Delegate
[<System.Serializable>]
type MulticastDelegate = class
inherit Delegate
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type MulticastDelegate = class
inherit Delegate
Public MustInherit Class MulticastDelegate
Inherits Delegate
- Dziedziczenie
- Atrybuty
Przykłady
W poniższym przykładzie zdefiniowano klasę StringContainer
, która zawiera kolekcję ciągów. Jednym z jego elementów członkowskich jest delegat CheckAndDisplayDelegate
, który służy do wyświetlania ciągów przechowywanych w obiekcie StringContainer
spełniającym określone kryteria. Delegat przyjmuje jeden ciąg jako parametr i zwraca void
(lub w Visual Basic jest to procedura Sub
). Zawiera również metodę DisplayAllQualified
, która ma jeden parametr, CheckAndDisplayDelegate
delegata. Dzięki temu metoda może być wywoływana i wyświetlać zestaw ciągów, które są filtrowane na podstawie metod, które zawiera delegat.
W przykładzie zdefiniowano również klasę narzędziową StringExtensions
, która ma dwie metody:
ConStart
, który wyświetla ciągi rozpoczynające się od spółgłoski.VowelStart
, który wyświetla ciągi rozpoczynające się od samogłoski.
Należy pamiętać, że obie metody zawierają jeden parametr ciągu i zwracają void
. Innymi słowy, obie metody można przypisać do delegata CheckAndDisplayDelegate
.
Metoda Test.Main
to punkt wejścia aplikacji. Tworzy wystąpienie obiektu StringContainer
, wypełnia go ciągami i tworzy dwa CheckAndDisplayDelegate
delegatów, conStart
i vowelStart
, które wywołują jedną metodę. Następnie wywołuje metodę Delegate.Combine w celu utworzenia delegata multipleDelegates
, który początkowo zawiera delegatów ConStart
i VowelStart
. Należy pamiętać, że po wywołaniu delegata multipleDelegates
zostaną wyświetlone wszystkie ciągi w kolekcji w ich oryginalnej kolejności. Jest to spowodowane tym, że każda litera jest przekazywana oddzielnie do każdego delegata, a każda litera spełnia kryteria filtrowania tylko jednego z dwóch delegatów. Na koniec po wywołaniach Delegate.Remove i Delegate.CombinemultipleDelegates
zawiera dwa delegaty conStart
. Po wywołaniu każdy ciąg w obiekcie StringContainer
jest wyświetlany dwa razy.
using namespace System;
using namespace System::Collections::Generic;
ref class StringContainer
{
private:
// A generic list object that holds the strings.
List<String^>^ container = gcnew List<String^>;
public:
// Define a delegate to handle string display.
delegate void CheckAndDisplayDelegate(String^ str);
// A method that adds more strings to the collection.
void AddString(String^ str)
{
container->Add(str);
}
// Iterate through the strings and invoke the method(s) that the delegate points to.
void DisplayAllQualified(CheckAndDisplayDelegate^ displayDelegate)
{
for each (String^ str in container)
displayDelegate(str);
// System::Collections::IEnumerator^ myEnum = container->GetEnumerator();
// while ( myEnum->MoveNext() )
// {
// String^ str = safe_cast<String^>(myEnum->Current);
// displayDelegate(str);
// }
}
};
//end of class StringContainer
// This class contains a few sample methods
ref class StringFuncs
{
public:
// This method prints a String* that it is passed if the String* starts with a vowel
static void ConStart(String^ str)
{
if ( !(str[ 0 ] == 'a' || str[ 0 ] == 'e' || str[ 0 ] == 'i' || str[ 0 ] == 'o' || str[ 0 ] == 'u') )
Console::WriteLine( str );
}
// This method prints a String* that it is passed if the String* starts with a consonant
static void VowelStart( String^ str )
{
if ( (str[ 0 ] == 'a' || str[ 0 ] == 'e' || str[ 0 ] == 'i' || str[ 0 ] == 'o' || str[ 0 ] == 'u') )
Console::WriteLine( str );
}
};
// This function demonstrates using Delegates, including using the Remove and
// Combine methods to create and modify delegate combinations.
int main()
{
// Declare the StringContainer class and add some strings
StringContainer^ container = gcnew StringContainer;
container->AddString( "This" );
container->AddString( "is" );
container->AddString( "a" );
container->AddString( "multicast" );
container->AddString( "delegate" );
container->AddString( "example" );
// RETURN HERE.
// Create two delegates individually using different methods
StringContainer::CheckAndDisplayDelegate^ conStart = gcnew StringContainer::CheckAndDisplayDelegate( StringFuncs::ConStart );
StringContainer::CheckAndDisplayDelegate^ vowelStart = gcnew StringContainer::CheckAndDisplayDelegate( StringFuncs::VowelStart );
// Get the list of all delegates assigned to this MulticastDelegate instance.
array<Delegate^>^ delegateList = conStart->GetInvocationList();
Console::WriteLine("conStart contains {0} delegate(s).", delegateList->Length);
delegateList = vowelStart->GetInvocationList();
Console::WriteLine("vowelStart contains {0} delegate(s).\n", delegateList->Length );
// Determine whether the delegates are System::Multicast delegates
if ( dynamic_cast<System::MulticastDelegate^>(conStart) && dynamic_cast<System::MulticastDelegate^>(vowelStart) )
{
Console::WriteLine("conStart and vowelStart are derived from MulticastDelegate.\n");
}
// Execute the two delegates.
Console::WriteLine("Executing the conStart delegate:" );
container->DisplayAllQualified(conStart);
Console::WriteLine();
Console::WriteLine("Executing the vowelStart delegate:" );
container->DisplayAllQualified(vowelStart);
// Create a new MulticastDelegate and call Combine to add two delegates.
StringContainer::CheckAndDisplayDelegate^ multipleDelegates =
dynamic_cast<StringContainer::CheckAndDisplayDelegate^>(Delegate::Combine(conStart, vowelStart));
// How many delegates does multipleDelegates contain?
delegateList = multipleDelegates->GetInvocationList();
Console::WriteLine("\nmultipleDelegates contains {0} delegates.\n",
delegateList->Length );
// // Pass this multicast delegate to DisplayAllQualified.
Console::WriteLine("Executing the multipleDelegate delegate.");
container->DisplayAllQualified(multipleDelegates);
// Call remove and combine to change the contained delegates.
multipleDelegates = dynamic_cast<StringContainer::CheckAndDisplayDelegate^>
(Delegate::Remove(multipleDelegates, vowelStart));
multipleDelegates = dynamic_cast<StringContainer::CheckAndDisplayDelegate^>
(Delegate::Combine(multipleDelegates, conStart));
// Pass multipleDelegates to DisplayAllQualified again.
Console::WriteLine("\nExecuting the multipleDelegate delegate with two conStart delegates:");
container->DisplayAllQualified(multipleDelegates);
}
// The example displays the following output:
// conStart contains 1 delegate(s).
// vowelStart contains 1 delegate(s).
//
// conStart and vowelStart are derived from MulticastDelegate.
//
// Executing the conStart delegate:
// This
// multicast
// delegate
//
// Executing the vowelStart delegate:
// is
// a
// example
//
//
// multipleDelegates contains 2 delegates.
//
// Executing the multipleDelegate delegate.
// This
// is
// a
// multicast
// delegate
// example
//
// Executing the multipleDelegate delegate with two conStart delegates:
// This
// This
// multicast
// multicast
// delegate
// delegate
using System;
using System.Collections.Generic;
class StringContainer
{
// Define a delegate to handle string display.
public delegate void CheckAndDisplayDelegate(string str);
// A generic list object that holds the strings.
private List<String> container = new List<String>();
// A method that adds strings to the collection.
public void AddString(string str)
{
container.Add(str);
}
// Iterate through the strings and invoke the method(s) that the delegate points to.
public void DisplayAllQualified(CheckAndDisplayDelegate displayDelegate)
{
foreach (var str in container) {
displayDelegate(str);
}
}
}
// This class defines some methods to display strings.
class StringExtensions
{
// Display a string if it starts with a consonant.
public static void ConStart(string str)
{
if (!(str[0]=='a'||str[0]=='e'||str[0]=='i'||str[0]=='o'||str[0]=='u'))
Console.WriteLine(str);
}
// Display a string if it starts with a vowel.
public static void VowelStart(string str)
{
if ((str[0]=='a'||str[0]=='e'||str[0]=='i'||str[0]=='o'||str[0]=='u'))
Console.WriteLine(str);
}
}
// Demonstrate the use of delegates, including the Remove and
// Combine methods to create and modify delegate combinations.
class Test
{
static public void Main()
{
// Declare the StringContainer class and add some strings
StringContainer container = new StringContainer();
container.AddString("This");
container.AddString("is");
container.AddString("a");
container.AddString("multicast");
container.AddString("delegate");
container.AddString("example");
// Create two delegates individually using different methods.
StringContainer.CheckAndDisplayDelegate conStart = StringExtensions.ConStart;
StringContainer.CheckAndDisplayDelegate vowelStart = StringExtensions.VowelStart;
// Get the list of all delegates assigned to this MulticastDelegate instance.
Delegate[] delegateList = conStart.GetInvocationList();
Console.WriteLine("conStart contains {0} delegate(s).", delegateList.Length);
delegateList = vowelStart.GetInvocationList();
Console.WriteLine("vowelStart contains {0} delegate(s).\n", delegateList.Length);
// Determine whether the delegates are System.Multicast delegates.
if (conStart is System.MulticastDelegate && vowelStart is System.MulticastDelegate)
Console.WriteLine("conStart and vowelStart are derived from MulticastDelegate.\n");
// Execute the two delegates.
Console.WriteLine("Executing the conStart delegate:");
container.DisplayAllQualified(conStart);
Console.WriteLine();
Console.WriteLine("Executing the vowelStart delegate:");
container.DisplayAllQualified(vowelStart);
Console.WriteLine();
// Create a new MulticastDelegate and call Combine to add two delegates.
StringContainer.CheckAndDisplayDelegate multipleDelegates =
(StringContainer.CheckAndDisplayDelegate) Delegate.Combine(conStart, vowelStart);
// How many delegates does multipleDelegates contain?
delegateList = multipleDelegates.GetInvocationList();
Console.WriteLine("\nmultipleDelegates contains {0} delegates.\n",
delegateList.Length);
// Pass this multicast delegate to DisplayAllQualified.
Console.WriteLine("Executing the multipleDelegate delegate.");
container.DisplayAllQualified(multipleDelegates);
// Call remove and combine to change the contained delegates.
multipleDelegates = (StringContainer.CheckAndDisplayDelegate) Delegate.Remove(multipleDelegates, vowelStart);
multipleDelegates = (StringContainer.CheckAndDisplayDelegate) Delegate.Combine(multipleDelegates, conStart);
// Pass multipleDelegates to DisplayAllQualified again.
Console.WriteLine("\nExecuting the multipleDelegate delegate with two conStart delegates:");
container.DisplayAllQualified(multipleDelegates);
}
}
// The example displays the following output:
// conStart contains 1 delegate(s).
// vowelStart contains 1 delegate(s).
//
// conStart and vowelStart are derived from MulticastDelegate.
//
// Executing the conStart delegate:
// This
// multicast
// delegate
//
// Executing the vowelStart delegate:
// is
// a
// example
//
//
// multipleDelegates contains 2 delegates.
//
// Executing the multipleDelegate delegate.
// This
// is
// a
// multicast
// delegate
// example
//
// Executing the multipleDelegate delegate with two conStart delegates:
// This
// This
// multicast
// multicast
// delegate
// delegate
module Test
open System
// Define a delegate to handle string display.
type CheckAndDisplayDelegate = delegate of string -> unit
type StringContainer() =
// A generic ResizeArray object that holds the strings.
let container = ResizeArray()
// A method that adds strings to the collection.
member _.AddString(str) =
container.Add str
// Iterate through the strings and invoke the method(s) that the delegate points to.
member _.DisplayAllQualified(displayDelegate: CheckAndDisplayDelegate) =
for str in container do
displayDelegate.Invoke str
// This module defines some functions to display strings.
module StringExtensions =
// Display a string if it starts with a consonant.
let conStart (str: string) =
match str[0] with
| 'a' | 'e' | 'i' | 'o' | 'u' -> ()
| _ -> printfn $"{str}"
// Display a string if it starts with a vowel.
let vowelStart (str: string) =
match str[0] with
| 'a' | 'e' | 'i' | 'o' | 'u' -> printfn $"{str}"
| _ -> ()
// Demonstrate the use of delegates, including the Remove and
// Combine methods to create and modify delegate combinations.
[<EntryPoint>]
let main _ =
// Declare the StringContainer class and add some strings
let container = StringContainer()
container.AddString "This"
container.AddString "is"
container.AddString "a"
container.AddString "multicast"
container.AddString "delegate"
container.AddString "example"
// Create two delegates individually using different methods.
let conStart = CheckAndDisplayDelegate StringExtensions.conStart
let vowelStart = CheckAndDisplayDelegate StringExtensions.vowelStart
// Get the list of all delegates assigned to this MulticastDelegate instance.
let delegateList = conStart.GetInvocationList()
printfn $"conStart contains {delegateList.Length} delegate(s)."
let delegateList = vowelStart.GetInvocationList()
printfn $"vowelStart contains {delegateList.Length} delegate(s).\n"
// Determine whether the delegates are System.Multicast delegates.
if box conStart :? System.MulticastDelegate && box vowelStart :? System.MulticastDelegate then
printfn "conStart and vowelStart are derived from MulticastDelegate.\n"
// Execute the two delegates.
printfn "Executing the conStart delegate:"
container.DisplayAllQualified conStart
printfn "\nExecuting the vowelStart delegate:"
container.DisplayAllQualified vowelStart
printfn ""
// Create a new MulticastDelegate and call Combine to add two delegates.
let multipleDelegates =
Delegate.Combine(conStart, vowelStart) :?> CheckAndDisplayDelegate
// How many delegates does multipleDelegates contain?
let delegateList = multipleDelegates.GetInvocationList()
printfn $"\nmultipleDelegates contains {delegateList.Length} delegates.\n"
// Pass this multicast delegate to DisplayAllQualified.
printfn "Executing the multipleDelegate delegate."
container.DisplayAllQualified multipleDelegates
// Call remove and combine to change the contained delegates.
let multipleDelegates = Delegate.Remove(multipleDelegates, vowelStart) :?> CheckAndDisplayDelegate
let multipleDelegates = Delegate.Combine(multipleDelegates, conStart) :?> CheckAndDisplayDelegate
// Pass multipleDelegates to DisplayAllQualified again.
printfn "\nExecuting the multipleDelegate delegate with two conStart delegates:"
printfn $"{multipleDelegates}"
0
// The example displays the following output:
// conStart contains 1 delegate(s).
// vowelStart contains 1 delegate(s).
//
// conStart and vowelStart are derived from MulticastDelegate.
//
// Executing the conStart delegate:
// This
// multicast
// delegate
//
// Executing the vowelStart delegate:
// is
// a
// example
//
//
// multipleDelegates contains 2 delegates.
//
// Executing the multipleDelegate delegate.
// This
// is
// a
// multicast
// delegate
// example
//
// Executing the multipleDelegate delegate with two conStart delegates:
// This
// This
// multicast
// multicast
// delegate
// delegate
Imports System.Collections.Generic
Class StringContainer
' Define a delegate to handle string display.
Delegate Sub CheckAndPrintDelegate(ByVal str As String)
' A generic list object that holds the strings.
Private container As New List(Of String)()
' A method that adds strings to the collection.
Public Sub AddString(ByVal s As String)
container.Add(s)
End Sub
' Iterate through the strings and invoke the method(s) that the delegate points to.
Public Sub DisplayAllQualified(ByVal displayDelegate As CheckAndPrintDelegate)
For Each s In container
displayDelegate(s)
Next
End Sub
End Class
' This class defines some methods to display strings.
Class StringExtensions
' Display a string if it starts with a consonant.
Public Shared Sub ConStart(ByVal str As String)
If Not (str.Chars(0) = "a"c Or str.Chars(0) = "e"c Or str.Chars(0) = "i"c _
Or str.Chars(0) = "o"c Or str.Chars(0) = "u"c) Then
Console.WriteLine(str)
End If
End Sub
' Display a string if it starts with a vowel.
Public Shared Sub VowelStart(ByVal str As String)
If (str.Chars(0) = "a"c Or str.Chars(0) = "e"c Or str.Chars(0) = "i"c _
Or str.Chars(0) = "o"c Or str.Chars(0) = "u"c) Then
Console.WriteLine(str)
End If
End Sub
End Class
' Demonstrate the use of delegates, including the Remove and
' Combine methods to create and modify delegate combinations.
Class Test
Public Shared Sub Main()
' Declare the StringContainer class and add some strings
Dim container As New StringContainer()
container.AddString("this")
container.AddString("is")
container.AddString("a")
container.AddString("multicast")
container.AddString("delegate")
container.AddString("example")
' Create two delegates individually using different methods.
Dim constart As StringContainer.CheckAndPrintDelegate = AddressOf StringExtensions.ConStart
Dim vowelStart As StringContainer.CheckAndPrintDelegate = AddressOf StringExtensions.VowelStart
' Get the list of all delegates assigned to this MulticastDelegate instance.
Dim delegateList() As [Delegate] = conStart.GetInvocationList()
Console.WriteLine("conStart contains {0} delegate(s).", delegateList.Length)
delegateList = vowelStart.GetInvocationList()
Console.WriteLine("vowelStart contains {0} delegate(s).", delegateList.Length)
Console.WriteLine()
' Determine whether the delegates are System.Multicast delegates
If TypeOf conStart Is System.MulticastDelegate And TypeOf vowelStart Is System.MulticastDelegate Then
Console.WriteLine("conStart and vowelStart are derived from MulticastDelegate.")
Console.WriteLine()
End If
' Run the two single delegates one after the other.
Console.WriteLine("Executing the conStart delegate:")
container.DisplayAllQualified(conStart)
Console.WriteLine("Executing the vowelStart delegate:")
container.DisplayAllQualified(vowelStart)
Console.WriteLine()
' Create a new MulticastDelegate and call Combine to add two delegates.
Dim multipleDelegates As StringContainer.CheckAndPrintDelegate =
CType([Delegate].Combine(conStart, vowelStart),
StringContainer.CheckAndPrintDelegate)
' How many delegates does multipleDelegates contain?
delegateList = multipleDelegates.GetInvocationList()
Console.WriteLine("{1}multipleDelegates contains {0} delegates.{1}",
delegateList.Length, vbCrLf)
' Pass this mulitcast delegate to DisplayAllQualified.
Console.WriteLine("Executing the multipleDelegate delegate.")
container.DisplayAllQualified(multipleDelegates)
' Call remove and combine to change the contained delegates.
multipleDelegates = CType([Delegate].Remove(multipleDelegates, vowelStart),
StringContainer.CheckAndPrintDelegate)
multipleDelegates = CType([Delegate].Combine(multipleDelegates, conStart),
StringContainer.CheckAndPrintDelegate)
' Pass multipleDelegates to DisplayAllQualified again.
Console.WriteLine()
Console.WriteLine("Executing the multipleDelegate delegate with two conStart delegates:")
container.DisplayAllQualified(multipleDelegates)
End Sub
End Class
' The example displays the following output:
' conStart contains 1 delegate(s).
' vowelStart contains 1 delegate(s).
'
' conStart and vowelStart are derived from MulticastDelegate.
'
' Executing the conStart delegate:
' This
' multicast
' delegate
'
' Executing the vowelStart delegate:
' is
' a
' example
'
'
' multipleDelegates contains 2 delegates.
'
' Executing the multipleDelegate delegate.
' This
' is
' a
' multicast
' delegate
' example
'
' Executing the multipleDelegate delegate with two conStart delegates:
' This
' This
' multicast
' multicast
' delegate
' delegate
Uwagi
MulticastDelegate jest klasą specjalną. Kompilatory i inne narzędzia mogą pochodzić z tej klasy, ale nie można ich jawnie utworzyć. To samo dotyczy klasy Delegate.
Oprócz metod, które delegować typy dziedziczą po MulticastDelegate, środowisko uruchomieniowe języka wspólnego udostępnia dwie specjalne metody: BeginInvoke
i EndInvoke
. Aby uzyskać więcej informacji na temat tych metod, zobacz Wywoływanie metod synchronicznych asynchronicznie.
MulticastDelegate ma połączoną listę delegatów, nazywaną listą wywołań, składającą się z co najmniej jednego elementu. Po wywołaniu delegata multiemisji delegaty na liście wywołań są wywoływane synchronicznie w kolejności ich wyświetlania. Jeśli podczas wykonywania listy wystąpi błąd, zgłaszany jest wyjątek.
Konstruktory
MulticastDelegate(Object, String) |
Inicjuje nowe wystąpienie klasy MulticastDelegate. |
MulticastDelegate(Type, String) |
Inicjuje nowe wystąpienie klasy MulticastDelegate. |
Właściwości
HasSingleTarget |
Pobiera wartość wskazującą, czy Delegate ma jeden element docelowy wywołania. (Odziedziczone po Delegate) |
Method |
Pobiera metodę reprezentowaną przez delegata. (Odziedziczone po Delegate) |
Target |
Pobiera wystąpienie klasy, na którym bieżący delegat wywołuje metodę wystąpienia. (Odziedziczone po Delegate) |
Metody
Clone() |
Tworzy płytkią kopię delegata. (Odziedziczone po Delegate) |
CombineImpl(Delegate) |
Łączy ten Delegate z określonym Delegate w celu utworzenia nowego delegata. |
CombineImpl(Delegate) |
Łączy listy wywołań określonego delegata multiemisji (można połączyć) i bieżącego delegata multiemisji (można połączyć). (Odziedziczone po Delegate) |
DynamicInvoke(Object[]) |
Dynamicznie wywołuje (późną granicę) metodę reprezentowaną przez bieżącego delegata. (Odziedziczone po Delegate) |
DynamicInvokeImpl(Object[]) |
Przetwarza pełną listę wywołań. |
DynamicInvokeImpl(Object[]) |
Dynamicznie wywołuje (późną granicę) metodę reprezentowaną przez bieżącego delegata. (Odziedziczone po Delegate) |
Equals(Object) |
Określa, czy ten delegat multiemisji i określony obiekt są równe. |
GetHashCode() |
Zwraca kod skrótu dla tego wystąpienia. |
GetInvocationList() |
Zwraca listę wywołań tego delegata multiemisji w kolejności wywołania. |
GetMethodImpl() |
Zwraca metodę reprezentowaną przez bieżącą MulticastDelegate. |
GetMethodImpl() |
Pobiera metodę reprezentowaną przez bieżącego delegata. (Odziedziczone po Delegate) |
GetObjectData(SerializationInfo, StreamingContext) |
Przestarzałe.
Wypełnia obiekt SerializationInfo wszystkimi danymi potrzebnymi do serializacji tego wystąpienia. |
GetObjectData(SerializationInfo, StreamingContext) |
Przestarzałe.
Nieobsługiwane. (Odziedziczone po Delegate) |
GetType() |
Pobiera Type bieżącego wystąpienia. (Odziedziczone po Object) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Object. (Odziedziczone po Object) |
RemoveImpl(Delegate) |
Usuwa element z listy wywołań tego MulticastDelegate, który jest równy określonemu delegatowi. |
RemoveImpl(Delegate) |
Usuwa listę wywołań delegata z listy wywołań innego delegata. (Odziedziczone po Delegate) |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |
Operatory
Equality(MulticastDelegate, MulticastDelegate) |
Określa, czy dwa obiekty MulticastDelegate są równe. |
Inequality(MulticastDelegate, MulticastDelegate) |
Określa, czy dwa obiekty MulticastDelegate nie są równe. |
Metody rozszerzania
GetMethodInfo(Delegate) |
Pobiera obiekt reprezentujący metodę reprezentowaną przez określonego delegata. |