Después de leer muchas de las respuestas a this thread, veo que muchos de los que no les gusta citan el potencial de abuso de la nueva palabra clave. Mi pregunta es, ¿qué tipo de abuso? ¿Cómo se puede abusar tanto de esto como para hacer que la gente no lo sienta con vehemencia? ¿Es solo sobre el purismo? ¿O hay una trampa real que no estoy viendo?Palabra clave dinámica C# 4: ¿por qué no?
Respuesta
Algunos lo ven como una herramienta que se abusará. Como "Option Strict Off" y "On Error Resume Next" en VB, que los lenguajes "puros" como C# y Java nunca tuvieron.
Muchos dijeron lo mismo de la palabra clave "var", sin embargo, yo no lo veo siendo abusado, una vez que quedó entendido que no era lo mismo que "variante" de VB
Podría ser objeto de abuso en lugares donde los desarrolladores perezosos no quieren verificar los tipos en las clases y solo intentan capturar llamadas dinámicas en lugar de escribir "si blah es Blah ...".
Personalmente creo que se podría usar correctamente en situaciones como this pregunta reciente que respondí.
Creo que los que realmente entienden su poder son aquellos fuertemente en los lenguajes .NET dinámicos.
¿El verdadero escollo? Grave falta de documentación. Toda la arquitectura de la aplicación existe en la mente de la persona (o personas) que la escribió. Al menos con un tipado fuerte, puede ver lo que hace el objeto a través de su definición de clase. Con el tipado dinámico, debe inferir el significado de su uso, en el mejor de los casos. En el peor de los casos, no tiene IDEA cuál es el objeto. Es como programar todo en JavaScript. ¡ACK!
Para ser justos, esto ya era algo posible: los programas C-Interface pesados pueden hacer que la determinación de la implementación real para una llamada determinada sea un ejercicio de frustración, lleno de conjeturas y búsquedas de texto completo. – Shog9
Sí, pero la interfaz proporciona ALGÚN contexto de la operación. El objeto dinámico no proporciona ningún contexto. ¿Qué hay del otro lado de la dinámica q? ¿Quién sabe? –
dinámica es malo porque un código como éste aparecerá por todo el lugar:
public dynamic Foo(dynamic other) {
dynamic clone = other.Clone();
clone.AssignData(this.Data);
return clone ;
}
en lugar de:
public T Foo<T>(T other) where T: ICloneable, IAssignData{
T clone = (T)other.Clone();
clone.AssignData(this.Data);
return clone;
}
La primera de ellas, no tiene ninguna información de tipo estático, no hay tiempo de compilación comprobando, no se documenta automáticamente, no hay inferencia de tipo, por lo que las personas se verán obligadas a usar una referencia dinámica en el sitio de llamadas para almacenar el resultado, lo que generará más pérdida de tipo, y todo esto se irá a pique.
Ya estoy empezando a temer dinámico.
Editar: El peligro ha pasado (! Uf) ... y dinámico no se ha abusado, después de todo, no hay necesidad de que me votar al cabo de 3 años :)
¿Qué crees que podría alentar a las personas a escribir innecesariamente código dinámico? ¿Qué podría desalentarlos? –
Cuando las personas se dan cuenta de que Don obtener buena IntelliSense con dynamic
, cambiarán de dynamic
-feliz a dynamic
-cuando sea necesario-y-var
-at-all-other-times.
Los propósitos de dynamic
incluyen: interoperabilidad con lenguajes dinámicos y plataformas como COM/C++ y DLR/IronPython/IronRuby; así como convertir C# en sí mismo en IronSmalltalkWithBraces con todo implementando IDynamicObject
.
Todos los tiempos lo pasarán bien. (A menos que necesite mantener el código que alguien más escribió).)
Hice un proyecto en actionscript, que es tanto dinámico como estático, y diré que los híbridos dinámico/estático no funcionan bien. – FlySwat
Todas las personas generalizan a partir de un solo ejemplo. O, al menos yo sí. :) –
Hice un proyecto en QBASIC, y eso tampoco debería haber sido un lenguaje. Pero los puntos sobre ActionScript y QBASIC en realidad no tienen ninguna relevancia para C#. C# permanecerá, en el núcleo, estáticamente estáticamente orientado a objetos, con conjuntos de características alternativas muy útiles mezclados. – yfeldblum
creo que una gran cantidad de la repulsión que las personas están expresando a esta función se reduce a "esta es una característica del lenguaje mal porque permitirá a los malos a los desarrolladores escribir código malo." Si lo piensas, por esa lógica todas las características del lenguaje son malas.
Cuando me encuentro con un bloque de código VB que algún genio ha puesto como prefijo On Error Resume Next
, no es VB lo que maldigo. Quizás debería, supongo. Pero en mi experiencia, una persona que está decidida a poner un centavo en la caja de fusibles encontrará la manera. Incluso si vacías sus bolsillos, él va a crear sus propios centavos.
mí, estoy con ganas de una forma más útil de interoperar entre C# y Python. Estoy escribiendo más y más código que hace esto. La palabra clave dynamic
no puede venir lo suficientemente pronto para ese caso de uso en particular, porque la forma actual de hacerlo me hace sentir como un académico soviético en la década de 1950 que viaja al oeste para una conferencia: hay una inmensa cantidad de reglas y el papeleo antes de irme, estoy seguro de que alguien me estará mirando todo el tiempo que estoy allí, y la mayor parte de lo que recojo mientras estoy allí me será quitado en la frontera cuando regrese .
Interesante analogía –
no veo una razón por la forma actual de la invocación de métodos dynamicly es defectuoso:
Se necesitan tres líneas para hacerlo, o se puede añadir un método de extensión de System.Object que lo haga por usted :
class Program
{
static void Main(string[] args)
{
var foo = new Foo();
Console.WriteLine(foo.Invoke("Hello","Jonathan"));
}
}
static class DynamicDispatchHelper
{
static public object Invoke(this object ot, string methodName, params object[] args)
{
var t = ot.GetType();
var m = t.GetMethod(methodName);
return m.Invoke(ot, args);
}
}
class Foo
{
public string Hello(string name)
{
return ("Hello World, " + name);
}
}
¿Qué pasa si "Hola" está sobrecargado? ¿Qué pasa si alguien pasa una int por un tiempo? ¿Qué hay del rendimiento? Cuando viaje por este camino lo suficiente, habrá reescrito una buena parte del DLR y aún no manejó la interoperabilidad de Python o COM. –
... sin mencionar la sintaxis natural de C# para los operadores de indexación o infijo –
que solo admite la vinculación tardía basada en Reflection. No funciona para IDynamicObject basado en enlace tardío. Tampoco funciona para JSON o objetos basados en XML. –
Esto es algo así como discutir las cámaras públicas, seguro de que puede y va a ser mal pero hay ventajas a tener ellos también.
No hay ninguna razón por la cual no se podía prohibir la palabra clave "dinámica" en su propia guía de codificación si no los necesita. ¿Entonces, cuál es el problema? Quiero decir, si quieres hacer cosas locas con la palabra clave "dinámica" y pretender que C# es el primo mutante de JavaScript, sé mi invitado. Solo mantén estos experimentos fuera de mi base de código. ;)
FUD. Puede ser lo mejor desde el pan en rebanadas, pero toda la experiencia que he tenido con VB, JavaScript, etc., me da escalofríos al saber que C# tendrá unión dinámica. Sé que podré verlo racionalmente en el futuro cercano y ver qué tan buena será esa nueva característica para permitir la interoperabilidad con lenguajes dinámicos. Pero llevará algo de tiempo. Soy humano, ¿está bien? :-)
- 1. ¿Por qué no hay palabra clave "no es" en C#?
- 2. palabra clave dinámica habilita "tal vez" mónada?
- 3. C++ equivalente de la palabra clave "dinámica" de C# 4.0?
- 4. ¿La palabra clave dinámica en C# 4 es compatible con los métodos de extensión?
- 5. palabra clave "dinámica" y datos JSON
- 6. ¿CreateObject equivalente para C# 4, palabra clave dinámica y enlace tardío?
- 7. ¿La nueva palabra clave 'dinámica' C# 4.0 desaprueba la palabra clave 'var'?
- 8. ¿Por qué palabra clave "paquete" y .h?
- 9. Palabra clave auto de C++. ¿Por qué es magia?
- 10. ¿Por qué LINQ no incluye una palabra clave `distinct`?
- 11. Palabra clave protegida C#
- 12. ¿Por qué existe la palabra clave async
- 13. ¿Por qué la palabra clave params no es contextual?
- 14. C# palabra clave virtual
- 15. palabra clave privada vs no palabra clave privada
- 16. ¿Admite Windows Phone 7 la palabra clave dinámica?
- 17. C# palabra clave 'ref', rendimiento
- 18. Ventajas y desventajas de la palabra clave 'dinámica' de C# 4.0?
- 19. En C++, ¿por qué esta palabra clave no es una referencia?
- 20. palabra clave C++ extern en las funciones. ¿Por qué no solo incluir el archivo de encabezado?
- 21. palabra clave estática en C#
- 22. palabra clave "agradable" en C++?
- 23. ¿La palabra clave "dinámica" de C# 4.0 hace que los genéricos sean redundantes?
- 24. ¿Por qué este código funciona sin la palabra clave insegura?
- 25. Registro palabra clave en C++
- 26. palabra clave 'fuera' en C++
- 27. problema de palabra clave dinámico
- 28. tipo de datos de palabra clave dinámica frente a objeto
- 29. Asigne esta palabra clave en C#
- 30. ¿Qué pasa con la palabra clave "nueva" en C++?
var es abusado de una manera diferente - reduce la legibilidad, no la seguridad. – TraumaPony
Estoy de acuerdo. No quise dar a entender lo contrario. – TheSoftwareJedi
Lo he visto abusado. Definitivamente reduce la legibilidad, aunque Jon Skeet dijo en un podcast de .NET Rocks que aumenta la legibilidad ... lo cual no estoy seguro de cómo es posible ... – BobbyShaftoe