最有用的属性
我知道属性非常有用。有一些预定义的属性,例如" [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文档
如果要针对文件进行测试或者将文件用作测试的输入,则此功能非常有用。