Como sabemos membros compartilhados de uma classe, são membros que conseguimos acessar sem a necessidade da criação da instancia desta classe, podendo assim chamarmos o método ou propriedade e já obtemos o seu valor (ou uma Expcetion :P).
Algo que venho me atentando é que é perfeitamente possível acessar um membro compartilhado a partir de uma instancia de uma classe no VB.NET, mas no C# isso já não é possível. Independentemente disso, o código final gerado é o mesmo, ou seja, tanto o código escrito em VB.NET quanto o código escrito em C# “chamam” o membro compartilhado diretamente através da sua classe e não da instancia criada. Abaixo a prova:
[ VB.NET ]
Public Class Teste
Public Shared Function MeuNome() As String
Return “Israel Aéce”
End Function
Public Function Profissao() As String
Return “Developer”
End Function
End Class
Module Module1
Sub Main()
Dim t As New Teste
Console.WriteLine(t.MeuNome())
Console.WriteLine(t.Profissao())
End Sub
End Module
[ C# ]
public class Teste{
public static string MeuNome(){
return “Israel Aéce”;
}
public string Profissao(){
return “Developer”;
}
}
static void Main(string[] args){
Teste t = new Teste();
Console.WriteLine(Teste.MeuNome());
Console.WriteLine(t.Profissao());
}
Se fizermos o teste, veremos que nem será possível chamar o método compartilhado através de um instancia no C#, não sequer aparecendo no Intellisense, mas no VB.NET, isso é permitido pelo compilador. Finalmente o código gerado para o código acima é identico em ambas as linguagens:
Public Shared Sub Main()
Dim teste1 As New Teste
Console.WriteLine(Teste.MeuNome)
Console.WriteLine(teste1.Profissao)
End Sub
Já que independentemente da linguagem, o código final gerado é identico, será isso um truque do compilador do VB.NET? De toda forma, não vejo motivo pelo qual a MS possibilita isso no VB.NET. Talvez porque o mesmo é considerado como uma linguagem de programação mais voltada para pessoas sem experiencia?