C# 属性和 C# 静态字段有什么区别?

What is the difference between C# Attribute and C# Static Field?

根据微软文档,

Attributes provide a powerful method of associating metadata, or declarative information, with code.

The static member is callable on a class even when no instance of the class has been created. The static member is always accessed by the class name, not the instance name.

但是据我了解,Attribute和Static Field都是

  1. 可以在运行时访问
  2. 绑定 class,而不是对象。

那么它们有什么区别呢?

定义

静态数据字段或 属性 是 encapsulated 在 class 定义的 abstraction 中的变量.

属性是一个修饰,一个参数,不是数据本身,添加到class类型或成员字段,属性 或方法。

属性本身在数据或代码方面什么都不做,也不代表什么:它是一个概念性的工件,添加到代码中,代码可以通过某种方法使用它来改变行为。

属性是一个 class,它可以包含数据和方法来管理 class 的某些行为。

属性允许在抽象和封装之间进行更多分离。

它们允许更好地改进设计以及在编码时专门化行为,同时允许泛化。

示例

考虑这个 class:

public class LogFile
{
  static public List<LogFile> LogFiles { get; private set; }
}

这是一个静态列表,包含所有实例化的日志文件。

它是一个数据,一个变量,一些具体而有形的东西,可以直接被内部和外部代码使用。

这是属性用法的示例:

[LogFileStorage(LogFilePath.User)]
public class LogFile
{
}

这是在代码级别添加到 class 定义的代码标记,不能更改,除非使用反射,并且可以由日志文件管理器使用 class定义保存路径,例如在临时文件夹或用户应用程序文件夹或运行时定义的路径中(以与常量或默认值不同且分离的方式)。

因此在此示例中,日志文件保存方法将检查 class 属性以了解保存位置。

属性允许编码人员参数化 class 他们定义的以及子 class 和任何 class 成员。

一个class典型的例子是 Serializable 属性:

https://docs.microsoft.com/dotnet/api/system.serializableattribute

教程

https://www.tutorialspoint.com/csharp/csharp_attributes.htm

https://docs.microsoft.com/dotnet/csharp/programming-guide/concepts/attributes/

https://docs.microsoft.com/dotnet/csharp/tutorials/attributes

https://www.tutorialspoint.com/csharp/csharp_encapsulation.htm

https://www.c-sharpcorner.com/UploadFile/mkagrahari/introduction-to-object-oriented-programming-concepts-in-C-Sharp/