我知道属性非常有用。 有一些预定义的,如[Browsable(false)]
,其可以隐藏在属性标签属性。 下面是一个很好的问题,解释属性: 什么是.NET属性?
什么是预定义的属性(和其命名空间)你在你的项目中实际使用?
我知道属性非常有用。 有一些预定义的,如[Browsable(false)]
,其可以隐藏在属性标签属性。 下面是一个很好的问题,解释属性: 什么是.NET属性?
什么是预定义的属性(和其命名空间)你在你的项目中实际使用?
[DebuggerDisplay]
可以真正有用的调试过程中快速查看一个类型的自定义输出时,在类型的情况下,你的鼠标。 例:
[DebuggerDisplay("FirstName={FirstName}, LastName={LastName}")]
class Customer
{
public string FirstName;
public string LastName;
}
这是它应该如何看在调试器:
另外,值得一提的是, [WebMethod]
与属性CacheDuration
属性集可避免web服务方法的不必要的执行。
System.Obsolete
是在框架中最有用的特征之一,在我看来。 提高对应该不再使用代码警告的能力是非常有用的。 我喜欢有一种方法来告诉开发者的东西不应该再被使用,以及具有一种方式来解释为什么和指向做某件事的更好/新途径。
在Conditional attribute
是非常方便得进行调试使用。 它可以让你在代码中添加方法,当你建立你的发布解决方案,将不会编译调试。
然后有很多特定的Web控件,我觉得有用的特征,但这些更加具体,没有从我所发现的服务器控件的开发之外的其他任何用途。
[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 ++背景显示通过...... 叹
我喜欢[DebuggerStepThrough]
从System.Diagnostics程序 。
这是为了避免步入这些单行什么也不做的方法或属性(如果你不得不在净早期工作不自动属性),非常方便。 穿上短方法或属性的getter或setter的属性,你会被击中,即使“步入”中的调试器时飞行的权利。
对于它的价值,这里是所有.NET属性的列表 。 有几百个。
我不知道别人,但我有一些严重的RTFM做!
我的投票将是[Conditional]
[Conditional("DEBUG")]
public void DebugOnlyFunction()
{
// your code here
}
你可以用它来添加功能与高级调试功能; 像Debug.Write
,它只是调用调试版本,所以可以让你封装程序的主流之外的复杂调试逻辑。
我总是用DisplayName
, Description
和DefaultValue
的属性在我的用户控件,自定义控件,不然我会通过属性编辑网格中任何一类的公共属性。 这些标签由.NET的PropertyGrid用于格式化名称,说明面板,加粗未设置为默认值的值。
[DisplayName("Error color")]
[Description("The color used on nodes containing errors.")]
[DefaultValue(Color.Red)]
public Color ErrorColor
{
...
}
我只是希望Visual Studio的智能感知将采取Description
属性考虑,如果没有XML注释中找到。 这将避免重复同一句话两次。
[Serializable]
使用所有的时间用于序列化和反序列化对象,并从外部数据源,如XML或从远程服务器。 更多关于它在这里。
在Hofstadtian精神, [Attribute]
属性是非常有用的,因为它是你如何创建自己的属性。 我使用的属性,而不是接口来实现插件系统,添加说明,以枚举,模拟多个调度和其他技巧。
下面是关于有趣的属性后InternalsVisibleTo 。 基本上它它模仿C ++的朋友访问功能。 它有单元测试非常方便。
我发现[DefaultValue]
是非常有用的。
我建议[TestFixture]
和[Test]
-从NUnit的库。
在你的代码单元测试提供重构和编纂文档的安全性。
[XmlIgnore]
因为这可以让你忽略(在任何XML序列化)保存时,否则将导致异常“父”对象。
这不是良好的命名,不能很好地支持在框架中,并且不应该需要一个参数,但这个属性是不可改变的一类有用的标志:
[ImmutableObject(true)]
我喜欢使用[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属性可以让我的范围仅仅调用线程的问题避免跨线程的数据访问凌乱的问题。
所述DebuggerHiddenAttribute其允许避免步骤为代码不应该被调试。
public static class CustomDebug
{
[DebuggerHidden]
public static void Assert(Boolean condition, Func<Exception> exceptionCreator) { ... }
}
...
// The following assert fails, and because of the attribute the exception is shown at this line
// Isn't affecting the stack trace
CustomDebug.Assert(false, () => new Exception());
此外,它从表示栈跟踪方法防止的,有用的具有只是包装的另一种方法的方法时:
[DebuggerHidden]
public Element GetElementAt(Vector2 position)
{
return GetElementAt(position.X, position.Y);
}
public Element GetElementAt(Single x, Single y) { ... }
如果现在请GetElementAt(new Vector2(10, 10))
并在包裹方法中发生错误,则调用堆栈没有显示其被调用哪个引发错误的方法,所述方法。
DesignerSerializationVisibilityAttribute
是非常有用的。 当你把一个运行时属性上的控件或组件,并且你不想设计师序列化,你使用这样的:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Foo Bar {
get { return baz; }
set { baz = value; }
}
只有少数属性得到编译器的支持,但一个非常有趣的使用属性是AOP: PostSharp使用您定制的属性注入IL进入方法,使能力的所有方式...日志/跟踪是简单的例子-但其他一些很好的例子事情像自动INotifyPropertyChanged的实现( 在这里 )。
有些实际发生的直接影响编译或运行时 :
[Conditional("FOO")]
-调用此方法(包括参数评估)如果“FOO”符号构建期间定义仅发生 [MethodImpl(...)]
-用来表示像同步几件事,内联 [PrincipalPermission(...)]
-用于自动注射的安全检查到代码 [TypeForwardedTo(...)]
-用于移动组件之间的类型不重建呼叫者 对于那些通过反射人工检查的东西-我是一个大风扇的System.ComponentModel
属性; 之类的东西[TypeDescriptionProvider(...)]
, [TypeConverter(...)]
,和[Editor(...)]
,其可以完全改变的类型的数据绑定方案的行为(即,动态特性等)。
我一直在使用[DataObjectMethod]
最近。 它描述的方法,以便你可以使用你的类ObjectDataSource控件(或其他控件)。
[DataObjectMethod(DataObjectMethodType.Select)]
[DataObjectMethod(DataObjectMethodType.Delete)]
[DataObjectMethod(DataObjectMethodType.Update)]
[DataObjectMethod(DataObjectMethodType.Insert)]
更多信息
如果我做一个代码覆盖率爬,我觉得这两个是顶:
[Serializable]
[WebMethod]
在我们目前的项目中,我们使用
[ComVisible(false)]
它控制个体管理类型或成员的可访问性,或组件内的所有类型,到COM的。
更多信息
[TypeConverter(typeof(ExpandableObjectConverter))]
告诉设计师,扩大它们的类(你的控制)的属性
[Obfuscation]
指示模糊处理工具承担一个组件,类型或成员的指定的动作。 (虽然通常使用的装配水平[assembly:ObfuscateAssemblyAttribute(true)]
我用的最多的属性与XML序列化的人。
XmlRoot
XmlElement
XmlAttribute
等等...
做任何快速和肮脏的XML解析或序列化时非常有用。
作为一个中间层开发人员,我喜欢
System.ComponentModel.EditorBrowsableAttribute
允许从而使UI开发人员不与他们并不需要看到此番的属性我隐藏属性。
System.ComponentModel.BindableAttribute
有些事情不需要进行数据绑定。 再次,减轻工作的UI开发人员需要做的。
我也很喜欢DefaultValue
是劳伦斯·约翰斯顿提及。
System.ComponentModel.BrowsableAttribute
和Flags
是经常使用的。
我用System.STAThreadAttribute System.ThreadStaticAttribute
需要的时候。
顺便说说。 我这些只是所有的.Net框架开发的价值。
[EditorBrowsable(EditorBrowsableState.Never)]
允许你从智能感知隐藏属性和方法,如果该项目不在您的解决方案。 很有帮助用于隐藏流利的接口无效流量。 你想GetHashCode()方法还是equals()多久?
对于MVC [ActionName("Name")]
可以让你有一个获取动作和动作后用同样的方法签名,或者在动作的名称,否则将没有为它创建路由可以使用破折号。
把我的头顶部,这里是一个快速列表,按使用频率大致排序,预定义属性的我居然在一个大的项目(50万〜LOCS)使用方法:
标志,序列化,的WebMethod,标记有ComVisible特性,类型转换器,有条件的,ThreadStatic,过时的,InternalsVisibleTo,DebuggerStepThrough。
我认为在这里指出,下面的属性也是非常重要的,重要的是:
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;
}
[DeploymentItem("myFile1.txt")]
上DeploymentItem MSDN文档
如果你正在测试针对文件或使用该文件作为输入到你的测试,这是非常有用的。
我通过CodeSmith中产生的数据实体类和我使用的属性进行一些验证程序。 下面是一个例子:
/// <summary>
/// Firm ID
/// </summary>
[ChineseDescription("送样单位编号")]
[ValidRequired()]
public string FirmGUID
{
get { return _firmGUID; }
set { _firmGUID = value; }
}
而我得到了一个实用工具类做基于连接到数据实体类的属性进行验证。 下面是代码:
namespace Reform.Water.Business.Common
{
/// <summary>
/// Validation Utility
/// </summary>
public static class ValidationUtility
{
/// <summary>
/// Data entity validation
/// </summary>
/// <param name="data">Data entity object</param>
/// <returns>return true if the object is valid, otherwise return false</returns>
public static bool Validate(object data)
{
bool result = true;
PropertyInfo[] properties = data.GetType().GetProperties();
foreach (PropertyInfo p in properties)
{
//Length validatioin
Attribute attribute = Attribute.GetCustomAttribute(p,typeof(ValidLengthAttribute), false);
if (attribute != null)
{
ValidLengthAttribute validLengthAttribute = attribute as ValidLengthAttribute;
if (validLengthAttribute != null)
{
int maxLength = validLengthAttribute.MaxLength;
int minLength = validLengthAttribute.MinLength;
string stringValue = p.GetValue(data, null).ToString();
if (stringValue.Length < minLength || stringValue.Length > maxLength)
{
return false;
}
}
}
//Range validation
attribute = Attribute.GetCustomAttribute(p,typeof(ValidRangeAttribute), false);
if (attribute != null)
{
ValidRangeAttribute validRangeAttribute = attribute as ValidRangeAttribute;
if (validRangeAttribute != null)
{
decimal maxValue = decimal.MaxValue;
decimal minValue = decimal.MinValue;
decimal.TryParse(validRangeAttribute.MaxValueString, out maxValue);
decimal.TryParse(validRangeAttribute.MinValueString, out minValue);
decimal decimalValue = 0;
decimal.TryParse(p.GetValue(data, null).ToString(), out decimalValue);
if (decimalValue < minValue || decimalValue > maxValue)
{
return false;
}
}
}
//Regex validation
attribute = Attribute.GetCustomAttribute(p,typeof(ValidRegExAttribute), false);
if (attribute != null)
{
ValidRegExAttribute validRegExAttribute = attribute as ValidRegExAttribute;
if (validRegExAttribute != null)
{
string objectStringValue = p.GetValue(data, null).ToString();
string regExString = validRegExAttribute.RegExString;
Regex regEx = new Regex(regExString);
if (regEx.Match(objectStringValue) == null)
{
return false;
}
}
}
//Required field validation
attribute = Attribute.GetCustomAttribute(p,typeof(ValidRequiredAttribute), false);
if (attribute != null)
{
ValidRequiredAttribute validRequiredAttribute = attribute as ValidRequiredAttribute;
if (validRequiredAttribute != null)
{
object requiredPropertyValue = p.GetValue(data, null);
if (requiredPropertyValue == null || string.IsNullOrEmpty(requiredPropertyValue.ToString()))
{
return false;
}
}
}
}
return result;
}
}
}
[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() { }
}