Tengo experiencia en C ++ y entiendo completamente y estoy de acuerdo con las respuestas a esta pregunta: ¿Por qué está "usando el espacio de nombres std;" considerado una mala práctica?
Así que me sorprende que, teniendo algo de experiencia con C # ahora, veo exactamente lo contrario:
using Some.Namespace;
literalmente se usa en todas partes. Cada vez que comienza a usar un tipo, primero agrega una directiva de uso para su espacio de nombres (si aún no está allí). No recuerdo haber visto un .cs
archivo que no comenzó using System; using System.Collections.Generic; using X.Y.Z; etc...
. De hecho, si agrega un nuevo archivo a través del asistente de Visual Studio, automáticamente agrega algunos usando directivas allí, aunque puede que no los necesite en absoluto. Entonces, mientras que en la comunidad de C ++ te linchan básicamente, C # incluso anima a hacer esto. Al menos así es como me parece.
Ahora, entiendo que usar directivas en C # y C ++ no es exactamente lo mismo. Además, entiendo que una de las cosas más desagradables que puede hacer using namespace
en C ++, es decir, ponerlo en un archivo de encabezado, no tiene una contraparte equivalente desagradable en C # debido a la falta de un concepto de archivos de encabezado y #include
.
Sin embargo, a pesar de sus diferencias, el uso de directivas en C # y C ++ tiene el mismo propósito, que solo tiene que escribir SomeType
todo el tiempo, en lugar de hacerlo por mucho más tiempo Some.Namespace.SomeType
(en C ++ con en ::
lugar de .
). Y con este mismo propósito, también el peligro parece ser el mismo para mí: nombrar colisiones.
En el mejor de los casos, esto da como resultado un error de compilación, por lo que "solo" tiene que solucionarlo. En el peor de los casos, aún se compila y el código en silencio hace cosas diferentes de lo que pretendía que hiciera. Entonces mi pregunta es: ¿por qué (aparentemente) están usando directivas consideradas tan desigualmente malas en C # y C ++?
Algunas ideas de una respuesta que tengo (ninguna de estas realmente me satisface):
Los espacios de nombres tienden a ser mucho más largos y mucho más anidados en C # que en C ++ (
std
vs.System.Collection.Generic
). Entonces, hay más ganas y más ganancias al eliminar el ruido de este modo. Pero incluso si esto es cierto, este argumento solo se aplica cuando miramos los espacios de nombres estándar. Los personalizados pueden tener cualquier nombre corto que desee, tanto en C # como en C ++.Los espacios de nombres parecen ser mucho más "granulares finos" en C # que en C ++. A modo de ejemplo, en C ++ toda la biblioteca estándar está contenida en
std
(además de algunos pequeños espacios de nombres anidados gustaríachrono
), mientras que en C # que tieneSystem.IO
,System.Threading
,System.Text
etc Por lo tanto, el riesgo de que las colisiones de nombres es menor. Sin embargo, esto es solo un presentimiento. En realidad no conté cuántos nombres "importas" conusing namespace std
yusing System
. Y nuevamente, incluso si esto es cierto, este argumento se aplica solo cuando se observan los espacios de nombres estándar. Los suyos pueden diseñarse tan bien como desee, tanto en C # como en C ++.
¿Hay más argumentos? Estoy especialmente interesado en hechos concretos reales (si los hay) y no tanto en las opiniones.
Ext(this T t, long l)
que se llama vía t.Ext(0)
. Si luego agrega otro espacio de nombres que contiene un método de extensión Ext(this T t, int i)
, se llamará a ese. Pero no soy un experto en C # (todavía).