C#中属性的目的是什么?

时间:2010-09-09 05:12:50

标签: c# .net class attributes

  • C#中属性的目的是什么?

  • 我如何知道哪个属性必须用于特定功能?

  • 如何在c#中动态添加它们?

  • 什么是自定义属性?

8 个答案:

答案 0 :(得分:10)

  1. 属性用于添加有关类,函数等的其他信息。编译器在查看属性时有时会执行特殊操作。程序运行时,库会查看其他属性。

  2. 首先查看文档以了解所需的功能。它应列出必要的属性。

  3. 没有。只能在编译代码之前应用属性。

  4. 这只是您自己创建的一个属性,而不是.NET附带的属性。

答案 1 :(得分:7)

当你编写代码时,你会回答“什么?”问题:

  1. 怎么办? (方法)
  2. 要存储什么? (字段和属性)
  3. 什么是什么? (类层次结构)
  4. 等。属性为此问题添加了另一个维度。他们回答“怎么样?”题。并回复“如何?”问题可能对IDE很重要,

    [Browsable(false)]
    public string NotImportantField { get; set; } // property which will not be displayed in VS
    

    用于编译器

    [ThreadStatic]
    private static RequestContext context; // field which will be different for every thread
    

    或另一个通过反思分析你的代码。

    [XmlIgnore]
    public string NotSerializableField { get; set; } // property which will not be xml-serialized
    

    如果您的程序集,类,字段,方法等将通过反射进行分析或调用,您可能希望定义自定义属性(例如,通常会出现控制容器和面向方面编程的反转)。此类属性可能(通常是唯一的方法)指示调用者或分析器根据此类属性的存在或其属性进行不同的行为。

    关于您的第一个问题,以及我们如何知道要为特定结果调用哪种方法?作为.NET开发人员的一个优点是,所有内容都记录得非常彻底。 :)

答案 2 :(得分:4)

属性用于声明性编程模型

属性不强制执行任何功能(除非开箱即用)。 对于开箱即用的属性,请阅读msdn 上的文档。对于您自己的属性,您需要编写有关类/方法等具有属性的代码。

我不认为属性是动态添加的。它们是动态阅读的。 它们是元数据,因此在编译时添加。检查一下:Can attributes be added dynamically in C#?

自定义属性是您使用创建和标记类的属性。要创建属性,您需要创建一个继承自System.Attribute的类(对于该属性)。检查一下:http://msdn.microsoft.com/en-us/library/sw480ze8.aspx

答案 3 :(得分:3)

属性用于元编程。元编程可帮助您在运行时使用代码实现动态。假设你的班级有10个道具,你想要因某些原因只读一些特定的道具,为此你会对这些道具应用一些特殊的属性,在运行时,通过反射,你会要求只过滤那些具有给定特殊的道具。属性,然后在这些道具上执行你的工作。这只是一个例子。

在我们的例子中,我们有属性驱动的验证框架。所以,如果想要一个道具。在将对象保存到数据库之前不要保留为空,我们将其标记为NotNullOrEmpty属性,并且基类将具有一个方法Validate(),该方法将在将对象保存到数据库之前调用。 Validate()方法将过滤obj。道具。使用Validatable属性并执行验证并在违反情况下抛出异常。

答案 4 :(得分:1)

属性用于提供有关类中的元数据以及类中的方法,属性和事件。

一些最常见的属性用于告诉Designer有关类中属性的信息,例如BrowsableDescription。然后,PropertyGrid使用此元数据。其他属性示例包括序列化期间使用的SerializableObsolete属性,或将代码元素标记为过时。

您可以使用[AttributeName(parameter1,...)]语法向类,属性,方法和事件添加属性。

自定义属性是指从System.Attribute派生的属性,这些属性不是.NET框架中的标准属性。

答案 5 :(得分:1)

设置诸如DEBUG,DEV,STAGING,PROD,Etc之类的不同环境时,经常使用属性。

  [Conditional("DEBUG")]
        private void OutputDebugInfo()
        {
            WriteLine("***DEBUG MODE ***");
        }

答案 6 :(得分:0)

当您想为编程语句指定某种约束时,使用属性:

Exapmple:

[StructLayout(LayoutKind::Sequential)]
value struct Point
{
public:
   int x;
   int y;
};

上面你定义了结构应该是顺序结构。

另一个例子是:

 [DllImport("user32.dll",CallingConvention=CallingConvention::StdCall)]

在这里,您指定使用DLLImport通过使用属性导入dll。我希望你能找出属性的目的是什么。

现在如何知道使用哪些属性以及哪些功能与您学习函数,代理和事件的方式相同...随着时间的推移和使用它。也许很多人可能会为你回答同样的问题。

答案 7 :(得分:0)

如果您想要一个非常有用的示例,其中属性可能有用,以及如何使用反射代码来访问它们,请检查Enum ToString。使用该代码,可以轻松地将ComboBox绑定到您的枚举,以获得类型安全选择,以及非常易读的描述:

public static void ComboItemsFromEnum<EnumType>(ComboBox combobox) where EnumType : struct
{
    combobox.FormattingEnabled = true;
    foreach (object enumVal in System.Enum.GetValues(typeof(EnumType)))
    {
        combobox.Items.Add(enumVal);
    }
    combobox.Format += delegate(object sender, ListControlConvertEventArgs e)
    {
        e.Value = GetDescription<EnumType>(e.Value);
    };
}