2009-03-02 21 views
24

Estaba consultando la ayuda en línea de la biblioteca de control Infragistics hoy y vi un código VB que usaba la palabra clave Con para establecer varias propiedades en un control de pestaña. Han pasado casi 10 años desde que hice cualquier 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.Falta la palabra clave 'con' en C#

¿Tiene C# una palabra clave o constructo similar para imitar la funcionalidad proporcionada por el Con la palabra clave en VB? Si no, ¿hay alguna razón técnica por la cual C# no tiene esto?

EDIT: Busqué una entrada existente en este antes de pedir a mi pregunta, pero no encontró el único rayo refiere a (here). Para refinar la pregunta, entonces, ¿hay alguna razón técnica por la cual C# no tiene esto? Y Gulzar lo definió: no, no hay una razón técnica por la cual C# no tenga una Con la palabra clave. Fue una decisión de diseño de los diseñadores de idiomas.

+0

(fuera de tema, se preguntó sobre protobuf-net - gota envíeme un correo electrónico a [email protected]) –

+0

Además de lo que declaró Gulzar Nazim, estaba en una conferencia donde se hizo esta pregunta a Anders Helsburg. Su respuesta fue más ... sucinta. 'C# nunca proporcionará soporte para la palabra clave With' –

Respuesta

22

Esto es lo gerente de programa en C# tiene que decir: Why doesn't C# have a 'with' statement?

  • pequeña o beneficios de legibilidad que no existen. 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.

  • Aumento de la complejidad del lenguaje. Agregar una declaración con hará que el lenguaje sea más complejo. Por ejemplo, VB tuvo que agregar una nueva sintaxis de lenguaje para abordar la posible ambigüedad entre una variable local (Texto) y una propiedad en el destino "con" (.Texto). Otras formas de resolver este problema también introducen la complejidad del lenguaje. Otro enfoque es impulsar un alcance y hacer que la propiedad oculte la variable local, pero luego no hay forma de referirse al local sin agregar alguna sintaxis de escape.

  • C++ heritage. C++ nunca ha tenido un enunciado con, y la falta de dicha afirmación generalmente no se considera un problema para los desarrolladores de C++. Además, no consideramos que otros cambios (cambios en el tipo de código que las personas escriben, cambios en la plataforma, otros cambios en el idioma, etc.) sean más necesarios.

+1

@Gulzar - Gracias por el enlace. Se rascó la comezón, aunque estoy en desacuerdo con las dos primeras líneas de razonamiento del Sr. Wiltamuth. La palabra clave con, para mí, tiene menos que ver con la legibilidad que con hacer que el código sea más fácil de escribir ... –

+2

... Y me resulta difícil creer que una palabra clave esté cerca de la complejidad involucrada con LINQ, métodos anónimos, etc., pero estoy divagando. Gracias de nuevo por el enlace. –

+0

contento de ayudar a Matt. –

0

No, fue una decisión consciente tomada por el equipo de desarrollo de C#. Las personas tienen sentimientos encontrados sobre la palabra clave 'con' porque puede degradar la legibilidad del código si se abusa (anidando con).

+0

No sabía que podría anidar 'con' las declaraciones. Eso reduciría la legibilidad. Sin embargo, como el GoTo y muchos otros constructos de programación, si se usa bien, ¿es realmente tan malo? – Kibbee

+1

Creo que puede ser bueno si se usa correctamente. –

0

No creo que haya una razón técnica por la que no exista. Sin embargo, lo que diría es que la razón por la que no existe es que se trata de una construcción de programación que existe únicamente con el propósito de reducir el tipeo. Con cosas como intellisense y copiar y pegar, el mundo ya no tiene mucha demanda de funciones como esta. Yo uso VB.Net, y no recuerdo si aún es compatible. Nunca realmente sentí la necesidad de usarlo.

13

En C# 3.0, puede utilizar inicializadores de objeto de lograr un efecto similar al crear objetos.

var control = new MyControl 
{ 
    Title = "title", 
    SomeEvent += handler, 
    SomeProperty = foo, 
    Another = bar 
}; 

En lugar de:

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, todavía se puede utilizar con el marco 2.0, es sólo azúcar sintáctico introducido por el compilador.

+0

Es cierto, pero solo puede hacer esto cuando crea un objeto. No hay ningún mecanismo si el objeto ya existe. De todas maneras, gracias por el recordatorio. –

+0

Sí, gracias. Aclaré eso en mi publicación. –

8

No, la palabra clave "con" se dejó intencionalmente fuera del idioma.

Si usted tiene un nombre largo de Referencia, puede fácilmente hacer una referencia más corto para que el uso de una variable, e incluso le dan 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; 
} 
10

No es idiomático C#, pero si realmente quiere un equivalente with, usted puede 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); 
    } 
} 

actualización:
se me ocurrió que podría trivialmente que esto sea más concisa girando i t en un método de extensión, tal vez el cambio de nombre de "Alias" o "como" para reabability:

MyPersonWithALongName.Alias(p => { 
    p.Name = "George"; 
    p.Address = "123 Main St"; 
    ... 
}); 
+5

, querrá asegurarse de restringir T para que sea un tipo de referencia ("donde T: clase"), para que no edite accidentalmente una copia de struct x –

1

Por 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 un alias a la variable "p". A medida que avanzan las soluciones, me resultó bastante fácil mantener corto el nombre de la variable, este tipo de solución con un genérico "Con" no adquiere elegancia.

Lo ideal sería que todos nos gustaría ver algo de reelaboración de la sintaxis por lo que el uso es similar a la forma en la inicialización de varias propiedades funciona en la actualidad:

Person person = new Person() { Name = "test", Age = "123" };