私はこれをしていました:
public string FirstName
{
get
{
//Actual Code was doing something to change the value here
this._FirstName = "Hello";
this.OnPropertyChanged("FirstName");
return this._FirstName;
}
set {
if (this._FirstName == value)
return;
this._FirstName = value;
this.OnPropertyChanged("FirstName");
}
}
ご覧のとおり、FirstName プロパティ内で FirstName プロパティの変更を行っています。これは無限ループになると予想していましたが、FirstName
ゲッターは自分自身を呼び出し続けます。しかし、奇妙なことは起こりません。
次に、raise プロパティの変更を内部に入れようとしましたBackgroundWorker
。
public string _FirstName { get; set; }
public string FirstName
{
get
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
Thread.Sleep(2000);
};
worker.RunWorkerCompleted += (sender, e) =>
{
this._FirstName = "Hi Hi";
this.OnPropertyChanged("FirstName");
};
worker.RunWorkerAsync();
return this._FirstName;
}
set {
if (this._FirstName == value)
return;
this._FirstName = value;
this.OnPropertyChanged("FirstName");
}
}
ほら、今度は無限ループ。 しかし、なぜ最初のケースで起こらないのでしょうか?
PS私はプログラムを壊そうとしているのではなく、他の人のプログラムをデバッグしているだけで、最初のケースのようにここで似たようなことをしていました。しかし、プロパティは2回目に呼び出されていません。
更新: テスト ケース 2 の StackTrace:
このプロパティを TextBox にバインドしてテストし、FirstName
getter にブレークポイントを設定すると、ブレークポイントが無限にヒットすることがわかりました。
at Person.get_FirstName()
at RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at RuntimePropertyInfo.GetValue(Object obj, Object[] index)
at CLRPropertyListener.get_Value()
at PropertyAccessPathStep.get_Value()
at PropertyPathListener.ReconnectPath()
at <>c__DisplayClass4.<BreakOnSharedType>b__3()
at RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder......