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都是
- 可以在运行时访问
- 绑定 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
根据微软文档,
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都是
- 可以在运行时访问
- 绑定 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