Recursos C # ou .Net a serem eliminados, assumindo que não há compatibilidade com versões anteriores? [fechadas]


18

Qualquer produto ou estrutura evolui. Principalmente, é feito para atender às necessidades de seus usuários, alavancar novos poderes de computação e simplesmente torná-lo melhor. Às vezes, o objetivo principal do design também muda com o produto. A estrutura C # ou .net não é exceção. Como vemos, a atual versão 4 é muito diferente em comparação com a primeira. Mas a coisa vem como uma barricada para essa compatibilidade com a evolução anterior.

Na maioria dos frameworks / produtos, alguns recursos seriam cortados se não houvesse necessidade de oferecer suporte à compatibilidade com versões anteriores. De acordo com você, quais são esses recursos em C # / .net?

Mencione um recurso por resposta.



4
A pergunta claramente não é construtiva de acordo com as diretrizes e claramente construtiva com base nas respostas fantásticas. Votação para reabrir.
psr

1
pena que fechou, ainda assim Eric talvez blogue isso em vez de responder aqui?
jk.

Respostas:


35

Métodos anônimos . Acho que todos concordam que a sintaxe do método anônimo escolhida para o C # 2.0 é robusta e desajeitada em comparação com a sintaxe lambda que adicionamos ao C # 3.0. É profundamente lamentável ter duas sintaxes quase idênticas para fazer a mesma coisa.


1
Concordamos que métodos anônimos eram ótimos quando não tínhamos lambdas ... agora eles são apenas redundantes.
Michael Brown

9
Há uma característica especial dos métodos anônimos que é muito melhor do que as expressões lambda ... o nome perfeito!
explorest

1
Neste ponto, nem me lembro da sintaxe de um método anônimo em C #. Eu teria que procurar se, por algum motivo bizarro, precisasse usar um em vez de um lambda.
Kyralessa 10/10

33

Eu me livraria das coleções não genéricas. Eles são uma abominação ... e há muitos casos em que estou usando o linq e tenho que fazer algo como

var customObjects = container.CustomObjects.Cast<CustomObject>();

Toda vez que tenho que fazer isso, uma pequena parte da minha alma morre.


Isso é ótimo demais.

1
Nem todas as portas do .NET oferecem suporte a genéricos. O .NET Micro é um exemplo. Pode não se aplicar se o CustomObjects nunca for movido para esta plataforma.
goodguys_activate

2
Essa é a vantagem de não ter alma.
CaffGeek 27/10

29

nulo como um tipo . Por que diabos o "vazio" é um tipo? Não possui instâncias, não possui valores, não é possível usá-lo como argumento de tipo genérico, tipo de parâmetro formal, tipo local, tipo de campo ou tipo de propriedade. Não tem significado como um tipo; pelo contrário, é um fato sobre o efeito que uma chamada de método tem na pilha da máquina virtual. Mas a máquina virtual é exatamente isso: uma máquina virtual. A máquina real colocará o valor retornado em um registro (normalmente EAX em x86) e não afetará a pilha! O vazio como um tipo é apenas uma péssima idéia.

Pior: quando usado em um tipo de ponteiro void*, significa algo completamente diferente do que significa quando usado como um tipo de retorno. Agora, significa "um ponteiro para um local de armazenamento de tipo desconhecido", que não tem nada a ver com seu significado como "um método que não retorna nenhum valor".

Podemos substituir void*como um tipo de ponteiro por IntPtr. (E void**com IntPtr*e assim por diante.) Podemos substituir void como um tipo de retorno por "Unit", um tipo que possui um valor único, ou seja, nulo. Uma implementação do CLR poderia então decidir que uma chamada de função do tipo unidade poderia otimizar seu uso de registradores ou pilhas adequadamente, sabendo que o nulo que está sendo "retornado" pode ser ignorado com segurança.

Nesse mundo, você não precisa mais se separar Func<A, R>e Action<T>delegar. Action<T>é justo Func<T, Unit>.


4
... e Taské apenas um Task<Unit>. Reimplementar os bits da biblioteca do async CTP me fez realmente desejo para isso ...
Jon Skeet

24

A declaração vazia; . Propenso a erros, quase sempre um erro de digitação, e não fornece um significado adicional que ainda não foi expresso por {}.


7
Sem mencionar a enorme penalidade de desempenho no JIT de 64 bits </snark>.
Jesse C. Slicer

7
Uma declaração vazia tem uma penalidade de desempenho? Por que é que?
Quentin-starin

22

Covariância insegura em matrizes do tipo de referência . Com a covariância typesafe ativada IEnumerable<T>, pelo menos parte da necessidade de covariância de matriz desapareceu. (Se tivéssemos uma interface de lista somente leitura covariante, não precisaríamos dela.)


Eu estava absolutamente vai escrever isso quando vi o título da pergunta - você chegou antes de mim :(
Chris Smith

1
A capacidade de receber uma referência de matriz covariante e gravar com segurança nas referências de matriz que foram lidas a partir dela é útil. Se like IList<T>herdado de IReadableList<out T>e não genérico IPemutable, poderia suportar coisas como classificação, mas as matrizes o suportariam mais facilmente.
Supercat 12/14 /

14

O operador mais unário . Operador menos útil de todos os tempos. Se não tivéssemos que guardá-lo para compatibilidade com versões anteriores, eu o retiraria em um piscar de olhos. Quem usa essa coisa, alguém?

(Esclarecimento: O operador unário positivo +xnão é o operador de pré-incremento ++x, nem o operador de pós-incremento x++e nem o operador de adição binária x+y.)


1
for (int i = 0; i <teto; i ++)
Michael Brown

13
Ele não está falando sobre o pré-incremento e operadores postIncrement: ele está falando sobre o mais unário, o oposto do sinal negativo em um número: +1 == 1. É muito perto de um no-op.
Jesse C. Slicer

8
Não é apenas sobre o efeito sobre a saída legível por máquina, ele pode melhorar a aparência do código para os seres humanos: if(a == +1 || a == -1){...}.
Thomas Bratt

5
@ShuggyCoUK: O que é particularmente bizarro é que é sobrecarregável . Porque isso acontece muito. Você sabe, como você está escrevendo algum JavaScript e pensa , cara, eu gostaria que o JS me permitisse fazer semântica unária e de operador definida pelo usuário, como o C # .
precisa

2
@ Eric Eu não sabia que era sobrecarregável. wow você poderia fazer alguma ofuscação desagradável com que :)
ShuggyCoUk

12

Padrão de literais numéricos para double

Para a maioria dos aplicativos de negócios , decimalé mais apropriado de qualquer maneira ... ou talvez seja melhor remover a ideia de um padrão e forçar o desenvolvedor a realmente fazer a escolha.

(That "remover o padrão" seria apropriado para algumas outras coisas também. Por exemplo, eu desisti de tentar convencer a todos que as classes devem ser selados por padrão, mas eu suspeito que é mais fácil convencer as pessoas que eles deveriam pensar sobre se a nova classe deve ser selada ou não e explicitada.)


Eu talvez se inclinar para identificar literais que implicam um valor que não pode ser representado como um duplo / float precisamente ...
ShuggyCoUk

Se eles estão em Java - encaminhá-los para os textos sagrados por Joshua "projeto ou documento de herança ou então proibi-la" Bloch martinfowler.com/bliki/DesignedInheritance.html IIRC Kotlin faz aulas de selo, por padrão, de modo que a indústria está se movendo para uma direção melhor a esse respeito.
Elazar Leibovich

Por que as aulas devem ser seladas?
James13

@ James: exatamente pelas razões que Josh dá. Projetar uma classe que permita a herança de maneira sensata e consistente leva tempo - e fazê-lo sem saber como a herança será usada é ainda pior.
perfil completo de Jon Skeet

1
@ Pacerier: Pense em imutabilidade, por exemplo. Uma classe não selada não pode alegar ser imutável, pois as subclasses podem introduzir mutabilidade.
precisa saber é o seguinte

7

Isso é mais uma diretriz do que um recurso, mas acho que é importante porque já está muito arraigado na mente das pessoas como a melhor solução canônica:

O padrão oficial para implementar IDisposable.

É complicado e existem maneiras melhores .


6

Eu sei que existem grandes diferenças entre as várias classes de timer. Mas não poderíamos nos livrar de um ou dois deles, afinal?


4

Métodos e tipos de Arraye List<T>que se tornaram obsoletos com o Linq, por exemplo:

  • Array.TrueForAll pode ser substituído por Enumerable.All
  • Array.FindAll pode ser substituído por Enumerable.Where
  • List<T>.ConvertAll pode ser substituído por Enumerable.Select
  • Predicate<T> pode ser substituído por Func<T, bool>
  • Converter<T,R> pode ser substituído por Func<T, R>
  • IComparer<T> realmente deve ser um delegado Func<T, T, int>

3
Eu gosto do Predicate<T>porque captura a intenção de como a função é usada e economiza um pouquinho de digitação.
Zebi

2

Delegados não genéricos Como coleções não genéricas, delegados não genéricos são inúteis agora que temos as séries Func e Action. E eu teria cortado as variantes em três parâmetros. Se você tiver mais de três parâmetros, faça uma estrutura e use-a como parâmetro único. Declarar um representante específico para manipulação de eventos não é muito SECO.


3
Como você definiria um delegado para um método que leva uma ref int com Action ou Func? Como você definiria um combinador com o Func? Ou seja, não há como dizer "delegar DD (D d);" com Func.
Eric Lippert

2
hmmm ... eu estou corrigido. É por isso que deixar o trabalho de criar as ferramentas que eu uso em suas mãos capazes;)
Michael Brown

@EricLippert: eu gostaria de ver uma classe de delegados especial que, através da magia do CLR, contivesse delegados de "todas" aridades e combinações de parâmetros de valor / referência [procurar por um delegado na classe mágica com um nome adequadamente formatado criaria o type] e todos os delegados da assinatura apropriada herdarão isso. O código que deseja um determinado delegado ainda exigiria um tipo exato, mas o código que deseja uma assinatura específica pode usar o nome mágico.
Supercat

-1

Serviços da Web asmx

Eu acho que eles são bastante obsoletos com o WCF hoje em dia.


6
Sim, mas às vezes é muito mais fácil grudar. . .
Wyatt Barnett

-2

Winforms
Seria bom não ter que navegar entre duas plataformas de desktop. O WPF é para onde as coisas estão indo, por isso é frustrante ter uma redundância completa no nível da plataforma.


Winforms parece muito mais estável, mais rápido e de buggy menos de WPF ...
Pacerier

Quando você só precisa invadir um aplicativo de desktop pequeno, o WPF é um grande exagero.
precisa saber é o seguinte

Parece que o WPF se tornou bastante obsoleto em favor do WinRT. No entanto, para mim, parece que o Winforms está mais vivo que o WPF no desenvolvimento de negócios. Veja também stackoverflow.com/questions/913417/…
Doc Brown,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.