2009-01-09 14 views
10

Soy desarrollador de C#. Realmente me encanta el corsé porque vengo de C, C++ y Java. Sin embargo, también me gustan los otros lenguajes de programación de la familia .NET como VB.NET. Cambiar de ida y vuelta entre C# y VB.NET no es tan importante si has estado programando durante un tiempo en .NET. Ese es un enfoque muy común en la empresa donde trabajo. Como C# chico, realmente me gustan las palabras clave XML y with proporcionadas por el compilador VB.NET. Ojalá Microsoft hubiera incluido esas características en C# también.¿Por qué el constructo con() no está incluido en C#, cuando está realmente bien en VB.NET?

Solo tengo curiosidad, ¡qué otro desarrollador tiene que decir al respecto!

+2

mi favorito VB "extra" es la cláusula cuándo excepciones - por ejemplo. "catch x as my_exception when x.code = 100", o "catch x as exception when retries = 3" – gbjbaanb

Respuesta

0

no estaría sorprendido si "con" o una característica similar se añade a C#, finalmente, junto con otras características exclusivamente VB populares hasta este momento. Se habló mucho en las presentaciones de vista previa de C# 4.0 recientemente en PDC y en otras partes del aumento de "enfoque en la paridad de lenguaje" comenzando con C# 4.0 y VB 10.

16

Personalmente, no me gusta WITH cuando se usa después de la construcción: si necesita hacer varias cosas con un objeto después de haberlo inicializado, generalmente ese comportamiento debería estar encapsulado en el tipo mismo. Si realmente desea hacer algo como CON, solo se trata de declarar una variable corta y, opcionalmente, de introducir un nuevo alcance.

Sin embargo, es útil poder inicializar de forma compacta un objeto con varias propiedades - que es precisamente la razón por C# 3 le permite escribir:

MyObject x = new MyObject { Name="Fred", Age=20, Salary=15000 }; 

hay limitaciones a esta (que la opcional y los parámetros nombrados en C# 4 ayudarán a superar) pero es mejor de lo que era sin conducir a posibles problemas/ambigüedades.

(En el frente literal XML, estoy de nuevo con el equipo de C# - XML ​​es una tecnología muy específica para poner en un lenguaje Si pudieran llegar a una generalizada forma que pasó a crear XML, pero podría. también puede usarse para crear otros árboles, eso sería bueno, así como las expresiones de consulta no están directamente relacionadas con IEnumerable o IQueryable).

+0

Totalmente de acuerdo con sus comentarios sobre los literales XML. 1 –

+0

XML es una tecnología omnipresente a utilizar en .NET, todo lo utiliza :(Ahora, si habían hecho el trabajo Linq2Sql con DBs no sqlserver, tendría un punto :) – gbjbaanb

+1

XML es sin duda presente en muchos lugares en el marco .NET, pero no creo que merezca un lugar especial en el lenguaje en sí mismo, aparte de la documentación. –

3

Puede reemplazar el With de VB.Net creando un nombre de variable de una sola letra. De hecho, es menos código, ya que With también requiere un End With más adelante.

Por ejemplo, una cosa que solía necesitar hacer con bastante frecuencia era iterar sobre las filas en una tabla de datos para un informe de estilo de control/corte.

En vb.net, que podría tener este aspecto:

Dim CurCustomerName As String 
Dim CustomerSalesTotal As Decimal 

Dim ds As DataSet = GetReportData() 
With ds.Tables(0).Rows 
    Dim i As Integer = 0 
    While i < .Count 
     ''//{ 
     CurCustomerName = .Item(i)("CustName") 
     CustomerSalesTotal = 0 
     PrintHeaderLine(CurCustomerName) 

     While i < .Count AndAlso CurCustomerName = .Item(i)("CustName") 
      ''//{ 
      PrintItemLine(.Item(i)("OrderTotal")) 
      CustomerSalesTotal += .Item(i)("OrderTotal") 

      i+= 1 
     End While ''//} 
     PrintSubTotalLine(CustomerSalesTotal) 
    End While ''//} 
End With 

El C# sería el siguiente:

string CurCustomerName; 
Decimal CustomerSalesTotal; 

DataSet ds = GetReportData(); 
DataRowCollection r = ds.Tables[0].Rows; 
int i=0; 
while (i<r.Count) 
{ 
    CurCustomerName = r[i]["CustName"]; 
    CustomerSalesTotal = 0; 
    PrintHeaderLine(CurCustomerName); 

    while (i<r.Count && CurCustomerName == r[i]["CustName"]) 
    { 
     PrintItemLine(r[i]["OrderTotal"]); 
     CustomerSalesTotal += r[i]["OrderTotal"]; 

     i++; 
    } 
    PrintSubTotalLine(CustomerSalesTotal); 
} 

Lo que hay que notar aquí es que la versión # C que se necesita teclear menos , porque el VB no podía combinar WITH con el índice de matriz, y tenía que pasar por la propiedad .Item para ciertas cosas. No es gran cosa aquí, pero imagínese si el informe tuviera 20 campos en lugar de 2 y tuviera que dividirse en 3 elementos en lugar de 1.

Por supuesto, también podría usar la técnica demostrada en C# para VB. Pero lo principal a tener en cuenta es que WITH realmente no le da mucho.

+0

Esto hace que el código sea ilegible y generalmente es una mala práctica. –

+0

No menos legible que 'With'- es válido para propósitos de comparación al menos. –

+0

No se puede leer en absoluto. Piénselo como una función en línea que toma las variables de alias como un parámetro. Lo llamarías ilegible como una función separada, ¿verdad? – jmucchiello

1

Se trata de preferencias del desarrollador, pero estoy con usted acerca de CON. Mi preferencia es minimizar el número de variables en juego y el alcance dentro del cual viven. La filosofía de C# parece ser muy similar. Pero en este caso las respuestas aquí parecen sugerir que agregar (y hacerse responsable de) una variable es algo bueno en comparación con una construcción que, para mí, es muy similar a lambdas.

1

creo que es bastante arbitraria para permitir únicamente valor de la propiedad 'masa' durante la inicialización. Realmente no entiendo por qué esto sería 'malo':

MyObj myObj = ObjFactoryFunction(); 

... 

if(someCondition) 
    myObj { Prop1 = 1, Prop2 = 2 }; 

Siento que este ejemplo de código es limpio y conciso.

1

Generalmente cuando veo una solicitud de una característica with en C# , Veo código que se beneficiaría de la refactorización. Por lo general, cuando se realiza la refactorización, la supuesta necesidad de with ha desaparecido.

me gusta la forma en que mi código funciona cuando construyo una interfaz fluida en la que un objeto; tiene algunas similitudes con with. Si estaba diseñando MessageBox.Show(), podría escribir:

new MessageBox() 
    .SetText("Hello World!") 
    .SetButtons(MessageBox.Buttons.OK) 
    .SetIcon(MessageBox.Icon.Information) 
    .Show(); 

También puede ver algo similar con LINQ:

var q = Enumerable.Range(1, 100) 
      .Where(x => x % 2 == 0) 
      .Select(x => x * x); 

Se siente un poco como with pero parece encajar de manera natural en la lengua ya tener.

Cuestiones relacionadas