Comentários
- Conforme escrito, a pergunta era um exemplo clássico de não construtivo " qual idioma é melhor? " perguntas fora do tópico aqui. Eu ' tentei torná-lo mais construtivo com uma edição, uma vez que realmente obteve respostas boas e bem pensadas. Ainda assim, mantenha as FAQ e esta postagem do blog em mente quando fizer perguntas dessa natureza .
- Deixe-me adicionar alguns itens mais ousados. .NET tem um DOM bem definido ( por exemplo, CodeDOM ) para sua linguagem e, conseqüentemente, gerar coisas dinamicamente em tempo de execução é muito mais simples e eficiente. Isso também pode ser útil como capacidade de infraestrutura. Além disso, o sistema de tipos tem uma correspondência 1 para 1 com todos os tipos W3 nativos. Em sua essência, W3 e outras interoperações foram incorporadas à linguagem desde o início. Para outros idiomas, essas preocupações foram apenas acrescentadas e apresentam muitos desafios para eles. Além disso, se você ' interagir com muitas linguagens e / ou protocolos, o .NET também é muito forte
- Ei, JoeGeeky, adicione seu comentário como uma resposta para a pergunta.
- A verdadeira pergunta é: Por que razões devo escolher Nemerle, F * e F # em vez de C #? (ou seja, todos os três idiomas são do MS e todos os três são melhores)
- Eu realmente não ' não acho que qualquer declaração do gênero " a linguagem / plataforma X em comparação com a linguagem / plataforma Y é SEMPRE melhor " é válida e também acho que para qualquer X e Y pode ser facilmente invalidado com certeza contextos. Qual ' é o ponto desta pergunta?
Resposta
A pergunta deve ser " Qual linguagem é mais adequada para o desenvolvimento de aplicativos modernos e típicos? ".
Editar : Abordei alguns dos comentários abaixo. Uma pequena observação: considere que quando você tem muitas coisas nativamente, como expressões idiomáticas, é “uma grande diferença do que implementar ou baixar e usá-los você mesmo o tempo todo. Quase tudo pode ser implementado em qualquer uma dessas linguagens. A questão é – o que as linguagens fornecem nativamente a você.
Portanto, em primeiro lugar (alguns argumentos se aplicam a ambas as linguagens) …
C # é melhor que C ++ nisso:
- Possui coleta de lixo nativa .
- Permite que você trate assinaturas de métodos de classe “como funções livres (ou seja, ignorando o
this
argumento de ponteiro) e, portanto, crie relacionamentos mais dinâmicos e flexíveis entre as classes. edit se você não sabe o que isso significa, tente atribuir um método de membro retornando void e aceitando void para umvoid (*ptr)()
variável. Os delegados C # carregam o ponteirothis
com eles, mas o usuário nem sempre precisa se preocupar com isso. Eles podem simplesmente atribuir um métodovoid()
de qualquer classe a qualquer outrovoid()
delegado. - Ele tem um padrão enorme biblioteca com tantas coisas úteis que é bem implementada e fácil de usar.
- Ela permite blocos de código gerenciados e nativos.
- O controle de versão do assembly resolve facilmente os problemas infernais de DLL.
- Você pode definir classes, métodos e campos para serem internos ao assembly (o que significa que eles são acessíveis de qualquer lugar dentro da DLL em que eles “são declarados, mas não de outros assemblies).
C # é melhor que Java porque:
- Em vez de muito ruído (EJB, implementações de classes estáticas privadas, etc), você obtém construções nativas elegantes e amigáveis, como Propriedades e Eventos .
- Você tem genéricos reais (não a piada de mau elenco que Java chama de genéricos) e pode realizar uma reflexão sobre eles.
- Suporta idiomas de gerenciamento de recursos nativos (o
using
instrução). Java 7 também vai suportar isso, mas C # já tem isso há muito mais tempo. - Ele não tem exceções verificadas 🙂 (discutível se isso é bom ou ruim)
- É profundamente integrado com o Windows, se é isso que você deseja.
- Possui Lambdas e LINQ, portanto, suporta uma pequena quantidade de programação funcional.
- Ele permite covariância genérica e contravariância explicitamente.
- Tem variáveis dinâmicas, se você quiser.
- Melhor suporte de enumeração, com a instrução
yield
. - Permite definir novos tipos de valor (ou não referência).
Editar – Endereçando comentários
- Eu não disse que C ++ não suporta RAII nativo. Eu disse que Java não tem (você precisa tentar explicitamente / finalmente). C ++ tem ponteiros automáticos que são ótimos para RAII e (se você sabe o que está fazendo) também pode substituir a coleta de lixo.
- Eu não disse nada sobre emular funções livres. Mas, por exemplo, se você precisar acessar um campo por um ponteiro
this
, e vincular o método que faz isso a um ponteiro de função genérico (ou seja, não na mesma classe), então simplesmente não há maneira nativa de fazer isso. Em C #, você obtém o gratuitamente. Você nem precisa saber como funciona. - Por " tratar os métodos de membro como funções livres " Eu quis dizer que você não pode, por exemplo, vincular nativamente um método de membro a uma assinatura de função livre, porque o método de membro " secretamente " precisa do ponteiro
this
. - A instrução
using
, obviamente junto com os wrappers IDisposable, é um ótimo exemplo de RAII. Veja este link . Considere que você não precisa de RAII tanto em C # quanto em C ++, porque você tem o GC. Para os momentos específicos em que você precisar, você pode usar explicitamente ousing
declaração. Outro pequeno lembrete: liberar memória é um procedimento caro. GC tem sua vantagem de desempenho em muitos casos (especialmente quando você tem muita memória). A memória não vazará e você não gastará muito tempo na desalocação. Além do mais, a alocação também é mais rápida, já que você não aloca memória todas as vezes, apenas de vez em quando. Chamarnew
é simplesmente incrementar um último ponteiro de objeto. - " C # é pior porque tem coleta de lixo ". Isso é realmente subjetivo, mas, como afirmei no início, para a maioria dos desenvolvimentos de aplicativos típicos e modernos, a coleta de lixo é uma grande vantagem.
Em C ++, suas opções são gerenciar manualmente sua memória usandonew
a nddelete
, que empiricamente sempre leva a erros aqui e ali, ou (com C ++ 11) você pode usar ponteiros automáticos nativamente, mas tenha em mente que eles adicionam lotes e muito ruído no código. Portanto, o GC ainda tem uma vantagem. - " Os genéricos são muito mais fracos do que os modelos " – Eu simplesmente não ” não sei de onde você tirou isso. Os modelos podem ter suas vantagens, mas, na minha experiência, as restrições de tipo de parâmetro genérico, contravariância e covariância são ferramentas muito mais fortes e elegantes. A força dos modelos é que eles permitem que você brinque com a linguagem bit, o que pode ser legal, mas também causa muita dor de cabeça quando você deseja depurar algo. De modo geral, os modelos têm seus recursos interessantes, mas acho os genéricos mais práticos e limpos.
Comentários
- E se você ainda quiser um Coletor de lixo para C ++, você pode baixar um .
- vamos continuar esta discussão no chat
- Outro recurso importante em C # em comparação com Java, por motivos de desempenho, é a " struct ", um tipo de objeto que pode ser armazenado na pilha (ou em registros da CPU, em casos especiais) ou embutido em outros objetos da pilha. Eles são frequentemente usados para pequenos objetos com 1-4 campos, como pares de coordenadas X, Y.
- @LokiAstari Mind explica? Contanto que você se lembre de cancelar o registro de manipuladores de eventos e usar o padrão Dispose em classes que contêm wrappers nativos, você ' ficará bem. Isso ' é muito menos para saber e lembrar do que gerenciamento de memória em C ++.
- -1 já que estou faltando as seções " C ++ é melhor que C # porque … " e " Java é melhor que C # … ". Não acho que C # seja superior em todas as áreas, portanto, uma resposta sem essas duas seções provavelmente carece de algumas informações importantes.
Resposta
O ambiente
.NET Framework e clientes Windows
O Windows é o sistema operacional dominante em computadores clientes. As melhores estruturas de GUI para aplicativos do Windows são Winforms e WPF junto com .NET Framework . A melhor linguagem de programação para trabalhar com o .NET Framework e suas APIs é C # . Java não é uma alternativa para isso.E C ++ é uma linguagem mais antiga sem gerenciamento automático de memória. C # é semelhante a C ++, mas tem gerenciamento automático de memória e você não precisa trabalhar com ponteiros, o que o torna mais produtivo. C ++ ainda pode ser a melhor opção para alguns casos, mas não para aplicativos de banco de dados com muitos formulários, comuns em comercial.
IIS e Windows Server
Se você está acostumado a trabalhar no ambiente Windows e com C #, precisará de menos investimento para aprender IIS para programação de servidor e Windows Server para administração básica.
Active Directory e Windows Server
Se você estiver desenvolvendo um software que será implantado nas redes da empresa, é provável que eles usem um ambiente centrado no Windows usando um Windows Server com Active Directory. Em tal ambiente, é fácil integrar e implantar uma solução feita em C # e .NET Framework .
Pessoalmente, sou um desenvolvedor Java, não um desenvolvedor C #, mas trabalho com a web. Eu mudaria para C # se estivesse desenvolvendo aplicativos de rede para a rede Windows. Mas eu prefiro Java para servidores web baseados em Linux. Eu escolheria C ++ para sistemas embarcados se não tivesse muitas dependências.
Sim, C # é uma linguagem melhor com recursos mais modernos do que C ++ e Java, mas isso não é a coisa mais importante para escolher C # .
Resumo
O ambiente para seu software é o mais importante para a escolha C # . Se você trabalha em um ambiente com clientes Windows, servidores Windows, Active Directory, IIS e talvez SQL Server então C # é a melhor linguagem com o .NET Framework .
Se você trabalha em um ambiente Unix com ex. serviços da web, Java seria minha escolha. E se você trabalha com sistemas embarcados ou precisa se integrar com dispositivos de hardware C ++ seria uma boa escolha.
Comentários
- Com certeza – é por isso que eu uso C # e não qualquer outro motivo
- Você certamente pode usar .NET em outras plataformas via Mono, MonoTouch e MonoDroid, mas meus benchmarks descobriram que Mono é significativamente mais lento que .NET para Windows, e o próprio Compact Framework da Microsoft ' é extremamente lento em Windows CE: codeproject.com/KB/cross-platform/BenchmarkCppVsDotNet.aspx … é claro, o WPF está disponível apenas no Windows (mas eu não ' não gosto mesmo assim.)
- Quais dependências você quer dizer com " Eu escolheria C ++ para sistemas embarcados se não ' não ganhou ' t muitas dependências. " Você quer dizer as bibliotecas java?
- @Puckl sim, mas principalmente o jvm / jre.
- " Se você trabalha em um ambiente Unix com, por exemplo, serviços da web " existem algumas outras linguagens & estruturas que podem ser consideradas: ruby, Python, node.js etc.
Resposta
C # e Java
C # é uma linguagem muito boa se:
- Você deseja fazer desenvolvimento orientado a objetos de propósito geral. É uma linguagem OOP clássica, com tipagem estática.
- Seu objetivo é apenas as plataformas da Microsoft (vale a pena lembrar que a Microsoft clonou efetivamente o Java para criar C # porque queria uma linguagem semelhante a Java que bloquearia as pessoas Windows. Eles poderiam ter usado Java, mas isso permitiria às pessoas executar aplicativos facilmente em outras plataformas ….)
C # como linguagem é melhor do que Java de várias maneiras (melhor sintaxe para propriedades, tipos de valor, genéricos reificados etc.). Eu prefiro C # como linguagem a Java, mas no grande esquema das coisas, eles são linguagens bastante semelhantes e adequadas para aplicativos semelhantes.
Por outro lado, Java também tem algumas grandes vantagens:
- Enorme ecossistema de código aberto – as bibliotecas para Java que você pode obter gratuitamente são por agora o melhor de qualquer idioma. É difícil exagerar a importância disso – do ponto de vista de fazer as coisas, Java é muito eficaz.
- Ferramentas – as ferramentas Java são, na minha opinião, melhores do que você pode obter no mundo .Net . por exemplo. Maven (depois de dominado!) É particularmente impressionante.
- Manutenibilidade – Java existe há algum tempo e tem sido bem-sucedido em grandes empresas precisamente porque é relativamente estável e tem havido muito esforço para retrocompatibilidade. A sintaxe simples e ligeiramente detalhada também ajuda Java aqui – é mais fácil ler e manter o código se o código for muito claro e explícito.
- Novas linguagens – A JVM tem algumas novas linguagens incríveis (Scala, Clojure , Groovy etc.) que são o futuro da plataforma Java. É aqui que grande parte da inovação da linguagem está acontecendo, e está acontecendo muito mais rápido do que em Java ou C #.
Portanto, Java vs. C # é uma decisão bem próxima e realmente se resume a se você quer estar no campo da Microsoft ou do código aberto / plataforma cruzada.
Pessoalmente, prefiro o Java porque:
- O ecossistema da biblioteca é, a meu ver, muito mais importante do que o fato de C # ter uma sintaxe melhor do que Java
- No longo prazo, quero que todo o meu código seja devidamente cruzado -plataforma e capaz de rodar em grandes clusters de máquinas Linux baratas na nuvem.
- Clojure é IMHO a linguagem mais promissora do mundo agora, e se eu continuar com a plataforma JVM, poderei para tran sicionar meu código e minhas habilidades facilmente no Clojure ao longo do tempo.
C / C ++
C / C ++ é basicamente um animal totalmente diferente. Eu não o recomendaria para o desenvolvimento de aplicativos de uso geral hoje em dia pelos seguintes motivos:
- Gerenciamento de memória – para a maioria dos programas de uso geral hoje em dia, você não quer ser gerenciar sua própria memória. A coleta de lixo em C # ou Java é muito melhor para sua produtividade e sanidade do que qualquer uma das técnicas explícitas de gerenciamento de memória que você terá que usar em C / C ++
- Complexidade – C ++ em particular é um linguagem extremamente complexa. Leva muito tempo para dominar e o código em si também pode ser terrivelmente complexo. (Os modelos C ++, por exemplo, são particularmente complicados ….)
- Produtividade – na maioria das vezes e em todo o resto sendo igual, você levará mais tempo para fazer as coisas em C / C ++.
No entanto, é sem dúvida uma ótima escolha em um certo número limitado de domínios especiais, em particular:
- Sistemas operacionais – você provavelmente deseja usar C / C ++ se estiver escrevendo um sistema operacional.
- Desenvolvimento de jogos – quase todos t Os melhores motores de jogos comerciais são C / C ++. Ainda é a melhor escolha se você estiver desenvolvendo um título AAA exigente (C # e Java são perfeitamente adequados para jogos menos exigentes / casuais)
- Computação de alto desempenho – C / C ++ otimizado é provavelmente a melhor maneira de criar código de desempenho muito alto. Para a maioria dos aplicativos que fazem esse nível de otimização, não vale o esforço, mas em certos domínios pode ser extremamente valioso (negociação de alta frequência, por exemplo)
- Acesso ao hardware – você precisa direto acesso ao hardware (por exemplo, para um sistema embarcado)
Então, basicamente, C / C ++ é uma ótima escolha se e somente se você estiver focado em um dos domínios onde é particularmente adequado .
Comentários
- Você menciona o maven como um exemplo das melhores ferramentas para java. Eu ' não sou particularmente familiarizado com ele, mas olhando a documentação, o Maven parece bastante semelhante à ferramenta de compilação nativa .Net MSBuild. O que torna o Maven melhor do que o MSBuild?
- +! (só porque tenho apenas um voto): você explicou muito bem por que o ecossistema Java é melhor e por que não se deve comparar apenas a sintaxe C # vs Java. Java tem mais e melhores bibliotecas e ferramentas. Não está acontecendo muito na linguagem Java em si, mas novas linguagens muito interessantes estão aparecendo para a JVM que são (IMO) muito mais interessantes do que C #. Não conheço o Clojure, mas acho Scala muito interessante: projetado para ser OOP + FP desde o início.
- por que todo mundo pensa que o código C ++ está cheio de gerenciamento manual de memória. Não é C, você sabe, RAII significa que você quase nunca tem que alocar / liberar memória manualmente (as vezes que você faz isso são aqueles em que uma linguagem como C # seria inútil para você).
- @gbjbaanb – provavelmente porque RAII é inadequado para gerenciamento de memória de propósito geral. Não é de forma alguma equivalente em flexibilidade a um sistema GC completo como você vê em Java ou C #. Assim que você ultrapassar os limites do RAII, estará de volta ao território de gerenciamento manual de memória.
- @mikera Apenas quero destacar que também há bastante desenvolvimento de linguagem na plataforma .NET. Por exemplo. F # é uma linguagem funcional bacana que se integra perfeitamente ao restante do .NET, e o Python foi recentemente portado para o .NET como Iron Python (e também obteve um IDE agradável ! ).
Resposta
I heard that syntactically they are almost the same.
Sintaticamente? Quem se importa com a sintaxe? A sintaxe é boa apenas para uma coisa: permitir uma migração mais rápida de linguagens sintaticamente semelhantes. É isso.
C # é muito melhor que Java. Considere seu suporte de programação genérico e funcional – C # está muito à frente do Java. Sem mencionar sobrecargas de operador e outras coisas boas – C # é muito melhor apresentado. Não há como o Java ser considerado melhor do que C #.
C ++ e C # é mais uma competição. C ++ tem um modelo de compilação arcaico incrivelmente irritante e um monte de doenças de C, mas seus modelos são muito mais poderosos do que os genéricos, e suas abordagens de gerenciamento de recursos são muito mais flexíveis e poderosas em geral, pois using
é um fracasso completo e executa mais rápido.
Comentários
- Acho que se deve comparar os recursos de linguagem e a disponibilidade de uma linguagem em plataformas diferentes. Com um C # está bloqueado com a Microsoft, com o Java não é: isso ' é uma grande vantagem, pelo menos para desenvolvedores UNIX / Linux. OOP + FP são recursos interessantes, mas por que se preocupar com C # se você pode usar Scala, que é executado no JVM e pode fazer interface com código Java legado? Eu nunca aprenderia uma linguagem específica de plataforma a menos que fosse forçado.
- @Giorgio: O projeto Mono existe . Mas, em segundo lugar, a Microsoft realmente cuida de sua plataforma – eles fornecem grandes atualizações regulares. Java quase não teve nada de novo. Além disso, a questão é sobre C # vs Java, não CLR vs JVM.
- @DeadMG: Pelo que eu sei, não posso pegar nenhum programa C # desenvolvido no Windows e compilá-lo com Mono. Não é CLR vs JVM? A questão é por que as pessoas usam C # ou Java. Para as pessoas usarem uma linguagem, é necessário um tempo de execução e um sistema operacional. Não discuto sobre o fato de que C # tem mais recursos do que Java, mas Java é muito mais portátil: esse é o fator que pode influenciar a adoção de uma linguagem. Na verdade, Java ainda é usado com muito mais frequência do que C #, mesmo que falte alguns recursos avançados.
- @Giorgio, você pode pegar qualquer programa C # e construí-lo com Mono. Você não pode usar certas bibliotecas (que não fazem parte da linguagem C # de qualquer maneira). E java não é " muito mais portátil ". Você pode codificar para iOS em C #, mas não em Java, por exemplo.
- @Giogio, Mono é pelo menos tão portátil quanto JVM.
Resposta
Bem, C#
tem alguns recursos integrados interessantes como LINQ
e delegados. Está obtendo o melhor dos dois mundos – Java
e C++
. Procure aqui para uma comparação completa.
Mas eu gosto mais do Java
mundo – muito mais estruturas de código aberto e é executado em todas as plataformas. E não me fale sobre Mono
– não é uma opção confiável.
Comentários
- +1: " Mas eu gosto mais do mundo Java – muito mais estruturas de código aberto e é executado em todas as plataformas. " Vamos ' s espero que o Oracle não mude isso!
- Lembre-se de explicar, o que ' não " confiável " em Mono?
- @Petar Minchev, A culpa é apenas sua. Você deve seguir as diretrizes de portabilidade e não usar bibliotecas não portáveis – e desta forma qualquer aplicativo complexo seria executado de forma confiável com Mono. Coisas como WPF nunca serão portadas.
- @Petar Minchev, existem muitos não portáteis Bibliotecas Java por aí. Você deve sempre ter cuidado com a portabilidade, não importa a linguagem que ' esteja usando. E, de qualquer forma, a questão é sobre as linguagens, não e bibliotecas de terceiros.
- @Petar Minchev, GTK # é portátil. Use-o.
Resposta
De acordo com algumas fontes (consulte, por exemplo, http://www.indeed.com/jobtrends ) C # ainda é menos popular que Java e tão popular quanto C ++.
C # fornece recursos que faltam em Java, por exemplo suporte direto para certos idiomas de programação, como propriedades, estilo de programação funcional e assim por diante. C # tem um nível de abstração mais alto do que C ++, o que é uma vantagem quando o tempo de desenvolvimento é mais importante do que a velocidade do programa.
Pessoalmente, ainda prefiro os mundos Java / C ++. Como disse Petar Minchev, Java tem mais estruturas e aplicativos de código aberto, é executado em qualquer lugar, está menos vinculado a um determinado fornecedor e sistema operacional. C ++ tem vantagens semelhantes, embora o código muitas vezes precise de adaptações de uma plataforma para outra. Como prefiro desenvolver em Linux e, até onde sei, não posso ter desenvolvido C # totalmente no Linux, nunca tive um interesse real em C # porque minhas necessidades de programação são cobertas por C, C ++, Java, Scala.
Por outro lado, para muitos desenvolvedores, estar vinculado a um determinado fornecedor não é um problema: a Microsoft tem uma posição dominante no mercado de sistemas operacionais e o C # oferece muitas oportunidades de trabalho. Portanto, muitos desenvolvedores da IMO adotam C # porque, além de ser uma linguagem rica em recursos, também é um bom investimento.
Comentários
- " Não posso ter desenvolvido o C # totalmente no Linux " – Você poderia explicar melhor? Você quer dizer que o framework .Net completo não está ' disponível porque eu não ' não tive problemas com a linguagem C # em si ( ou F # para esse assunto) no Linux?
- @wawa: Até onde sei, o framework .Net corresponde ao JDK, e o framework .Net está disponível apenas para Windows, enquanto o JDK está disponível para vários sistemas operacionais ' s. Se isso não estiver correto, posso editar minha resposta (e mudar minha opinião também).
- Acho que uma analogia mais próxima seria a Biblioteca de classes de base com o JDK. O BCL possui peças padronizadas e não padronizadas. O projeto mono implementa tanto as peças padronizadas quanto as não padronizadas.
- @wawa: Obrigado pela informação. Estou pensando em experimentar o C # usando o Mono. Ainda assim, ainda tenho um sentimento bastante forte de que C # está muito mais fortemente ligado à Microsoft do que Java ao Oracle (ou à Sun no passado).
Resposta
E " Qual estrutura de desenvolvimento de software, que inclui uma linguagem de programação ", melhor?
Você se esqueceu de incluir outras coisas, como o " ambiente " com o qual trabalhará.
-
Você vai trabalhar apenas com o sistema operacional Windows, mas não precisa ser de baixo nível e ter muita memória e outros recursos?
Escolha .NET como framework sobre Windows e use C #.
-
Você vai trabalhar apenas para Windows, mas não precisa ser de baixo nível, MAS, não tem muitos recursos?
Escolha o Delphi Framework (e Object Pascal Delphi linguagem de programação ou Lazarus Object Pascal linguagem de programação)
-
Seu aplicativo é obrigatório. para apoiar o serviço plataformas ral, como um jogo, em diferentes celulares?
Escolha o Java Framework e a linguagem de programação Java.
-
É Linux com KDE como gráfico interface?
Escolha o framework QT, com C ++
-
É Linux com Gnome como interface gráfica?
Escolha o framework GObject / GLib , com C ++
-
Você vai trabalhar com várias operações de baixo nível, como o desenvolvimento de drivers?
C simples ou C ++ é usado para vários Sistemas, com bibliotecas padrão, como estrutura.
Apenas meus 2 centavos.
Comentários
- Eu ' não tenho certeza sobre 3. Smartphones são muito populares hoje e AFAIK, todos eles suportam C # de alguma forma, mas apenas Android suporta Java.
- O Delphi está ' t morto? 🙂
- @ šljaker Não, mas não é ' t muito popular nestes dias.
- @svick: Isso é uma mentira. Além do Android, Java também existe de alguma forma no iOS, Symbian, WinMo, Blackberry, Maemo e WebOS (ou seja, tudo o que importa ou ainda importa; não ' para começar plataformas ainda menores). Android, Blackberry e Symbian oficialmente oferecem suporte a Java como opção de desenvolvimento; A Sun costumava oferecer suporte a Java no iOS, mesmo quando a Apple não gosta disso. Java é a linguagem de desenvolvimento primária no telefone Android e Blackberry. Não posso ' dizer o mesmo com C #, AFAICT que ' é oficialmente compatível apenas com WinMo.
Resposta
Se você fizer uma pesquisa, provavelmente se deparará com uma discussão sobre as principais linguagens de programação. Aqui está um dos resultados da pesquisa – http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html – Java ainda parece ser a linguagem mais popular.
Java tentou remover algumas das deficiências do C ++ (e tornar a vida dos programadores mais simples para aplicativos não críticos e não em tempo real). C # sendo o último a chegar à festa, evitou algumas das deficiências da linguagem Java. C # fez muito progresso (já que a Microsoft tem muito controle sobre ele), enquanto os avanços em Java foram bloqueados por um período considerável de tempo devido ao conflito entre as partes interessadas.
Resposta
Algumas coisas que ainda não foram mencionadas:
C # é melhor que C ++ porque:
Ele acaba com arquivos de cabeçalho, o que se traduz em grande simplicidade.
C # é melhor do que Java porque:
Ele suporta o tipo de referência (classe) e tipo de valor (estrutura) definido pelo usuário tipos, que, se você souber o que está fazendo, podem render benefícios de desempenho significativos.
Ele oferece suporte a delegados, que são como interfaces de método único, simplificando muito a codificação de construções de ocorrência frequente que envolvem objetos de método único.
Comentários
- Você pode explicar de que forma ter os tipos de tipo de referência e tipo de valor pode gerar benefícios de desempenho em C #?
- Por exemplo, se você quiser ter uma matriz de registros , em Java você não tem outra opção a não ser descrever seu registro usando uma classe, de modo que seu array será um array de referências a uma infinidade de objetos alocados separadamente. Em C #, você pode descrever seu registro usando uma estrutura, de modo que seu array será apenas uma única área contínua de memória contendo suas estruturas uma após a outra, assim como em C.
- Como outro exemplo, se você quiser para definir um novo tipo pequeno (um tipo que caberia em uma palavra de máquina), você não precisa definir uma nova classe para ele; você pode simplesmente torná-lo uma estrutura, portanto, ele obedecerá à semântica de valor. Passar tais estruturas não será mais caro do que passar referências a objetos, mas você terá o benefício de não alocar, construir e coletar como lixo nenhum objeto.
- Eu entendo. Portanto, as classes são instanciadas no heap e acessadas por meio de referências, enquanto as estruturas são instanciadas na pilha (?)
- Quase correto. A única imprecisão nesta declaração é que uma estrutura será encontrada no heap se estiver embutida em outro objeto ou se estiver dentro de uma matriz de estruturas. E também será encontrado na pilha se alguma vez for encaixado, exatamente da mesma maneira que os tipos de valor são encaixotados em Java.
Resposta
Você deve escolher o melhor idioma para seu ambiente esperado e sua especialidade.
Escolha C # se estiver trabalhando em um ambiente exclusivo da Microsoft. Embora C # seja padronizado sob a ISO / IEC 23270: 2003, a versão da Microsoft continua sendo a única implementação completa. Várias partes importantes da linguagem não são cobertas pelo padrão e, portanto, estão sujeitas às patentes da Microsoft. Ninguém mais implementará uma versão completamente compatível do idioma para outros sistemas, então, na verdade, você está restrito ao fornecedor para o Microsoft Windows e .Net enquanto usar o idioma. Se você está procurando habilidades para usar no mercado móvel, é melhor procurar outra linguagem.
Java funciona, mas tem uma boa sobrecarga, em parte devido a recursos como coleta de lixo. Java também não é padronizado pela ISO / IEC, então você não tem garantias se mudar de plataforma e versão de Java, apenas as melhores intenções da Sun / Oracle. Se você eventualmente planeja trabalhar com Android, este é definitivamente o caminho a seguir. . A programação do Android é basicamente Java, com algumas mudanças.
C ++ é padronizado e quase todos os compiladores seguem o padrão internacional, então você tem um comportamento garantido, MAS a linguagem não o protege de você mesmo. Você precisa realizar a limpeza e a verificação de estouro por conta própria. Isso não é difícil. Os programadores C / C ++ têm feito isso por muitos anos. A Apple usa Objective C para tudo, então se você quiser usar a Apple, eu recomendo que você experimente.
Se você se vir deixando o Windows para trás em algum momento, eu sugiro aprender C / C ++ e Java – ambos são comercializáveis no momento.
Resposta
Em relação ao C ++ vs C # (já que não sou proficiente o suficiente em Java), o que está faltando aqui é a capacidade de acessar coisas de baixo nível no Windows. Por exemplo, você não pode desenvolver um driver de exibição nativo em C # (ainda), mas pode com C ++. Isso não torna o C ++ melhor. Vejo C ++ versus C # como Assembly versus C.
C # está em meu ver muito mais eficiente se você olhar para o tempo que leva para realmente implementar um recurso. A penalidade de desempenho do tempo de execução .Net é insignificante para 99% dos aplicativos desenvolvidos. Pode ser importante se você estiver executando um ciclo restrito, sim por suposto, mas na maioria das vezes um aplicativo está ocioso, esperando por qualquer tipo de entrada, sinal ou interrupção (IO de disco, clique de botão, rede, conclusão de animação).
A biblioteca CLR com todos os seus funções tem outro r grande benefício. Quando eu estava treinando C # para desenvolvedores juniores, a maioria deles disse que gostava da convenção de nomenclatura lógica de classes, membros e namespaces. Encontrar um recurso de método era lógico no SDK, algo que o Visual Basic 5 era seriamente defeituoso. Isso os ajudou tremendamente na adoção da biblioteca. Depois de aprender a sintaxe de uma linguagem, aprender uma nova biblioteca é importante para se obter uma boa compreensão de qualquer SDK. Isso evita que você reinvente a roda.