C#字段、属性的特性

一、字段的定义

字段是在类或结构中直接声明的任意类型的变量。

声明一个字段,可以用访问修饰符+类型+变量名称来声明,下图是一个简单的示例:

二、属性的定义

属性语法是字段的自然延伸,属性需要有get或者set的访问器。

声明一个属性,可以用访问修饰符+类型+变量名称来声明,下图是一个简单的示例:

三、字段的特性

1.字段通常不使用public关键字,仅在private和protected时才建议使用。如果您要使用public时,建议转为属性。这是为了符合面向对象设计的原因。简单一句话理解就是字段对内,属性对外。

2.可以对字段使用static关键字,这可使字段让调用方在任何时候进行调用,即使不存在任何类的实例。

3.也可以对字段使用static readonly关键字,这样很像const关键字。它们之间的区别是static readonly需要在运行时才可以访问,而const则编译的时候就已经可以访问了。

4.字段是在对象实例的构造函数被调用之前便初始化。 如果构造函数分配了该字段的新值,则它将覆盖在字段声明期间给定的任何值。

5.字段可以使用ref、out关键字传递。

 

四、属性的特性

1.属性需要定义访问器get或者set,或者两者都有。

2.属性可以隐式定义,即只有简单的get、set。这样声明会非常简洁。如:public int 成员数量 { get; set; }

3.属性还可以使用缓存式定义,这对于一些特殊情形下,非常有用,它通常会结合字段来进行缓存。如下图:

4.字段是变量,但属性不是变量噢。变量是可以使用ref、out关键字传递的,所以字段可以,但属性不可以。

6.属性可以抽象、虚化、密封,即属性可以加上abstract、virtual、sealed关键字。

 

五、其它的高级特性

1.老是使用get访问器,我是不是等于每次都调用一下方法,这样是不是增加了额外开销?

答:是等于调用方法,但不会增加额外开销。编译器已经自动优化了get访问器,不会产生额外开销。但是当该属性声明为virtual关键字,由于编译器搞不清楚会不会被子类重写属性,所以,这种情况下会产生额外开销。

2.编写属性时,我可以在get访问器更改缓存字段的值吗?

答:如上图,您可以更改缓存字段_number的值。但是这是一种非常差劲的编码风格。您不应该去更改_number字段的值,它的作用就让它仅仅用于记录缓存就好。

 

祝您用餐愉快。

 

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用反射来动态修改枚举类型中字段特性。下面是一个示例代码: ```csharp using System; using System.Reflection; public enum MyEnum { [MyAttribute("Value 1")] Value1, [MyAttribute("Value 2")] Value2, [MyAttribute("Value 3")] Value3 } public class MyAttribute : Attribute { public string Description { get; set; } public MyAttribute(string description) { Description = description; } } class Program { static void Main() { Type enumType = typeof(MyEnum); FieldInfo[] fields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); foreach (FieldInfo field in fields) { MyAttribute attribute = field.GetCustomAttribute<MyAttribute>(); if (attribute != null) { Console.WriteLine($"Original description for {field.Name}: {attribute.Description}"); // 修改特性的值 attribute.Description = "New description"; Console.WriteLine($"Modified description for {field.Name}: {attribute.Description}"); } } } } ``` 这段代码中,我们定义了一个枚举类型 `MyEnum`,并为每个字段添加了一个自定义特性 `MyAttribute`。然后,我们使用反射获取枚举类型的字段,并使用 `GetCustomAttribute` 方法获取字段特性。如果特性存在,我们可以通过修改特性属性来动态修改特性的值。 在上述示例中,我们将枚举类型 `MyEnum` 中所有字段特性 `Description` 修改为 "New description"。你可以根据自己的需要修改特性的其他属性。记得在实际使用中要进行错误处理和适当的验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值