c# - valid - +=operador para Delegado
summary c# visual studio (2)
Sé que el operador + = agregará un método a la lista de invocación mantenida por el objeto Base del delegado, por ejemplo
using System;
class Program
{
delegate void MyDelegate(int n);
void Foo(int n)
{
Console.WriteLine("n = {0}", n)
}
static void Main(string[] args)
{
MyDelegate d = new MyDelegate(Foo);
d += Foo; // add Foo again
d.Invoke(3); // Foo is invoked twice as Foo appears two times in invocation list
}
}
Pero cuando veo el Delegate MSDN, MulticastDelegate no puedo encontrar ninguna definición del operador + = . ¿Cómo es eso que simplemente funciona? ¿Compilador generado automáticamente por la magia?
Es lo mismo que con Int32
, String
, etc. El operador +
está definido implícitamente por el idioma.
Puede verificar el código fuente de Delegate
, MulticastDelegate
, Int32
, etc. No hay sobrecargas de operator +
allí, por eso no aparece en la documentación de MSDN.
De la especificación de lenguaje C #, sección 7.8.4:
Los operadores de adición predefinidos se enumeran a continuación.
(...)
• Combinación de delegados. Cada tipo de delegado proporciona implícitamente el siguiente operador predefinido, donde D es el tipo de delegado:
D operator +(D x, D y);
Hay una diferencia entre tipos simples y delegados. La especificación del lenguaje C # no requiere que un delegado se implemente usando System.Delegate
4.2.7 tipos de delegados
Un delegado es una estructura de datos que se refiere a uno o más métodos. Para los métodos de instancia, también se refiere a sus instancias de objeto correspondientes. El equivalente más cercano de un delegado en C o C ++ es un puntero a función, pero mientras que un puntero a función solo puede hacer referencia a funciones estáticas, un delegado puede hacer referencia tanto a métodos estáticos como a métodos de instancia. En este último caso, el delegado almacena no solo una referencia al punto de entrada del método, sino también una referencia a la instancia del objeto en el que se invoca el método. Los tipos de delegado se describen en §15.
Tenga en cuenta que no hay mención de System.Delegate
allí. Compáralo con la sección 4.1.4. Tipos simples:
C # proporciona un conjunto de tipos de estructura predefinidos denominados tipos simples. Los tipos simples se identifican mediante palabras reservadas, pero estas palabras reservadas son simplemente alias para tipos de estructuras predefinidos en el espacio de nombres del Sistema, como se describe en la tabla a continuación.
Tipo de alias de la palabra reservada
sbyte System.SByte
byte System.Byte
System.Int16 corto
ushort System.UInt16
int System.Int32
uint System.UInt32
System.Int64 largo
ulong System.UInt64
char System.Char
Sistema de flotación. Solo
doble sistema. doble
bool System.Boolean
decimales system.decimal
O Sección 4.2.4 El tipo de cadena
(...)
La cadena de palabras clave es simplemente un alias para la clase predefinida System.String.
Así que resolver el operador + para delegados a Delegate.Combine
es un detalle de implementación de compiladores de C # en el framework .NET.
No es un operador en el tipo de delegado en sí, en términos de IL; está definido en la especificación del lenguaje, pero no lo encontraría utilizando la reflexión. El compilador lo convierte en una llamada a Delegate.Combine
. La operación inversa, utilizando -
o -=
, utiliza Delegate.Remove
.
Al menos, así es como se implementa cuando C # apunta a .NET, como casi siempre lo hace. En teoría, esto es específico del entorno: la especificación del lenguaje no requiere que un compilador utilice Delegate.Combine
o Delegate.Remove
, y es posible que un entorno diferente no tenga esos métodos.
De la especificación C # 5, sección 7.8.4 (adición):
El operador binario
+
realiza una combinación de delegados cuando ambos operandos son de algún tipo de delegadoD
(Si los operandos tienen diferentes tipos de delegados, se produce un error de tiempo de enlace). Si el primer operando esnull
, el resultado de la operación es el valor del segundo operando (incluso si eso también esnull
). De lo contrario, si el segundo operando esnull
, entonces el resultado de la operación es el valor del primer operando. De lo contrario, el resultado de la operación es una nueva instancia de delegado que, cuando se invoca, invoca al primer operando y luego invoca al segundo operando. Para ejemplos de combinación de delegados, vea §7.8.5 y §15.4. ComoSystem.Delegate
no es un tipo de delegado, el operador+
no está definido para él.