17_字段、属性、索引器、常量

字段(field)是一种表示与对象或类关联的变量的成员。

● 对于实例字段,它初始化的时机是在实例创建时
○ 声明实例字段时初始化值与在实例构造器里面初识化实例字段是一样的
● 对于静态字段,它初始化的时机是在运行环境加载该数据类型时
○ 即静态构造器初始化时
○ 声明静态字段时设置初始化值与在静态构造器里面初始化静态字段其实是一样的

数据类型被运行环境加载时,它的静态构造器将会被调用,且只被调用一次。

什么是属性
在这里插入图片描述
当你这样写的时候,属性自带一个字段(或者说 自动属性/简略声明)

public int PropertyA
{
	get;set;
}

当你这样写的时候,不能直接把PropertyA当成一个修改的字段

public int PropertyA
        {
            set
            {
                PropertyA = value;
            }
            get
            {
                return PropertyA;
            }
        }

直接为您整一个stackoverflow
原因在于:
在这里插入图片描述
前者的写法相当于语法糖,如图,反编译时会发现后台为您创建了一个BackingField
使用Ctrl+R+E(后两者同时按且双击),自动将字段封装

索引器

快速使用方法 indexer + Tab*2

public int? this[string index]
        {
            get { return scoreDictionary[index]; }
            set { scoreDictionary[index] = value.Value; }
        }

以上述代码为例,个人如此理解,要么通过一个string获取int,要么通过string为该int赋值,因此value的类型就是 int?

常量

● 什么是常量
○ 常量(constant)是表示常量值(即,可以在编译时计算的值)的类成员
○ 常量隶属于类型而不是对象,即没有“实例常量”
■ “实例常量”的角色由只读实例字段来担当
○ 注意区分成员常量与局部常量
● 常量的声明
● 各种“只读”的应用场景(悟!)
○ 为了提高程序可读性和执行效率 —— 常量
○ 为了防止对象的值被改变 —— 只读字段
○ 向外暴露不允许修改的数据 —— 只读属性(静态或非静态),功能与常量有一些重叠
○ 当希望成为常量的值其类型不能被常量声明接受时(类/自定义结构体) —— 静态只读字段

常量性能比变量高,常量只能用于修饰基础类型
常量要求声明时就要初始化,只读属性可以自由指定初始化时机
成员常量只能通过类名访问,有点类似于静态成员,但是目前尚不清楚区别在哪(除了常量不能修改以外)
或许可以用静态常量与动态常量的区别来解答:针不戮
**二者最大的差别在于:**静态常量在编译时会将其换为对应的值,这就意味着对于不同的程序集来说,当你改变静态常量的时候需要将其重新编译,否则常量的值不会发生变化,可能引发潜在的问题,而动态常量就不会有这种情况。
用const定义的常量(隐式是静态的),需要像访问静态成员那样去访问const定义的常量,而用对象的成员方式去访问会出编译错误。 声明的同时要设置常量值。
从另一方面来说,如果你的确要声明一些从不改变且处处唯一的常量,例如钩子函数SetWindowsHookEx的idHook参数或序列化时的版本等,就应该使用静态常量。但是用到这样的常量的机会不多。一般来说我们应该使用灵活性更高的动态常量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值