reservada - Falta la palabra clave ''con'' en C#
referencia de c# microsoft (7)
En C # 3.0, puede usar inicializadores de objetos para lograr un efecto similar al crear objetos.
var control = new MyControl
{
Title = "title",
SomeEvent += handler,
SomeProperty = foo,
Another = bar
};
Más bien que:
var control = new MyControl();
control.Title = "title";
control.SomeEvent += handler;
control.SomeProperty = foo;
control.Another = bar;
Tenga en cuenta que, aunque esta sintaxis se introdujo en C # 3.0, aún puede utilizarla con el marco 2.0, es solo el azúcar sintáctico introducido por el compilador.
Esta pregunta ya tiene una respuesta aquí:
- ¿Con bloque equivalente en C #? 14 respuestas
Estaba buscando ayuda en línea para la biblioteca de control de Infragistics y vi un código de VB que usaba la palabra clave With para establecer varias propiedades en un control de pestaña. Han pasado casi 10 años desde que hice la programación de VB, y casi había olvidado que esta palabra clave existía. Como todavía soy relativamente nuevo en C #, rápidamente fui a ver si tenía una construcción similar. Lamentablemente, no he podido encontrar nada.
¿C # tiene una palabra clave o construcción similar para imitar la funcionalidad proporcionada por la palabra clave With en VB? Si no es así, ¿hay alguna razón técnica por la que C # no tenga esto?
EDITAR: Busqué una entrada existente sobre esto antes de hacer mi pregunta, pero no encontré a la que Ray se refirió ( here ). Para refinar la pregunta, entonces, ¿hay alguna razón técnica por la que C # no tenga esto? Y Gulzar lo definió: no, no hay una razón técnica por la que C # no tenga una palabra clave With . Fue una decisión de diseño de los diseñadores de idiomas.
Esto es lo que el administrador de programas de C # tiene que decir: ¿Por qué C # no tiene una declaración ''con''?
Beneficios de legibilidad pequeños o inexistentes. Pensamos que los beneficios de legibilidad eran pequeños o inexistentes. No iré tan lejos como para decir que la declaración with hace que el código sea menos legible, pero algunas personas probablemente lo harían.
Mayor complejidad del lenguaje. Agregar una declaración with haría que el lenguaje sea más complejo. Por ejemplo, VB tuvo que agregar una nueva sintaxis de idioma para abordar la posible ambigüedad entre una variable local (Texto) y una propiedad en el destino "con" (.Text). Otras formas de resolver este problema también introducen la complejidad del lenguaje. Otro enfoque es empujar un alcance y hacer que la propiedad oculte la variable local, pero entonces no hay manera de referirse a lo local sin agregar alguna sintaxis de escape.
Herencia de C ++. C ++ nunca ha tenido una declaración con, y la falta de tal declaración no es generalmente considerada como un problema por los desarrolladores de C ++. Además, no sentimos que otros cambios (cambios en el tipo de código que escriben las personas, cambios en la plataforma, otros cambios en el idioma, etc.) se realicen con declaraciones más necesarias.
No es idiomático c #, pero si realmente quieres un equivalente, puedes hacer esto:
Person MyPersonWithALongName = new Person();
MyUtils.With(MyPersonWithALongName, p => {
p.Name = "George";
p.Address = "123 Main St";
...
});
class MyUtils {
public static void With<T>(T x, Action<T> do) {
do(x);
}
}
Actualizar:
Se me ocurrió que, trivialmente, podría hacer esto más conciso al convertirlo en un método de extensión, tal vez cambiándolo de nombre "Alias" o "Como" por razones de fiabilidad:
MyPersonWithALongName.Alias(p => {
p.Name = "George";
p.Address = "123 Main St";
...
});
No me imagino que haya una razón técnica por la que no existe. Sin embargo, lo que diría es que la razón por la que no existe es que es una construcción de programación que existe únicamente con el propósito de reducir la escritura. Con cosas como intellisense, y copiar y pegar, el mundo ya no tiene mucha demanda de características como esta. Utilizo VB.Net, y no puedo recordar si aún es compatible. Nunca sentí realmente la necesidad de usarlo.
No, fue una decisión consciente tomada por el equipo C # dev. Las personas tienen sentimientos encontrados acerca de la palabra clave ''con'' porque puede degradar la legibilidad del código si se abusa (anida con).
No, la palabra clave "con" se dejó intencionalmente fuera del idioma.
Si tiene un nombre de referencia largo, puede hacer una referencia más corta usando una variable e incluso darle un alcance limitado:
{
SomeClass r = Some.Lengthy.Path.To.Get.To.A.Referece;
r.Some = 42;
r.Properites = "none";
r.To = 1;
r.Set = null;
}
Para estas soluciones:
// ....
// (class Common)
public static void With<T>(T property, Action<T> action) {
action(property);
}
// ...
// usage somewhere ...
Person person = GetPerson();
Common.With(person, p => { p.Name = "test", p.Age = "123" });
Simplemente parece que estamos aliasando la variable con "p". A medida que avanzan las soluciones, me resultó bastante fácil mantener el nombre de variable corto, este tipo de solución con un genérico "Con" no compra ninguna elegancia.
Idealmente, a todos nos gustaría ver algunas modificaciones en la sintaxis para que el uso sea similar a cómo funciona la inicialización de múltiples propiedades hoy en día:
Person person = new Person() { Name = "test", Age = "123" };