0

クラスの個々のプロパティをダーティとしてマークしたいと考えています。

ここで、クラス全体をダーティとしてマークする方法に出くわしました。これは次のように簡略化できます。

class DirtyClass
{
    private string bar;
    private int foo;

    public string Bar
    {
        get { return bar; }
        set { SetProperty(ref bar, value); }
    }

    public int Foo
    {
        get { return foo; }
        set { SetProperty(ref foo, value); }
    }

    public bool IsDirty { get; private set; }

    protected void SetProperty<T>(ref T field, T value)
    {
        if (!EqualityComparer<T>.Default.Equals(field, value))
        {
            field = value;
            IsDirty = true;
        }
    }
}

DirtyProperty クラスを作成するためのガイドとしてこのコードを使用しようとしました

class DirtyProperty<T> where T : class
{
    private bool isDirty = true;
    private T property;

    public bool GetIsDirty()
    {
        bool b = isDirty;

        // Reset dirty flag
        isDirty = false;

        return b;
    }

    public T GetValue()
    {
        return property;
    }

    public void SetValue(ref T value)
    {
        if (!EqualityComparer<T>.Default.Equals(property, value))
        {
            property = value;
            isDirty = true;
        }
    }
}

ダーティ フラグは、フレームごとに 1 回だけ呼び出され、DirtyProperty クラスを保持するクラス以外のクラスからは呼び出されないため、GetIsDirty メソッドで false としてマークされます。関数への複数の呼び出しを処理するために isDirty を false としてマークするより良い方法はありますか?

問題は、非参照型 (int など) を使用すると、このアプローチが失敗することです。

class ClassWithDirtyProperties
{
    public DirtyProperty<string> Bar;
    public DirtyProperty<int> Foo;
}

どうすればアプローチを改善し、この問題を解決できますか?

上記のクラスをどのように使用したいかの例

        var c = new ClassWithDirtyProperties();
        c.Foo.SetValue(21);

……

        if (c.Foo.GetIsDirty())
        {
            // Update parameter
            SetParameter(c.Foo.GetValue());
        }
4

2 に答える 2

1
class DirtyProperty<T> where T : class

この行は、 T が参照型であるべきだと言っています。テンプレートとして int を許可する場合は、where 部分を削除します。だからただ言う

class DirtyProperty<T>
于 2012-10-13T13:26:06.137 に答える
0

何の線かわかりますか

where T : class

あなたのコードでは?

T はクラス型、つまり参照型でなければならないというジェネリック型制約です。

T を任意の型にしたい場合は、その行を削除してください。

于 2012-10-13T13:36:56.217 に答える