C# 3.0では自動実装プロパティが追加されたが、同時にリリースされたVisual Basicにはこれに相当する機能がなかった。近々リリースされる.NET 4.0では、独特なところはあるものの、VBも自動実装プロパティを持つことになる。C#の自動実装プロパティはこのように書く。
public string FirstName {get; set;}
Visual BasicではプロパティにPropertyキーワードが必要なので、フィールドと区別するためにget/setのペアが必要ない。従って、VBでの自動実装プロパティはフィールドとたった1トークンだけが異なる。
Public Property FirstName As String
VBでもC#でも、自動実装プロパティに対応するフィールドが自動的に作られる。C#では自動的に生成された“<FirstName>k__BackingField”のような名前を持つ。もちろん、このフィールドは通常のC#の構文からはアクセスできない。Visual Basicはずっと単純で、単にプロパティ名の先頭にアンダースコアをつけるだけである。だから、プロパティの名前が“FirstName”ならば、“_FirstName”というフィールドができることになる。
バッキングフィールドへの直接アクセスはもっと多くのことを可能にすべきだ。そのひとつとして、プロパティをReadOnlyにし、コンストラクタでその値をセットできるようにすべきだ。悲しいかな、そのようなことはできない。
C#にもそのような制限があるように見えるが、実際にはもっと柔軟である。セッターにprivateかprotectedをつければ、事実上バッキングフィールドにアクセスするのと同じことができる。
public string FirstName {get; private set;}
両言語に共通する制限は、まだ不変オブジェクト(immutable object)を作成するための便利な方法を持たないことだ。もし全てのプロパティやフィールドが読み取り専用で、それらの値がコンストラクタだけからセットされるようにするなら、まだ.NET 1.0の時と同じようにコードを書かなければならない。