質問

私が言ったように、プロパティのプロパティの設定に問題があります。トランザクションを表すクラスがあるとしましょう。私のクラスには、次のような別のクラスを表すプロパティがあります:

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)

コードのステップスルー...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top