parámetro parameter opcional c# inheritance optional-parameters method-overriding

c# - parameter - Método Anulación y parámetros opcionales



optional parameter function c# (1)

¿Le importaría a alguien explicar cómo este código produce la siguiente producción?

using System; namespace ConsoleApplication1 { class Test { public override string ToString() { return "ToString override"; } public string ToString(string optional = "") { return String.Format("ToString with optional parameter {0}", optional); } } class Test2 { public new string ToString() { return "ToString new"; } public string ToString(string optional = "") { return String.Format("ToString with optional parameter {0}", optional); } } class Program { static void Main(string[] args) { Test one = new Test(); Test2 two = new Test2(); Console.WriteLine(one); Console.WriteLine(one.ToString()); Console.WriteLine(one.ToString("foo")); Console.WriteLine("--"); Console.WriteLine(two); Console.WriteLine(two.ToString()); Console.WriteLine(two.ToString("bar")); Console.ReadKey(); } } }

Anulación de ToString

ToString con parámetro opcional

ToString con el parámetro opcional foo

-

ConsoleApplication1.Test2

ToString nuevo

ToString con barra de parámetros opcional


De acuerdo, como hay interés general, aquí hay una versión rápida:

Console.WriteLine (uno)

Esto utilizará la WriteLine(object) , que a su vez ejecutará el método virtual object.ToString() , anulado en One - de ahí la salida de ToString override

Console.WriteLine (one.ToString ())

Esto mirará a One y verá qué métodos tienen métodos recientemente declarados , descartando sobrescrituras. Hay exactamente un método de este tipo que es aplicable: el que tiene el parámetro opcional. Para que se ejecute, usando el valor predeterminado, lo que lleva a la salida de ToString with optional parameter .

Console.WriteLine (one.ToString ("foo"))

Lo mismo de nuevo, pero esta vez el compilador no necesita usar el valor predeterminado, por ToString with optional parameter foo tanto ToString with optional parameter foo

Console.WriteLine (dos)

Nuevamente, esto llamará al método virtual object.ToString() de WriteLine(object) . El método no se ha reemplazado, por lo que se utiliza la implementación predeterminada que devuelve el nombre del tipo, lo que lleva a la salida de ConsoleApplication1.Test2 .

Console.WriteLine (two.ToString ())

El compilador examina todo el método declarado en Two que no anula los métodos virtuales. En este caso, hay dos métodos: el sin parámetros y el que tiene el parámetro opcional. El parámetro se incluye porque es nuevo en lugar de anular un método de clase base.

El método sin parámetros se considera un candidato "mejor" porque el compilador prefiere llamar a un método que no necesita rellenar ningún parámetro opcional. Por lo tanto, el resultado es ToString new

Console.WriteLine (two.ToString ("barra"))

De nuevo, el compilador observa todo el método declarado en Two que no anula los métodos virtuales. En este caso, hay dos métodos de este tipo, pero el método sin parámetros no es aplicable, dejando solo el que tiene el parámetro opcional. El compilador no necesita usar aquí el valor predeterminado del parámetro opcional, ya que tiene un argumento de todos modos ... por lo que la salida es ToString with optional parameter bar

Para obtener más información al respecto, lea la especificación del lenguaje C #, o para una casa a mitad de camino, consulte mi artículo sobre sobrecarga .