最有用的属性

时间:2020-03-06 14:50:09  来源:igfitidea点击:

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

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

解决方案

" [Serializable]"一直用于与外部数据源(例如xml或者远程服务器)之间进行序列化和反序列化。在这里了解更多。

[Flags]非常方便。语法糖可以肯定,但仍然相当不错。

[Flags] 
enum SandwichStuff
{
   Cheese = 1,
   Pickles = 2,
   Chips = 4,
   Ham = 8,
   Eggs = 16,
   PeanutButter = 32,
   Jam = 64
};

public Sandwich MakeSandwich(SandwichStuff stuff)
{
   Console.WriteLine(stuff.ToString());
   // ...
}

// ...

MakeSandwich(SandwichStuff.Cheese 
   | SandwichStuff.Ham 
   | SandwichStuff.PeanutButter);
// produces console output: "Cheese, Ham, PeanutButter"

Leppie指出了一些我尚未意识到的事情,但这削弱了我对该属性的热情:它没有指示编译器允许将位组合用作枚举变量的有效值,而编译器无论如何都允许使用此组合进行枚举。我的C ++背景通过...显示

如果我要进行代码覆盖率爬网,那么我认为这两个将是最高的:

[Serializable]
 [WebMethod]

在霍夫施塔特精神下,[[Attribute]`属性非常有用,因为它是我们创建自己的属性的方式。我使用属性而不是接口来实现插件系统,向Enums添加描述,模拟多个调度和其他技巧。

我认为," System.Obsolete"是框架中最有用的属性之一。发出有关不应再使用的代码的警告的功能非常有用。我喜欢有一种方法可以告诉开发人员不再使用某些东西,并且有一种方法可以解释原因并指出更好/新的方法。

"条件属性"对于调试使用也非常方便。它允许我们在代码中添加用于调试目的的方法,这些方法在构建要发布的解决方案时不会被编译。

然后,我发现很多特定于Web控件的属性很有用,但是这些属性更加具体,在我发现的服务器控件开发之外没有任何用途。

对于它的价值,这里是所有.NET属性的列表。有几百个。

我不认识其他任何人,但是我有一些严肃的RTFM要做!

我发现[DefaultValue]非常有用。

当我们在调试过程中将鼠标悬停在Type的实例上时,[DebuggerDisplay]会非常有用,可以快速查看Type的自定义输出。例子:

[DebuggerDisplay("FirstName={FirstName}, LastName={LastName}")]
class Customer
{
    public string FirstName;
    public string LastName;
}

这是它在调试器中的外观:

替代文字http://serialize.wordpress.com/files/2008/10/temp.jpg

另外,值得一提的是,具有[CacheDuration]属性设置的WebMethod属性可以避免不必要地执行Web服务方法。

我建议从nUnit库中获取[TestFixture][Test]

代码中的单元测试在重构和整理文档时提供了安全性。

我喜欢System.Diagnostics的[DebuggerStepThrough]

避免单步执行这些单行操作方法或者属性(如果我们被迫在没有自动属性的早期.Net中工作),这非常方便。将属性放在短方法或者属性的获取器或者设置器上,即使在调试器中单击" step into",我们也可以正常运行。

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

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

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

我也喜欢劳伦斯·约翰斯顿(Lawrence Johnston)提到的" DefaultValue"。

经常使用" System.ComponentModel.BrowsableAttribute"和" Flags"。

我用
System.STAThreadAttribute System.ThreadStaticAttribute
需要的时候。

顺便一提。对于所有.Net框架开发人员而言,这些价值同样重要。

我最常使用的属性是与XML序列化相关的属性。

XmlRoot

XmlElement

XmlAttribute

等等...

在进行任何快速而肮脏的XML解析或者序列化时非常有用。

只有少数属性获得编译器支持,但是AOP中非常有趣的使用一种属性:PostSharp使用定制的属性将IL注入方法中,从而允许各种方式... log / trace是简单的示例,但还有一些其他好的示例是诸如自动INotifyPropertyChanged实现(此处)之类的东西。

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

  • [Conditional(" FOO")]-仅在构建期间定义了" FOO"符号的情况下,才会发生对此方法的调用(包括参数评估)
  • [MethodImpl(...)]-用于指示一些事情,例如同步,内联
  • [PrincipalPermission(...)]-用于自动将安全检查注入代码中
  • [TypeForwardedTo(...)]-用于在程序集之间移动类型而不重建调用者

对于通过反射手动检查的事情,我非常喜欢System.ComponentModel属性。像[[TypeDescriptionProvider(...)],[[TypeConverter(...)]Editor(...)之类的东西可以完全改变数据绑定场景中类型的行为(例如,动态属性等)。

[TypeConverter(typeof(ExpandableObjectConverter))]

告诉设计器扩展属于类的属性

[Obfuscation]

指示混淆工具对程序集,类型或者成员采取指定的操作。 (尽管通常使用组装级别[assembly:ObfuscateAssemblyAttribute(true)]

[XmlIgnore]

因为这允许我们忽略(在任何xml序列化中)"父"对象,否则它们在保存时会导致异常。

// on configuration sections
[ConfigurationProperty] 

// in asp.net
[NotifyParentProperty(true)]

我最近一直在使用[DataObjectMethod]。它描述了该方法,因此我们可以将类与ObjectDataSource(或者其他控件)一起使用。

[DataObjectMethod(DataObjectMethodType.Select)] 
[DataObjectMethod(DataObjectMethodType.Delete)] 
[DataObjectMethod(DataObjectMethodType.Update)] 
[DataObjectMethod(DataObjectMethodType.Insert)]

更多信息

在当前项目中,我们使用

[ComVisible(false)]

它控制单个托管类型或者成员,或者程序集中所有类型对COM的可访问性。

更多信息

我喜欢将[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属性使我可以将调用的作用域仅限制在有问题的线程上,从而避免了跨线程进行数据访问的麻烦问题。

" DesignerSerializationVisibilityAttribute"非常有用。当我们在控件或者组件上放置运行时属性时,如果我们不希望设计人员对其进行序列化,则可以按以下方式使用它:

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

我总是在用户控件,自定义控件或者我将通过属性网格编辑的任何类的公共属性上使用" DisplayName"," Description"和" DefaultValue"属性。 .NET PropertyGrid使用这些标签来格式化名称,描述面板和未设置为默认值的粗体值。

[DisplayName("Error color")]
[Description("The color used on nodes containing errors.")]
[DefaultValue(Color.Red)]
public Color ErrorColor
{
    ...
}

我只是希望如果找不到XML注释,Visual Studio的IntelliSense将考虑" Description"属性。这样可以避免重复相同的句子两次。

[System.Security.Permissions.PermissionSetAttribute]允许使用声明式安全性将PermissionSet的安全性操作应用于代码。

// usage:
public class FullConditionUITypeEditor : UITypeEditor
{
    // The immediate caller is required to have been granted the FullTrust permission.
    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    public FullConditionUITypeEditor() { }
}

这是有关有趣的属性InternalsVisibleTo的帖子。基本上,它的作用类似于C ++朋友的访问功能。它非常方便进行单元测试。

我的投票将是[有条件的]

[Conditional("DEBUG")]
public void DebugOnlyFunction()
{
    // your code here
}

我们可以使用它来添加具有高级调试功能的功能。像Debug.Write一样,它仅在调试版本中调用,因此允许我们将复杂的调试逻辑封装在程序的主要流程之外。

它没有很好的命名,在框架中没有得到很好的支持,并且不需要参数,但是此属性是不可变类的有用标记:

[ImmutableObject(true)]

[DeploymentItem(" myFile1.txt")]
有关DeploymentItem的MSDN文档

如果要针对文件进行测试或者将文件用作测试的输入,则此功能非常有用。