examples - what are delegates used for in c#
Definición de una firma de método? (7)
¿Cuál es la definición correcta de una firma de método (o una firma de un método)?
En google, encuentro varias definiciones:
Es la combinación del nombre del método y la lista de parámetros.
¿Significa eso method signature = method name + argument list
? Entonces no veo diferencia entre " método " y " firma de método ".
Si tengo un método:
public void Foo(int x, int y) { ... }
¿Sería mi firma del método una de las siguientes, o ninguna?
- Foo
- Foo (int, int)
- Foo (int x, int y)
- Foo (34, 78)
¿Cómo se supone que debo responder si alguien me pregunta cuál es la firma del método del método?
Aquí hay una cantidad de respuestas correctas que definen la firma del método como el nombre del método, la aridad genérica, la aridad de los parámetros formales y los tipos y tipos de parámetros formales, pero no el tipo de retorno o el modificador "params".
Aunque eso es correcto, hay algunas sutilezas aquí. La forma en que el lenguaje C # define la firma del método es diferente de la forma en que el CLR define la firma del método, y esto puede llevar a algunos problemas interesantes al interoperar entre C # y otros idiomas.
Para el CLR, una firma de método consiste en el nombre del método, la aridad genérica, la aridad del parámetro formal, los tipos y tipos de parámetros formales y el tipo de retorno. Así que ahí está la primera diferencia; El CLR considera el tipo de retorno.
El CLR tampoco considera que "out" y "ref" sean de diferentes tipos de parámetros formales; C # hace.
El CLR también tiene una característica interesante llamada "modificadores de tipo requeridos y opcionales", generalmente llamados "modopts" y "modreqs". Es posible anotar un tipo en una firma de método con otro tipo que le informe sobre el tipo "principal". Por ejemplo, en C ++ estas son dos firmas diferentes:
void M(C const & x);
void M(C & x);
Ambas firmas definen un método M que toma un parámetro de tipo "referencia a C". Pero debido a que la primera es una referencia constante y la segunda no, el lenguaje C ++ considera que se trata de firmas diferentes. El CLR implementa esto al permitir que el compilador C ++ / CIL emita un modopt para un tipo especial de "esto es constante" en el tipo de parámetro formal.
No hay forma de leer o configurar un mod en C #, pero el compilador de C #, sin embargo, los conoce y los honrará de alguna manera . Por ejemplo, si tiene un método virtual público declarado en C ++ / CIL como:
void V(C const * x)
y anula que en una clase derivada escrita en C #, el compilador de C # no impondrá la constancia correcta para usted; el compilador de C # no tiene idea de lo que significa la constante modopt. Pero el compilador de C # se asegurará de que el método de anulación se emita en metadatos con el modopt en su lugar. Esto es necesario porque el CLR requiere firmas de métodos de anulación y de anulación para que coincidan; el compilador debe obedecer las reglas de CLR para la coincidencia de firmas, no las reglas de C #.
Artículo de MSDN "Métodos (Guía de programación de C #)"
dice:
Los métodos se declaran en una clase o estructura al especificar el nivel de acceso, como público o privado, modificadores opcionales, como resumen o sellado, el valor de retorno, el nombre del método y cualquier parámetro del método. Estas partes juntas son la firma del método.
Y más adelante, lo que no he visto entre otras respuestas:
" Nota
"Un tipo de devolución de un método no es parte de la firma del método para los propósitos de sobrecarga del método . Sin embargo, es parte de la firma del método cuando se determina la compatibilidad entre un delegado y el método al que apunta"
Desde MSDN:
La firma de un método consiste en el nombre del método y el tipo y tipo (valor, referencia o salida) de cada uno de sus parámetros formales, considerados en el orden de izquierda a derecha. La firma de un método específicamente no incluye el tipo de retorno, ni incluye el modificador de parámetros que se puede especificar para el parámetro más a la derecha.
La parte importante aquí es que el tipo de retorno de un método no pertenece a su firma. ¡Así que no puede sobrecargar métodos que difieren solo por el tipo de retorno!
En su ejemplo anterior, la firma del método es Foo (int x, int y). Es importante saber esto porque en los idiomas que permiten la sobrecarga de métodos (como C # y Java), el nombre del método será el mismo, pero la firma debe ser diferente.
La Sección 3.6 de la Especificación de lenguaje C # (v 4.0) proporciona la respuesta más precisa con respecto a las firmas de métodos:
La firma de un método consiste en el nombre del método, el número de parámetros de tipo y el tipo y tipo (valor, referencia o salida) de cada uno de sus parámetros formales, considerados en el orden de izquierda a derecha. Para estos fines, cualquier parámetro de tipo del método que se produce en el tipo de un parámetro formal se identifica no por su nombre, sino por su posición ordinal en la lista de argumentos de tipo del método. La firma de un método específicamente no incluye el tipo de retorno, el modificador de parámetros que se puede especificar para el parámetro más a la derecha, ni las restricciones de parámetros de tipo opcional.
La firma del método es el conjunto de atributos de un método que un compilador puede usar para identificar el método.
Los atributos son: Nombre del método, número de parámetros, tipo de parámetro y orden de los parámetros.
Ejemplo de firmas de diferentes métodos:
Foo()
Foo(int)
Foo(String)
Foo(int, string)
Foo(string, int)
Todos estos métodos son diferentes, y cuando los llamas en código, el compilador puede inferir qué método intentas ejecutar utilizando la firma del método.
No te olvides del alcance de los métodos en programación modular ...
La firma del método incluye los siguientes elementos:
- El nombre del método.
- El número de parámetros.
- Los tipos de datos y el orden de los parámetros.
Nota: El tipo de retorno no es parte de la firma.