WPFコアベースクラス(1)-dispatcherObject、DependenceObject


WPFのコアベースクラスDispatcherObjectとDependenceObjectについて理解します.
dnetフレームワークはhttps://referencesource.microsoft.comのウェブサイトにコードを公開した.参照のために、各クラスにはヘッダーに参照ソースリンクが掛けられています.
クラス別に公開されたインタフェース(関数,Property)のみをコードに簡略に加える.

DispatcherObject


生成されたスレッドからアクセスする必要があるオブジェクトなので、継承されたオブジェクトはThread Safeを保証しません.
public abstract class DispatcherObject {
	public Dispatcher Dispatcher { get; }
    public bool CheckAccess();
    public void VerifyAccess();
}
CheckAccess、VerifyAccess、Dispatcher(getter)は、フリースレッドでアクセスできます.
bool checkAccess()の場合、生成したスレッドからアクセスしたかどうかを返します.内部はDispatcherThreadとThreadCurrentThreadが同じかどうかを確認します.
void VerifyAccess()は、生成されたスレッドがアクセスされていない場合に異常を発生します.(InvalidOperationException)

DependencyObject


Dependencepropertyをサポートする基本クラス
public abstract class DependencyObject : DispatcherObject
{
	DependencyObjectType DependencyObjectType { get; }
	bool IsSealed { get; }
	void ClearValue(DependencyProperty dp);
	void ClearValue(DependencyPropertyKey key);
	void CoerceValue(DependencyProperty dp);
	LocalValueEnumerator GetLocalValueEnumerator();
	object GetValue(DependencyProperty dp);
	void InvalidateProperty(DependencyProperty dp);
	object ReadLocalValue(DependencyProperty dp);
	void SetCurrentValue(DependencyProperty dp, object value);
	void SetValue(DependencyProperty dp, object value);
	void SetValue(DependencyPropertyKey key, object value);
}
DependencyPropertyには複数のインタフェースが用意されています.
DependenceObjectType内部キャッシュは、DependenceObjectのタイプを継承する識別子です.DependencyObjectType Propertyは、実行時に現在のタイプの識別子を返します.
bool IsSealedは、オブジェクトが読み取り専用であることを示します.
あとはDependencyPropertyを勉強しましょう

追加


参考資料を見ていると、DependencyObjectは派生クラスEqualsとGetHashCodeの過剰使用を阻止していることが明らかになった.
// DependencyObject.cs
public override sealed bool Equals(Object obj)
{
	return base.Equals(obj);
}

public override sealed int GetHashCode()
{
	return base.GetHashCode();
}
DependencyObject.cs議長は、Equals overlightが合理的だと考えている状況は2つあると述べた.
  • 値タイプ(コピーによる)
  • 可変オブジェクト:
  • DependencyObjectは参照タイプなので、一度に
    依存オブジェクトを継承するオブジェクトには依存属性があるため、依存オブジェクトは不変のオブジェクトではありません.
    そのため、EqualsとGetHashCodeの過剰使用を阻止した.