En C#, ¿cuál es la diferencia entre A::B
y A.B
? La única diferencia que he notado es que solo ::
se puede usar con global
, pero aparte de eso, ¿cuál es la diferencia? ¿Por qué ambos existen?Operador de resolución de alcance :: versus operador de acceso de miembro. en C#
Respuesta
con :: puede hacer cosas como ...
extern alias X;
extern alias Y;
class Test
{
X::N.A a;
X::N.B b1;
Y::N.B b2;
Y::N.C c;
}
y hay momentos en que. es ambiguo así que :: es necesario. aquí está el ejemplo del lenguaje C# spec
namespace N
{
public class A {}
public class B {}
}
namespace N
{
using A = System.IO;
class X
{
A.Stream s1; // Error, A is ambiguous
A::Stream s2; // Ok
}
}
el operador :: sólo funciona con los alias global es un sistema especial previsto alias.
así que ... esto funciona:
using Foo = System.ComponentModel;
public MyClass {
private Foo::SomeClassFromSystemComponentModel X;
}
pero no esto:
public MyClass {
private System.ComponentModel::SomeClassFromSystemComponentModel X;
}
Esto le permite escapar del infierno de espacios de nombres de sub que puede ocurrir cuando se está integrando con una biblioteca donde tienen:
namespace MyAwesomeProduct.System
{
}
Y en que tienen código
using MyAwesomeProduct;
global :: le permite encontrar el sistema real.
Hm ... está explicando por qué 'global ::' es útil, pero no exactamente la diferencia entre '::' y '.' ... – Mehrdad
:: * solamente * funciona con alas, de esa manera si alguien declara un espacio de nombre o un espacio de subnombre posterior que tenga el mismo espacio de nombres que alias, su código estará bien. Es el operador de salir de la cárcel para la resolución del espacio de nombres secundario si lo desea. Usted tiene control de alaises en su archivo, pero otras personas controlan los espacios de nombres de las bibliotecas que usa. :: le da control cuando otros espacios de nombres se las arreglan para cambiar el significado de su código. – Neil
+1 Genial, gracias. – Mehrdad
- 1. Operador de resolución de alcance
- 2. operador de resolución de alcance sin ámbito
- 3. C# operador de alcance
- 4. cuál es la diferencia entre operador de punto y operador de resolución de alcance
- 5. Operador sobrecarga == versus Igual()
- 6. Espacios de nombres y resolución de operador
- 7. Operador de resolución de alcance en enumeraciones ¿una extensión específica del compilador?
- 8. plantillas miembro de función y operador de sobrecarga() en C++
- 9. diferencia entre operador global y operador miembro
- 10. Acceso C++/CLI sobrecargado [] operador en C#
- 11. C# Resolución de alcance predeterminada
- 12. operador de flecha vs. operador de punto
- 13. C++ sobrecarga operador de asignación
- 14. Alcance variable de miembro estático de C++
- 15. Operador de asignación de sobrecarga en C++
- 16. operador de coma C
- 17. Operador sobrecarga = como No miembro
- 18. operador de incremento de C++
- 19. operador?: (El "operador de Elvis) en PHP
- 20. Error de C# en Operador de módulo%
- 21. C++ [&] operador
- 22. C++ múltiples sobrecargas de operador para el mismo operador
- 23. atomicidad de C# coalescente operador
- 24. C++ shared_ptr operador de igualdad
- 25. ¿Cuál es la diferencia entre '->' (operador de flecha) y '.' (operador de punto) en Objective-C?
- 26. operador <en C++
- 27. ¿Cómo sobrecargar el operador de indirección? (C++)
- 28. Operador = sobrecarga en C++
- 29. Operador exponencial en C++
- 30. ? (anulable) operador en C#
¿Estás diciendo que '' :: sólo funciona con espacios de nombres, mientras que '.' trabaja con todo excepto' global'? – Mehrdad
sí, el hecho de que :: es solo para espacios de nombres significa que puede usarlo para resolver la ambigüedad que no puede ser resuelto por. –