1

StyleCop を使用してプロジェクト ファイルをクリーンアップしていますが、次のような問題があり、解決できません。

PasswordPolicyCollection.cs (13): CA2214 : Microsoft.Usage : 'PasswordPolicyCollection.PasswordPolicyCollection()' には、クラスによって定義された仮想メソッドへの呼び出しをもたらす呼び出しチェーンが含まれています。意図しない結果については、次の呼び出し履歴を確認してください。 PasswordPolicyCollection..ctor() ConfigurationElementCollection.CreateNewElement():ConfigurationElement PasswordPolicyCollection.Add(PasswordPolicy):Void

コードは次のとおりです。

using System.Configuration;

public class PasswordPolicyCollection : ConfigurationElementCollection
{
    public PasswordPolicyCollection()
    {
        var passwordPolicy = (PasswordPolicy)this.CreateNewElement();
        this.Add(passwordPolicy);
    }

    public override ConfigurationElementCollectionType CollectionType
    {
        get
        {
            return ConfigurationElementCollectionType.AddRemoveClearMap;
        }
    }

    public new PasswordPolicy this[string name]
    {
        get
        {
            return (PasswordPolicy)BaseGet(name);
        }
    }

    public PasswordPolicy this[int index]
    {
        get
        {
            return (PasswordPolicy)BaseGet(index);
        }

        set
        {
            if (BaseGet(index) != null)
            {
                BaseRemoveAt(index);
            }

            BaseAdd(index, value);
        }
    }

    public void Add(PasswordPolicy passwordPolicy)
    {
        this.BaseAdd(passwordPolicy);
    }

    public int Indexof(PasswordPolicy policy)
    {
        return BaseIndexOf(policy);
    }

    public void Remove(PasswordPolicy url)
    {
        if (BaseIndexOf(url) >= 0)
            BaseRemove(url.Name);
    }

    public void RemoveAt(int index)
    {
        BaseRemoveAt(index);
    }

    public void Remove(string name)
    {
        BaseRemove(name);
    }

    public void Clear()
    {
        BaseClear();
    }

    protected override void BaseAdd(ConfigurationElement policy)
    {
        BaseAdd(policy, false);
    }

    protected override sealed ConfigurationElement CreateNewElement()
    {
        return new PasswordPolicy();
    }

    protected override object GetElementKey(ConfigurationElement policy)
    {
        return ((PasswordPolicy)policy).Name;
    }
}

何か案は?

4

2 に答える 2

4

コンストラクター内で Add メソッドを呼び出します。このメソッド内で、封印されていない BaseAdd メソッドを呼び出すため、警告が表示されます。このコード分析の警告を取り除くには、BaseAdd メソッドを封印する必要があります

protected override sealed void BaseAdd(ConfigurationElement policy)
{
    BaseAdd(policy, false);
}
于 2013-10-25T10:16:27.020 に答える
3

実はこれは stylecop の警告ではなく、コード分析 (FxCop) の警告です。

コンストラクターで仮想メソッドを呼び出しています (CreateNewElementオーバーライドしました)。通常、これを行うべきではありません。コンストラクターが C# でどのように機能するかによって、基本コンストラクター ( ConfigurationElementCollection.ctor) が最初に呼び出されますCreateNewElementが、最も派生したクラス、つまりオーバーライドしたクラスが実行されるためです。

コンストラクターでの仮想メンバー呼び出しを参照してください。

于 2013-10-25T09:58:12.083 に答える