parametros parameter opcionales make c# c#-4.0 optional-parameters

opcionales - optional parameter c# string



No se puede usar String.Empty como valor predeterminado para un parámetro opcional (9)

A partir del compilador C # 2.0, hay muy poco sentido para String.Empty todos modos, y de hecho en muchos casos es una pesimismo, ya que el compilador puede alinear algunas referencias a "" pero no puede hacer lo mismo con String.Empty .

En C # 1.1 fue útil evitar la creación de muchos objetos independientes que contengan la cadena vacía, pero esos días ya no existen. "" funciona bien.

Estoy leyendo Effective C # por Bill Wagner. En el Elemento 14 - Minimizar la lógica de inicialización duplicada , muestra el siguiente ejemplo del uso de la nueva característica de parámetros opcionales en un constructor:

public MyClass(int initialCount = 0, string name = "")

Tenga en cuenta que usó "" lugar de string.Empty . string.Empty .
Él comenta:

Observará [en un ejemplo anterior] que el segundo constructor especificó "" para el valor predeterminado en el parámetro de nombre , en lugar de la string.Empty más habitual. string.Empty . Eso es porque string.Empty no es una constante en tiempo de compilación. Es una propiedad estática definida en la clase de cadena. Como no es una constante de compilación, no puede usarla para el valor predeterminado de un parámetro.

Si no podemos usar la string.Empty estático en todas las situaciones, ¿entonces eso no string.Empty el string.Empty la string.Empty ? Pensé que lo usaríamos para asegurarnos de tener un medio independiente del sistema para referirnos a la cadena vacía. ¿Está mal mi entendimiento? Gracias.

ACTUALIZAR
Solo un comentario de seguimiento. De acuerdo con MSDN:

Cada parámetro opcional tiene un valor predeterminado como parte de su definición. Si no se envía ningún argumento para ese parámetro, se utiliza el valor predeterminado. Los valores predeterminados deben ser constantes.

Entonces no podremos usar System.Environment.NewLine tampoco, o usar objetos recién instanciados como valores predeterminados. No he usado VS2010 todavía, ¡y esto es decepcionante!


Como un FYI, parece que se impone la misma restricción a los valores pasados ​​a los constructores de atributos; deben ser constantes. Dado que string.empty se define como:

public static readonly string Empty

en lugar de una constante real, no puede ser utilizada.


Creo que la idea detrás de string.Empty es que mejora la legibilidad. No es como una nueva línea donde hay alguna diferencia entre cómo se representa en diferentes plataformas. Es una lástima que no se pueda usar en un parámetro predeterminado. Sin embargo, no causará ningún problema si realiza un puerto entre Windows y algo como Mono en Linux.


De la pregunta original:

Pensé que lo usaríamos para asegurarnos de tener un medio independiente del sistema para referirnos a la cadena vacía.

¿De qué manera puede variar la cadena vacía de un sistema a otro? ¡Siempre es una cadena sin caracteres! Me daría mucho miedo si alguna vez encontré una implementación donde string.Empty == "" devolvió false :) Esto no es lo mismo que algo como Environment.NewLine .

De la publicación de recompensas de Counter Terrorist:

Quiero String.Empty se puede utilizar como un parámetro predeterminado en la próxima versión de C #. :RE

Bueno, eso ciertamente no va a suceder.

Si bien personalmente me hubiera gustado también un mecanismo de incumplimiento muy diferente, la forma en que funcionan los parámetros opcionales ha estado en .NET desde el inicio, y siempre significa insertar una constante en los metadatos, de modo que el código de llamada pueda copiar esa constante en la llamada sitio si no se proporciona un argumento correspondiente.

Con string.Empty no tiene sentido, el uso de "" hará lo que quieras; ¿Es tan doloroso usar la cadena literal? (Uso el literal en todas partes, nunca uso string.Empty . string.Empty , pero ese es un argumento diferente).

Eso es lo que me sorprende de esta pregunta: la queja gira en torno a algo que en realidad no causa un problema real. Es más importante en los casos en que desee que se calcule el valor predeterminado en el momento de la ejecución, ya que en realidad podría variar. Por ejemplo, podría imaginar casos en los que desea poder llamar a un método con un parámetro DateTime y tenerlo por defecto a "la hora actual". Por el momento, la única solución vagamente elegante que conozco para eso es:

public void RecordTime(string message, DateTime? dateTime = null) { var realDateTime = dateTime ?? DateTime.UtcNow; }

... pero eso no siempre es apropiado.

En conclusión:

  • Dudo mucho que esto sea alguna vez parte de C #
  • Para string.Empty no tiene sentido de todos modos
  • Para otros valores que realmente no siempre tienen el mismo valor, realmente puede ser un dolor

No hay nada que le impida definir su propia constante para la cadena vacía si realmente desea usarla como un valor de parámetro opcional:

const string String_Empty = ""; public static void PrintString(string s = String_Empty) { Console.WriteLine(s); }

[Por fuera, una razón para preferir String.Empty over "" en general, que no se ha mencionado en las otras respuestas, es que hay varios caracteres Unicode (combinaciones de ancho cero, etc.) que son efectivamente invisibles para a simple vista Entonces, algo que se parece a "" no es necesariamente la cadena vacía, mientras que con String.Empty sabes exactamente lo que estás usando. Reconozco que esta no es una fuente común de errores, pero es posible.]


Nunca uso una cuerda. Vacío, no puedo ver el sentido. Tal vez hace que sea más fácil para las personas que son realmente nuevas en la programación, pero dudo que sea útil incluso para eso.


Quizás la mejor solución a este problema es una sobrecarga de este método, de esta manera:

public static void PrintString() { PrintString(string.Empty); }


Si realmente no te gustan los literales de cadena, puedes usar:

public static string MyFunction(string myParam= default(string))


Yo uso string.Empty puramente para la legibilidad.

Si alguien más necesita leer / cambiar mi código más tarde, sabrá que quería verificar o establecer algo en una cadena vacía. Usar solo "" veces puede causar errores y confusión porque es posible que haya olvidado poner la cadena que quería allí.

Por ejemplo:

if(someString == string.Empty) { }

vs

if(someString == "") { }

La primera declaración if parece mucho más deliberada y legible para mí. Sin embargo, debido a que esto es sólo una preferencia, realmente no veo el string.Empty de tren al tener que usar "" lugar de string.Empty . string.Empty .