我知道属性非常有用。有一些预定义的属性,例如[Browsable(false)],它允许您在财产选项卡中隐藏财产。下面是一个解释属性的好问题:.NET中的属性是什么?

您在项目中实际使用的预定义属性(及其名称空间)是什么?


当前回答

只有少数属性获得编译器支持,但AOP中有一个非常有趣的属性用法:PostSharp使用您定制的属性将IL注入到方法中,允许各种功能。。。log/trace是一些微不足道的示例,但其他一些好的示例是自动INotifyPropertyChanged实现(此处)。

一些发生并直接影响编译器或运行时:

[条件(“FOO”)]-只有在生成期间定义了“FOO“符号时,才会调用此方法(包括参数求值)[MethodImpl(…)]-用于指示一些事情,如同步、内联〔PrincipalPermission(…)〕-用于将安全检查自动注入代码[TypeForwardedTo(…)]-用于在程序集之间移动类型,而不重新生成调用方

对于通过反射手动检查的东西,我非常喜欢System.ComponentModel属性;像[TypeDescriptionProvider(…)]、[TypeConverter(…)】和[Editor(…)]]这样的东西可以完全改变数据绑定场景中类型的行为(即动态财产等)。

其他回答

值得一提的是,这里列出了所有.NET属性。有几百个。

我不知道其他人,但我有一些严肃的RTF要做!

作为我喜欢的中间层开发人员

System.ComponentModel.EditorBrowsableAttribute允许我隐藏财产,以便UI开发人员不会被他们不需要看到的财产淹没。

System.ComponentModel.BindableAttribute有些东西不需要数据绑定。同样,减少了UI开发人员需要做的工作。

我也喜欢劳伦斯·约翰斯顿提到的默认值。

System.ComponentModel.BrowsableAttribute和Flags定期使用。

我使用System.STAThreadAttributeSystem.ThreadStaticAttribute当需要时。

顺便说一句这些对所有.Net框架开发人员来说都同样重要。

DesignerSerializationVisibilityAttribute非常有用。当您在控件或组件上放置运行时属性,并且不希望设计器对其进行序列化时,可以这样使用:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Foo Bar {
    get { return baz; }
    set { baz = value; }
}

我认为这里必须提到以下属性也非常重要:

STAThreadAttribute 

指示应用程序的COM线程模型是单线程单元(STA)。

例如,此属性用于Windows窗体应用程序:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

而且。。。

SuppressMessageAttribute

禁止报告特定的静态分析工具规则冲突,允许对单个代码工件进行多次禁止。

例如:

[SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "isChecked")]
[SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "fileIdentifier")]
static void FileNode(string name, bool isChecked)
{
    string fileIdentifier = name;
    string fileName = name;
    string version = String.Empty;
}

我喜欢将[ThreadStatic]属性与基于线程和堆栈的编程结合使用。例如,如果我希望一个值与调用序列的其余部分共享,但我希望在带外(即调用参数之外)执行,我可以使用类似的方法。

class MyContextInformation : IDisposable {
    [ThreadStatic] private static MyContextInformation current;

    public static MyContextInformation Current {
        get { return current; }
    }

    private MyContextInformation previous;


    public MyContextInformation(Object myData) {
       this.myData = myData;
       previous = current;
       current = this;
    }

    public void Dispose() {
       current = previous;
    }
}

稍后在我的代码中,我可以使用它向代码下游的人提供带外的上下文信息。例子:

using(new MyContextInformation(someInfoInContext)) {
   ...
}

ThreadStatic属性允许我将调用范围仅限于所讨论的线程,避免了跨线程访问数据的混乱问题。