Porque é que o com () constroem não incluídos no C #, quando é realmente legal em VB.NET?
-
07-07-2019 - |
Pergunta
Sou desenvolvedor C #. Eu realmente amo a chaveta porque eu vim de C, C ++ e Java fundo. No entanto, eu também como as outras linguagens de programação da Família .NET como VB.NET. e para trás entre C # e VB.NET comutação não é realmente tão grande de negócio se você tem sido programação por um tempo em .NET. Esta é a abordagem muito comum na empresa onde eu trabalho. Como C # cara, eu realmente gosto das palavras-chave literais XML e with
fornecidos pelo compilador VB.NET. Desejo Microsoft tinha incluído essas características em C # também.
Eu sou apenas curioso, que outro desenvolvedor tem a dizer sobre isso!
Solução
Eu não seria surpreendido se "com" ou um recurso semelhante é adicionado ao C #, eventualmente, juntamente com outros até então populares exclusivamente VB apresenta. Houve muita conversa na C # 4.0 apresentações de visualização recentemente pelo PDC e em outros lugares do aumento do "foco em paridade de linguagem" que começa com C # 4.0 e VB 10.
Outras dicas
Pessoalmente eu não gosto COM quando ele é usado após a construção - se você precisa fazer várias coisas com um objeto depois que ele é inicializado, geralmente que o comportamento deve ser encapsulado no próprio tipo. Se você realmente quer fazer algo como COM, é apenas uma questão de declarar uma variável de curto e, opcionalmente, a introdução de um novo escopo.
No entanto, é útil para ser capaz de inicializar compacta um objeto com várias propriedades - que é precisamente porque C # 3 permite que você escreva:
MyObject x = new MyObject { Name="Fred", Age=20, Salary=15000 };
Existem limitações para isso (que os parâmetros opcionais e nomeados em C # 4 irá ajudar a superar), mas é melhor do que era sem levar a messes potenciais / ambigüidades.
(On XML frente do literal, estou novamente com a equipe C # - XML ??é uma tecnologia muito específica para colocar em uma linguagem Se eles pudessem chegar a um generalizada forma que aconteceu. criar XML, mas poderia ser usado para criar outras árvores também, que seria bom -. exatamente como expressões de consulta não estão diretamente vinculados a IEnumerable ou IQueryable)
Você pode substituir With
de VB.Net através da criação de um nome de variável de uma única letra rápida. Na verdade, é menos código, uma vez With
também requer uma End With
mais tarde.
Por exemplo, uma coisa que eu costumava precisa fazer bastante frequência foi iterar sobre as linhas em uma tabela de dados para um relatório estilo de controle / break.
Em vb.net, que o olhar possa como este:
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
A C # ficaria assim:
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);
}
A primeira coisa a notar aqui é que o # versão C realmente necessário menos digitação, porque o VB não poderia combinar WITH
com o índice da matriz, e teve que ir através da propriedade .Item
para certas coisas. Não é um grande negócio aqui, mas imagine se o relatório teve 20 campos em vez de 2 e tive que quebrar em 3 itens em vez de 1.
É claro, você pode usar a técnica demonstrada em C # para VB também. Mas a principal coisa a notar é que WITH
não realmente dar-lhe muito.
É sobre as preferências do desenvolvedor, mas eu estou com você sobre COM. Minha preferência é para minimizar o número de variáveis ??em jogo, e o âmbito em que vivem. A filosofia do C # parece ser a mesma coisa. Mas neste caso as respostas aqui parecem sugerir que a adição (e tornando-se responsável por) uma variável é uma coisa boa em comparação com uma construção que, para mim, é muito semelhante ao lambdas.
Eu sinto que é bastante arbitrária para permitir que apenas configuração de propriedade 'massa' durante a inicialização. Eu realmente não entendo por que isso seria 'mau':
MyObj myObj = ObjFactoryFunction();
...
if(someCondition)
myObj { Prop1 = 1, Prop2 = 2 };
Eu sinto que este código exemplo é limpo e conciso.
Normalmente, quando eu vejo um pedido de recurso with
em C #, eu vejo o código que se beneficiariam de refatoração. Normalmente, quando a refatoração é feito, a suposta necessidade de with
está desaparecido.
Gosto da maneira como meu código funciona quando eu construir uma interface fluente para um objeto; ele tem algumas semelhanças com with
. Se eu estava projetando MessageBox.Show()
, eu poderia escrever:
new MessageBox()
.SetText("Hello World!")
.SetButtons(MessageBox.Buttons.OK)
.SetIcon(MessageBox.Icon.Information)
.Show();
Você também pode ver algo semelhante com Linq:
var q = Enumerable.Range(1, 100)
.Where(x => x % 2 == 0)
.Select(x => x * x);
Ela se sente um pouco como with
mas parece se encaixar naturalmente na linguagem que eu já tenho.