Porque é que o com () constroem não incluídos no C #, quando é realmente legal em VB.NET?

StackOverflow https://stackoverflow.com/questions/429890

  •  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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top