实现DependencyProperty的最佳方法是什么,还要避免'CA2104:不要声明只读可变引用类型'?

时间:2012-06-14 23:54:19

标签: .net dependency-properties code-analysis fxcop

在避免CA2104 (Do not declare readonly mutable reference types)的代码分析警告的同时,实现依赖项属性的最佳方式(或者有没有办法)是什么?

MSDN documentation建议使用这种方式声明你的依赖属性:

  public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
    "State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));

但这会导致CA2104。这很容易压制,但我只是想知道是否有更好的方法。

2 个答案:

答案 0 :(得分:2)

这是假阳性; DependencyProperty是不可变的。

您可以使用属性而不是字段,但是您需要在静态构造函数中设置它,从而触发另一个警告。

答案 1 :(得分:0)

编辑:经过进一步的反思,我认为此警告很糟糕。 CA2104的整个想法是你可以抓住指针并用它来修改对象的内容。在附加属性上使用“获取”操作不能解决根本问题,它只是欺骗代码分析接受模式。处理这个问题的正确方法是忽略项目属性中的CA2104,因为在一个具有公共DependencyProperty类的世界中,这是一个愚蠢的警告。

此警告似乎在Metro中无效,因为DependencyProperties是不可变的。但是,它似乎在WPF中有效,因为如果您具有对DependencyProperty的可写引用,则可以添加所有者或弄乱元数据。这是代码并且不是很好,但是它通过了FXCop指南。

    /// <summary>
    /// Identifies the Format dependency property.
    /// </summary>
    private static readonly DependencyProperty labelPropertyField = DependencyProperty.Register(
        "Label",
        typeof(String),
        typeof(MetadataLabel),
        new PropertyMetadata(String.Empty));

    /// <summary>
    /// Gets the LabelProperty DependencyProperty.
    /// </summary>
    public static DependencyProperty LabelProperty
    {
        get
        {
            return MetadataLabel.labelPropertyField;
        }
    }

    /// <summary>
    /// Gets or sets the format field used to display the <see cref="Guid"/>.
    /// </summary>
    public String Label
    {
        get
        {
            return this.GetValue(MetadataLabel.labelPropertyField) as String;
        }

        set
        {
            this.SetValue(MetadataLabel.labelPropertyField, value);
        }
    }