プロパティのプロパティを設定できません
-
06-07-2019 - |
質問
私が言ったように、プロパティのプロパティの設定に問題があります。トランザクションを表すクラスがあるとしましょう。私のクラスには、次のような別のクラスを表すプロパティがあります:
Public Class PersonRecord
_myPerson = new Person()
Public Property MyPerson as Person
Get
_myPerson = Person.GetAppropriatePerson(Me.PersonID)
return _myPerson
End Get
Set
_myPerson = value
End Set
End Property
つまり、本質的に適切な人物を取得するgetフィルターを持つプロパティがあります。問題は、プロパティを介してPersonの情報を設定する場合、VBは次のように、それを行ったことさえ無視するように見えることです:
Me.myPersonRecord.Person.Name = "Some Name"
しかし、これを監視すると、プロパティを設定しても値は変わりません。私はこの振る舞いに戸惑っています。私が間違っていることはありますか?ありがとう!
解決
get .MyPerson
を実行するたびに、関数 Person.GetAppropriatePerson
が呼び出されます。
その関数の実装はわかりませんが、呼び出されるたびに新しいPersonオブジェクトを返すと思います。
1つのPersonインスタンスの名前を変更します。次回 .MyPerson
を呼び出すと、別のPersonインスタンスが返されます。
これがどのように機能するかによって、たとえば、いくつかのことができます:
- コンストラクターで
GetAppropriatePerson
を呼び出します(その時点でpersonidがわかっている場合)。戻り値を_myPerson
に割り当て、MyPerson
プロパティを読み取り専用にします。 - または
_myPerson
をnull
に初期化し、MyPerson
ゲッターにif _myPerson == null Then _myPerson = GetAppropriatePersonなどがある。
他のヒント
コピーアンドペーストエラーかどうかはわかりませんが、プロパティの取得部分で毎回 _myPerson
を上書きしているようです。それはおそらく「あなたの名前」を引き起こすでしょう。上書きするには:-)
編集 do'h、codeapeは私の前に同じことを言っています:-)
このようなプロパティの遅延初期化の一般的なパターンは、上書きする前にオブジェクトがnullかどうかをチェックする次のようなことをすることです。
Public Property MyPerson as Person
Get
If _myPerson Is Nothing Then
_myPerson = Person.GetAppropriatePerson(Me.PersonID)
End If
return _myPerson
End Get
_myPerson
の初期化を、 dim _myPerson as New Person()
ではなく、まっすぐな dim _myPerson as Person
に変更する必要があります。 >あまりにも
次の行で変更される必要があります。 _myPerson = Person.GetAppropriatePerson(Me.PersonID)
コードのステップスルー...