C# adicionou auto-implemented properties na versão 3, mas o Visual Basic foi incapaz de igualar-se naquele momento. Com a iminente release do .Net 4.0, VB avançou nesta área, mas com um toque diferente. Em C#, auto-implemented properties são escritas da seguinte forma:
public string FirstName {get; set;}
Visual Basic requer a palavra-chave Property, que significa que não precisa do par set/get para distinguir de um atributo comum. Assim, auto-implemented properties no VB são apenas uma nova declaração para um atributo.
Public Property FirstName As String
Para ambos, VB e C#, a propriedade é automaticamente associada a um atributo privado. Em C# este membro tem um nome gerado automaticamente como “<
Ter acesso direto a esse atributo privado deve tornar mais coisas possíveis. Pensando de forma lógica, ao menos uma deveria ser capaz de prover coisas como marcar uma propriedade ReadOnly e informar seu valor pelo construtor. Infelizmente, isso não é uma opção.
Apesar de sua aparente limitação, está realmente mais flexível. Você pode marcar o setter como private ou protected, efetivamente resultando no mesmo efeito quando tendo acesso direto ao atributo privado.
public string FirstName {get; private set;}
Uma limitação para ambas as linguagens é que elas ainda não tem nenhuma feature para objetos imutáveis. Se você quiser objetos onde as propriedades são todas somente leitura e atribuir os valores no construtor, você ainda tem que escrever o mesmo código que escreveria no .Net 1.0.