Os designers de Java odeiam a complexidade do C++, então o Java é muito conciso, e o GC também torna o gerenciamento de memória muito conveniente. O C# está interessado no GC e na tecnologia de máquina virtual do Java e espera integrar várias das principais linguagens da Microsoft no .NET. . Portanto, C# não é simples nem complexo em termos de linguagem.
As ideias de design das duas linguagens também são diferentes. Java é uma linguagem compilada e interpretada, enquanto C# é uma linguagem compilada e depois compilada e executada. Java não possui delegados, C# possui delegados. Java tende a usar Interface para implementar funções de delegação, enquanto em C#, a Classe Abstrata desempenha um papel maior que a Interface.
Java segue regras de nomenclatura camel e C# segue regras de nomenclatura Pascal. Mas agora mais e mais pessoas de Java estão começando a usar C# e, ao mesmo tempo, estão trazendo as regras de nomenclatura de camelo para C#, o que pode tornar o código C# cada vez mais difícil de ler. Por que o C# não seguiu o camel em primeiro lugar? Não vejo nada de ruim na convenção de nomenclatura de camelos.
1. Nome da classe.this e classe interna
Em Java, frequentemente vemos um uso semelhante ao nome da classe. Esta é a instância do objeto atual. Por que o nome da classe aparece na frente dele? Os programadores de C# ficarão confusos com isso.
Em Java, as classes internas são usadas em muitos lugares, e os membros da classe externa podem até ser acessados na classe interna. Neste momento, ao usar this na classe interna, surgirá a questão de quem é e o que é. significa. É a instância do objeto atual da classe interna ou a instância do objeto atual da classe externa?
Em Java, adicionar o nome da classe externa antes disso significa que a instância do objeto atual da classe externa é usada na classe interna.
Vejamos um exemplo abaixo.
//Definição de classe externa
classe pública OuterClass {
//Definição da classe interna
aula privada InnerClass
{
// Não há nenhum membro id definido na classe interna. Aqui acessamos os membros da classe externa.
public int getId(){ return OuterClass.this.id };
public void setId(int id) { OuterClass.this.id = id;}
// O membro do nome é definido na classe interna e os membros da classe interna são acessados diretamente. Por padrão, acessa os membros da classe atual.
nome da string privada;
public String getNome() { return this.nome;}
// Você pode adicionar o nome de uma classe interna antes disso
public void setName(String nome) { InnerClass.this.name = nome;}
// A classe interna também pode acessar membros com o mesmo nome na classe externa, e o nome da classe externa precisa ser adicionado.
public String getOuterName() { return OuterClass.this.name;}
public void setOuterName (String nome) { OuterClass.this.name = nome;}
@Substituir
String pública paraString()
{
return "Id: " + this.getId() + ", Nome Interno: " + this.getName() + ", Nome Externo: " + this.getOuterName();
}
}
//ID e nome do membro definidos na classe externa
id interno privado;
nome da string privada;
private InnerClass innerInstance;
classe externa pública()
{
this.innerInstance = new InnerClass();
this.innerInstance.setId(20);
this.innerInstance.setName("Tom");
this.innerInstance.setOuterName("Alice");
}
String pública paraString()
{
retornar this.innerInstance.toString();
}
}
Em C#, as classes são divididas em classes aninhadas e classes não aninhadas. A primeira é uma classe declarada dentro de outros tipos de dados. A última é uma classe definida diretamente em um determinado namespace. Classes aninhadas raramente são definidas em C#.
As classes não incorporadas permitem apenas o uso de controles de acesso públicos e internos, enquanto as classes integradas permitem o uso de todos os cinco caracteres de controle de acesso, privado, protegido, protegido interno, público e interno. As classes internas também podem acessar todos os métodos da classe externa, incluindo métodos de instância e métodos privados, mas precisam passar explicitamente uma instância da classe externa.
As classes internas em C# podem usar tipos e métodos estáticos definidos por classes externas, mas não podem usar diretamente métodos de instância de classes externas. Portanto, o problema acima não existe.
Em C#, a classe externa atua mais como um namespace para a classe interna. Contanto que o controle de acesso permita, você pode usar o método a seguir para criar uma instância do objeto da classe interna.
OuterClass.InnerClass obj = new OuterClass.InnerClass(); Esta instância não tem relacionamento direto com nenhuma instância da classe externa. Semelhante às classes internas estáticas em Java.
2. Nome da classe.classe e tipo
Em Java, frequentemente vemos o uso da classe name.class. Esse uso é equivalente a typeof (nome da classe) em C#, que é usado para obter a referência da instância do objeto de tipo.
Em Java, cada classe possui um objeto Class correspondente. Quando uma classe é escrita e compilada, um objeto Class é gerado no arquivo .class gerado para representar as informações de tipo da classe. Três maneiras de obter instâncias de classe:
Obtenha a instância Class do objeto chamando o método getClass() da instância do objeto.
Use o método estático forName() de Class para obter uma instância de Class usando o nome da classe. Class.forName(xxx.xx.xx) retorna uma classe. Sua função é solicitar à JVM que encontre e carregue a classe especificada, o que significa que a JVM executará o segmento de código estático da classe.
Obtenha a instância de classe usando o nome de classe .calss Para classes de encapsulamento de tipos de dados básicos, você também pode usar .TYPE para obter a instância de classe do tipo de dados básico correspondente.
A maneira de obter uma instância de um objeto de tipo em C# é mais simples e clara.
Obtido chamando o método GetType() da instância de dados. Este método é herdado de Object, portanto, qualquer objeto em C# possui o método GetType(), x.GetType(), onde x é o nome da variável.
x em typeof(x) deve ser um nome de classe específico, nome de tipo, etc., e não pode ser um nome de variável.
Através do método estático System.Type.GetType() de System.Type.
3. Aula anônima
Em Java, classes anônimas também são usadas com mais frequência. Por exemplo, no Android, ao implementar o monitoramento de botões, você costuma ver códigos como este.
@Substituir
public void onClick(Ver arg0) {
Intenção intenção = nova Intent( MainActivity.this, ActivityFrameLayout.class);
setTitle("FrameLayout");
startActivity(intenção);
}
};
Aqui, OnClickListenter é na verdade uma interface. A interface pode ser usada para criar instâncias de objetos? Claro que não.
Portanto, java cria automaticamente uma classe anônima que implementa a interface aqui. O que criamos é na verdade uma instância de objeto dessa classe anônima.
A vantagem disso é que não precisamos definir uma classe que seja usada apenas uma vez e depois criar instâncias de objetos por meio dessa classe, o que simplifica o desenvolvimento do programa.
Por exemplo, temos a seguinte interface.
instance.onClick(); Em C#, não usaremos este formulário. Através da delegação, a mesma função pode ser alcançada de forma muito simples.
Observe que não há delegados em Java.
Se imprimirmos o tipo desta instância, você verá o tipo real desta classe anônima.
O conceito de atributos deve ser familiar a todos. As funções de membro da classe podem acessar livremente qualquer membro de atributo nesta classe. No entanto, é mais problemático acessar as propriedades de outra classe de uma classe, muitas vezes usamos os métodos Getxxx e Setxxx, o que parece extremamente antinatural. Por exemplo, em Java ou C++, o código é assim:
No entanto, em C#, tais métodos são "atribuídos". O mesmo código, em C#, fica:
foo.size++;
rótulo.font.bold = verdadeiro;
Como você pode ver, C# é obviamente mais fácil de ler e entender. Também podemos ver uma situação semelhante no código da sub-rotina deste "método de propriedade":
Java/C++:
C#:
Para distinguir esse tipo de método atribuído dos membros do atributo da classe, os membros do atributo são chamados de "campos" em C#, e "atributo" torna-se o substantivo especial para esse "método atribuído". A propósito, na verdade, esse tipo de método de atributo é frequentemente encontrado em VB e DELPHI. Em VB, também é chamado de atributo. Além disso, Get e Set devem aparecer em pares em C# Uma propriedade não pode ter apenas Get sem Set (em Java e C++, ela pode ter apenas Get ou apenas Set). Manter. Se você quiser modificar um determinado atributo, prestará atenção aos métodos Get e Set ao mesmo tempo e os modificará ao mesmo tempo.
5. Mecanismo de indexação de objetos (Indexador)
O mecanismo de indexação de objetos foi introduzido em C#. Para ser mais claro, um índice de objeto é na verdade uma matriz de objetos. Vamos falar sobre isso em conexão com as propriedades da seção anterior. As propriedades precisam ocultar os métodos Get e Set, mas no mecanismo de índice, os métodos Get ou Set de cada objeto são expostos. Por exemplo, o exemplo a seguir ilustra este ponto mais claramente. O texto acima apresenta as diferenças entre C# e Java
histórias [índice] = valor;
}
}
}
...
}
O texto acima apresenta as diferenças entre C# e JAVA. Espero que seja útil para você entender C# e JAVA.