C# 属性

属性是声明性代码,用于在程序运行时传达有关各种元素(类、方法、结构、枚举等)的行为信息。诸如编译器指令、注释、描述、方法和类信息之类的元数据可以使用属性添加到程序中。 .Net Framework 提供了两种类型的属性:预定义属性和自定义属性。

在 C# 中,属性具有以下属性:

  • 可以使用功能将元数据添加到您的程序中。元数据是指有关程序内各种元素的信息。每个 .NET 程序都包含一组指定的元数据。
  • 您可以将一个或多个属性应用于整个程序、模块或小型程序元素(例如类或属性)。
  • 特征可以接受方法和属性等参数。
  • 程序可以使用反射来检查自己的元数据和其他程序的元数据。

1. 定义特征

C# 中定义属性的语法为:

[attribute(positional_parameters, name_parameter = value, …)]
element

其中, [ ]用于定义特征的名称和值,positional_parameters用于指定基本信息,name_parameter用于指定可选信息。

2. 预定义功能

.Net Framework 提供了三个预定义属性:

  • 属性使用。
  • 有条件的。
  • 废除。

1)属性使用

预定义属性 AttributeUsage 用于描述自定义属性类的用法,该自定义属性类定义可以应用该属性的项目类型。 AttributeUsage 的语法是:

[AttributeUsage (
   validon,
   AllowMultiple = allowmultiple,
   Inherited = inherited
)]

参数解释如下:

  • 参数 validon 用于定义可以在其中放置属性的语言元素。这是枚举器 AttributeTargets 的值的组合。默认值为 AttributeTargets.All。
  • 参数allowmultiple(可选参数)用于为此功能的AllowMultiple 属性(属性)提供布尔值。默认值为 false(仅使用一次)。如果为 true,则该功能将被多次使用。
  • 参数继承(可选参数)用于为要素的继承属性(属性)提供布尔值。默认为 false(不继承);如果为 true,则该功能可以由派生类继承。

示例代码如下。

[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]

2) 有条件的

预定义属性 Conditional 用于标记根据指定的预处理标识符执行的方法。根据此功能的值,编译时会产生不同的效果。例如,如果值为 Debug 或 Trace,则在调试代码时会显示变量的值。

预定义属性 Conditional 具有以下语法格式:

[Conditional(
    conditionalSymbol
)]

例如:

[Conditional(“DEBUG”)]

[示例] 下面的示例显示了预定义函数Conditional 的使用。

 #define DEBUG
using System;
using System.Diagnostics;

namespace it-kiso.com
{
    class Demo
    {
        static void function1()
        {
            Myclass.Message("Function1 関数");
            function2();
        }
        static void function2()
        {
            Myclass.Message("Function2 関数");
        }
        static void Main(string[] args) 
        {
            Myclass.Message("Main 関数");
            function1();
            Console.ReadKey();
        }
    }
    public class Myclass
    {
        [Conditional("DEBUG")]
        public static void Message(string msg)
        {
            Console.WriteLine(msg);
        }
    }
} 

操作的结果将是:

Main 関数
Function1 関数
Function2 関数

3) 过时的

预定义属性 Obsolete 用于标记不应使用的程序,可用于告诉编译器丢弃对象元素。例如,如果您需要用新方法替换类中的旧方法,使用此功能将旧方法标记为已过时(obsolete)并打印一条消息提示您使用新方法即可。老办法。

预定义属性 Obsolete 具有以下语法格式:

[Obsolete (
   message
)]

[过时的 (
信息,
是错误
)]

语法解释如下:

  • 参数 message 是一个字符串,解释该项目为何过时以及应该使用什么来代替它。
  • 参数 iserror 是一个布尔值,默认值为 false(编译器生成警告),但将其设置为 true 会导致编译器将该项目视为错误。

[示例] 以下示例显示了 Obsolete 预定义属性的使用。

 using System;

namespace it-kiso.com
{
    class Demo
    {
        [Obsolete("OldMethodは廃止されました。NewMethodを使用してください。", true)]
        static void OldMethod()
        {
          Console.WriteLine("既に廃止された関数");
        }
        static void NewMethod()
        {
          Console.WriteLine("新しく定義された関数");
        }
        static void Main(string[] args) 
        {
            OldMethod();
        }
    }
} 
3. 自定义功能

.Net Framework 允许您创建自定义属性,这些属性不仅存储声明性信息,而且还可以在运行时检索它。创建和使用自定义属性可以分为四个步骤:

  • 声明自定义属性。
  • 构建自定义功能。
  • 将自定义功能应用到目标程序。
  • 通过反射访问属性。

最后一步是创建一个简单的程序来读取元数据以查找各种符号。元数据用于描述有关数据的数据或有关其他数据的信息。您的程序必须使用反射来在运行时访问属性。

1)声明自定义属性

自定义属性必须扩展 System.Attribute 类,如下所示:

[AttributeUsage(
   AttributeTargets.Class |
   AttributeTargets.Constructor |
   AttributeTargets.Field |
   AttributeTargets.Method |
   AttributeTargets.Property,
   AllowMultiple = true)]

公共类 DeBugInfo :System.Attribute

在上面的示例代码中,我们声明了一个名为 DeBugInfo 的自定义属性。

2) 构建自定义功能

让我们构建一个名为 DeBugInfo 的自定义属性,它可以存储下面列出的调试信息。

  • 错误代码号。
  • Bug 开发者的姓名。
  • 上次审查代码的日期。
  • 包含开发者令牌的字符串消息。

DebugInfo 类具有三个私有属性(Properties)来存储前三条信息,以及一个公共属性(Public)来存储消息。因此,bug 编号、开发人员姓名和审核日期是 DeBugInfo 类的必需位置参数,而消息是可选的命名参数。

每个功能都至少有一个构造函数,并且位置参数必须通过构造函数传递。如下例所示:

 // 自作の属性 BugFix をクラスとそのメンバーに付与する
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
public class DeBugInfo : System.Attribute
{
  private int bugNo;
  private string developer;
  private string lastReview;
  public string message;

  public DeBugInfo(int bg, string dev, string d)
  {
      this.bugNo = bg;
      this.developer = dev;
      this.lastReview = d;
  }

  public int BugNo
  {
      get
      {
          return bugNo;
      }
  }
  public string Developer
  {
      get
      {
          return developer;
      }
  }
  public string LastReview
  {
      get
      {
          return lastReview;
      }
  }
  public string Message
  {
      get
      {
          return message;
      }
      set
      {
          message = value;
      }
  }
} 

3) 应用自定义属性

通过将其放置在目标旁边来应用该功能。示例代码如下。

 use System;

namespace it-kiso.com;
{
    class Demo
    {
        static void Main(string[] args) 
        {
            Rectangle rec = new Rectangle(12, 15);
            rec.Display();
        }
    }

    [DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "返却値の型が一致していない")]
    [DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "未使用の変数")]
    クラス Rectangle
    {
        // メンバー変数
        protected double length;
        protected double width;
        public Rectangle(double l, double w)
        {
            length = l;
            width = w;
        }
        [DeBugInfo(55, "Zara Ali", "19/10/2012",
        Message = "返却値の型が一致していない")]
        public double GetArea()
        {
            return length * width;
        }
        [DeBugInfo(56, "Zara Ali", "19/10/2012")]
        public void Display()
        {
            Console.WriteLine("Length: {0}", length);
            Console.WriteLine("Width: {0}", width);
            Console.WriteLine("Area: {0}", GetArea());
        }
    }
    // クラス及びそのメンバーに割り当てられたカスタム属性BugFix
    [AttributeUsage(AttributeTargets.Class |
    AttributeTargets.Constructor |
    AttributeTargets.Field |
    AttributeTargets.Method |
    AttributeTargets.Property,
    AllowMultiple = true)]

    public class DeBugInfo : System.Attribute
    {
        private int bugNo;
        private string developer;
        private string lastReview;
        public string message;

        public DeBugInfo(int bg, string dev, string d)
        {
            this.bugNo = bg;
            this.developer = dev;
            this.lastReview = d;
        }

        public int BugNo
        {
            get
            {
                return bugNo;
            }
        }
        public string Developer
        {
            get
            {
                return developer;
            }
        }
        public string LastReview
        {
            get
            {
                return lastReview;
            }
        }
        public string Message
        {
            get
            {
                return message;
            }
            set
            {
                message = value;
            }
        }
    }
} 

操作的结果将是:

Length: 12
Width: 15
Area: 180

通俗易懂的《C#属性》讲解!您必须观看的最佳 2 个视频

C# / .NET の属性 [C# 基本シリーズ、.NET 6 の例]
https://www.youtube.com/watch?v=N0uaB7oQb_s
属性是声明性代码,用于在程序运行时传达有关各种元素(类、方法、结构、枚举等)的行为信息。诸如编译器指令、注释、描述、方法和类信息之类的元数据可以使用属性添加到程序中。 .Net Framework 提供了两种类型的属性:预定义属性和自定义属性。

在 C# 中,属性具有以下属性:

  • 可以使用功能将元数据添加到您的程序中。元数据是指有关程序内各种元素的信息。每个 .NET 程序都包含一组指定的元数据。
  • 您可以将一个或多个属性应用于整个程序、模块或小型程序元素(例如类或属性)。
  • 特征可以接受方法和属性等参数。
  • 程序可以使用反射来检查自己的元数据和其他程序的元数据。

1. 定义特征

C# 中定义属性的语法为:

[attribute(positional_parameters, name_parameter = value, …)]
element

其中, [ ]用于定义特征的名称和值,positional_parameters用于指定基本信息,name_parameter用于指定可选信息。

2. 预定义功能

.Net Framework 提供了三个预定义属性:

  • 属性使用。
  • 有条件的。
  • 废除。

1)属性使用

预定义属性 AttributeUsage 用于描述自定义属性类的用法,该自定义属性类定义可以应用该属性的项目类型。 AttributeUsage 的语法是:

[AttributeUsage (
   validon,
   AllowMultiple = allowmultiple,
   Inherited = inherited
)]

参数解释如下:

  • 参数 validon 用于定义可以在其中放置属性的语言元素。这是枚举器 AttributeTargets 的值的组合。默认值为 AttributeTargets.All。
  • 参数allowmultiple(可选参数)用于为此功能的AllowMultiple 属性(属性)提供布尔值。默认值为 false(仅使用一次)。如果为 true,则该功能将被多次使用。
  • 参数继承(可选参数)用于为要素的继承属性(属性)提供布尔值。默认为 false(不继承);如果为 true,则该功能可以由派生类继承。

示例代码如下。

[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]

2) 有条件的

预定义属性 Conditional 用于标记根据指定的预处理标识符执行的方法。根据此功能的值,编译时会产生不同的效果。例如,如果值为 Debug 或 Trace,则在调试代码时会显示变量的值。

预定义属性 Conditional 具有以下语法格式:

[Conditional(
    conditionalSymbol
)]

例如:

[Conditional(“DEBUG”)]

[示例] 下面的示例显示了预定义函数Conditional 的使用。

 #define DEBUG
using System;
using System.Diagnostics;

namespace it-kiso.com
{
    class Demo
    {
        static void function1()
        {
            Myclass.Message("Function1 関数");
            function2();
        }
        static void function2()
        {
            Myclass.Message("Function2 関数");
        }
        static void Main(string[] args) 
        {
            Myclass.Message("Main 関数");
            function1();
            Console.ReadKey();
        }
    }
    public class Myclass
    {
        [Conditional("DEBUG")]
        public static void Message(string msg)
        {
            Console.WriteLine(msg);
        }
    }
} 

操作的结果将是:

Main 関数
Function1 関数
Function2 関数

3) 过时的

预定义属性 Obsolete 用于标记不应使用的程序,可用于告诉编译器丢弃对象元素。例如,如果您需要用新方法替换类中的旧方法,使用此功能将旧方法标记为已过时(obsolete)并打印一条消息提示您使用新方法即可。老办法。

预定义属性 Obsolete 具有以下语法格式:

[Obsolete (
   message
)]

[过时的 (
信息,
是错误
)]

语法解释如下:

  • 参数 message 是一个字符串,解释该项目为何过时以及应该使用什么来代替它。
  • 参数 iserror 是一个布尔值,默认值为 false(编译器生成警告),但将其设置为 true 会导致编译器将该项目视为错误。

[示例] 以下示例显示了 Obsolete 预定义属性的使用。

 using System;

namespace it-kiso.com
{
    class Demo
    {
        [Obsolete("OldMethodは廃止されました。NewMethodを使用してください。", true)]
        static void OldMethod()
        {
          Console.WriteLine("既に廃止された関数");
        }
        static void NewMethod()
        {
          Console.WriteLine("新しく定義された関数");
        }
        static void Main(string[] args) 
        {
            OldMethod();
        }
    }
} 
3. 自定义功能

.Net Framework 允许您创建自定义属性,这些属性不仅存储声明性信息,而且还可以在运行时检索它。创建和使用自定义属性可以分为四个步骤:

  • 声明自定义属性。
  • 构建自定义功能。
  • 将自定义功能应用到目标程序。
  • 通过反射访问属性。

最后一步是创建一个简单的程序来读取元数据以查找各种符号。元数据用于描述有关数据的数据或有关其他数据的信息。您的程序必须使用反射来在运行时访问属性。

1)声明自定义属性

自定义属性必须扩展 System.Attribute 类,如下所示:

[AttributeUsage(
   AttributeTargets.Class |
   AttributeTargets.Constructor |
   AttributeTargets.Field |
   AttributeTargets.Method |
   AttributeTargets.Property,
   AllowMultiple = true)]

公共类 DeBugInfo :System.Attribute

在上面的示例代码中,我们声明了一个名为 DeBugInfo 的自定义属性。

2) 构建自定义功能

让我们构建一个名为 DeBugInfo 的自定义属性,它可以存储下面列出的调试信息。

  • 错误代码号。
  • Bug 开发者的姓名。
  • 上次审查代码的日期。
  • 包含开发者令牌的字符串消息。

DebugInfo 类具有三个私有属性(Properties)来存储前三条信息,以及一个公共属性(Public)来存储消息。因此,bug 编号、开发人员姓名和审核日期是 DeBugInfo 类的必需位置参数,而消息是可选的命名参数。

每个功能都至少有一个构造函数,并且位置参数必须通过构造函数传递。如下例所示:

 // 自作の属性 BugFix をクラスとそのメンバーに付与する
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
public class DeBugInfo : System.Attribute
{
  private int bugNo;
  private string developer;
  private string lastReview;
  public string message;

  public DeBugInfo(int bg, string dev, string d)
  {
      this.bugNo = bg;
      this.developer = dev;
      this.lastReview = d;
  }

  public int BugNo
  {
      get
      {
          return bugNo;
      }
  }
  public string Developer
  {
      get
      {
          return developer;
      }
  }
  public string LastReview
  {
      get
      {
          return lastReview;
      }
  }
  public string Message
  {
      get
      {
          return message;
      }
      set
      {
          message = value;
      }
  }
} 

3) 应用自定义属性

通过将其放置在目标旁边来应用该功能。示例代码如下。

 use System;

namespace it-kiso.com;
{
    class Demo
    {
        static void Main(string[] args) 
        {
            Rectangle rec = new Rectangle(12, 15);
            rec.Display();
        }
    }

    [DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "返却値の型が一致していない")]
    [DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "未使用の変数")]
    クラス Rectangle
    {
        // メンバー変数
        protected double length;
        protected double width;
        public Rectangle(double l, double w)
        {
            length = l;
            width = w;
        }
        [DeBugInfo(55, "Zara Ali", "19/10/2012",
        Message = "返却値の型が一致していない")]
        public double GetArea()
        {
            return length * width;
        }
        [DeBugInfo(56, "Zara Ali", "19/10/2012")]
        public void Display()
        {
            Console.WriteLine("Length: {0}", length);
            Console.WriteLine("Width: {0}", width);
            Console.WriteLine("Area: {0}", GetArea());
        }
    }
    // クラス及びそのメンバーに割り当てられたカスタム属性BugFix
    [AttributeUsage(AttributeTargets.Class |
    AttributeTargets.Constructor |
    AttributeTargets.Field |
    AttributeTargets.Method |
    AttributeTargets.Property,
    AllowMultiple = true)]

    public class DeBugInfo : System.Attribute
    {
        private int bugNo;
        private string developer;
        private string lastReview;
        public string message;

        public DeBugInfo(int bg, string dev, string d)
        {
            this.bugNo = bg;
            this.developer = dev;
            this.lastReview = d;
        }

        public int BugNo
        {
            get
            {
                return bugNo;
            }
        }
        public string Developer
        {
            get
            {
                return developer;
            }
        }
        public string LastReview
        {
            get
            {
                return lastReview;
            }
        }
        public string Message
        {
            get
            {
                return message;
            }
            set
            {
                message = value;
            }
        }
    }
} 

操作的结果将是:

Length: 12
Width: 15
Area: 180

通俗易懂的《C#属性》讲解!您必须观看的最佳 2 个视频

C# / .NET の属性 [C# 基本シリーズ、.NET 6 の例]
https://www.youtube.com/watch?v=N0uaB7oQb_s