首页 > 编程语言 >刘铁猛C#学习笔记10 字段、属性

刘铁猛C#学习笔记10 字段、属性

时间:2024-02-23 23:11:39浏览次数:26  
标签:10 刘铁猛 只读 C# 初始化 字段 set 声明 属性

这四种东西都是用来表达数据的

一、字段(成员变量)

曾用名:成员变量 是为一个对象或类型存储数据的变量,区别于方法体中的局部变量 多个字段组合起来可以表示对象当前的状态 起源:C语言中结构体的成员变量 一个对象占用的内存空间会被分配给各个字段

1.实例字段和静态字段

可以分为实例字段和静态字段 类比实例方法和静态方法,一个属于实例对象,一个属于类型 例如年龄、成绩等字段隶属于个人,是实例字段 而平均年龄、平均成绩隶属于整体学生,是静态字段

2.字段的声明

编程规范:声明字段时,变量名必须是一个名词 字段的声明要写在类体的大括号里,不能写在方法体大括号里 字段声明时可以用以下修饰符 注意修饰符组合使用时,必须是有意义的,不能自相矛盾 字段的声明后面可以接初始化器,给其赋一个初值,若不初始化,其初值为对应类型的默认值 对于实例字段,其初始化的时机是这个实例创建的时候 对于静态字段,其初始化的时机是在运行环境加载这个数据类型的时候,只执行一次 编程规范:若需要初始化,尽量在声明时就将其初始化  

3.只读字段readonly

添加只读修饰符readonly后,成为只读字段 只读实例字段,只能在该类型的实例构造器中初始化,之后不能再赋值 只读静态字段,只能在声明或静态初始化器中初始化,之后不能再赋值   ex:静态构造器(看看图一乐,不常用) 以下两种表达等价    

二、属性

1.属性与字段

属性是在字段的基础上的发展来的,可以看做进化后的字段 字段更偏向实例对象在内存中的布局,属性更偏向于反应现实世界对象的特征 弹幕:“属性一般设计用来让外部访问;字段是内部特征,一般不对外公开”   对外暴露数据时,数据可以存在字段里,也可以是动态计算出来的 对外暴露数据时,字段存储的数据可能非法,例如人的年龄为100000岁,但属性可以通过一些逻辑,保护数据,防止其被不符合逻辑的非法值污染  

2.get-set方法与属性的由来

属性起源于get-set方法对,一种用来保护字段的常用方法 首先将字段变为私有变量private,使其不能被直接访问,以保护字段 然后通过get方法读取字段,通过set方法改写字段 出现非法值被输入 调用时:     在C++、JAVA中,仍然是用这样的方法来保护字段,非常常用  

3.属性的本质

所以C#将上文这种非常常用的字段保护方法提炼了出来,变成了属性 属性的读取、改写方法可以和普通变量一模一样! 这样就兼顾了对字段的逻辑保护代码语法的简洁性、可读性 C#属性表达和上文中的字段保护方法表达,编译后是一样的 也就是说,属性的本质就是C#的一种语法糖  

4.C#属性使用方法详解

(1)属性的可读写性

有些属性既有get又有set,可读可写 有些属性只有get,没有set,称作只读属性 有些属性只有set,没有get,称作只写属性(不常用)   像只读属性赋值程序会报错   特例:如果只把set方法私有化private,这样并不是只读属性 这个字段在声明他的类的外部,无法改写 但在声明他的类中,是可以改写的 而如果直接删除set方法,变成只读属性,则其在本类中也无法改写  

(2)属性的完整声明

在VS中,输入propfull,然后按两下tab 就会得到: 之后按一下回车,然后更改set和get,将需要的逻辑加入进去   静态属性声明示例:(字段名和属性名前面都要加上static)  

(3)属性的简略声明

通过简略声明声明的字段,和一个公有的普通字段是完全一样的,不受保护 但是声明起来特别方便,一般用来传递数据,用来给外部访问   声明方法: 在VS中输入prop,直接敲两下TAB 然后就会出现: 方便外部访问调用,但不提供保护逻辑  

(4)vs旗舰版的字段快捷封装功能

先有一个字段 然后将其改为私有private、小写字段名字 将光标移动到字段名上,选择 edit编辑→refactor重构→封装字段 然后可以选择封装为属性,并会在全文搜索这个属性会不会有冲突,点应用就会自动封装为属性 快捷键:光标放在字段名上时,按下ctrl + R + E  

5.动态计算值的属性

(1)主动式,读取时计算值

属性值的计算逻辑写在属性内读取属性时主动调用计算逻辑,得出其值

(2)被动式,改写时计算值

属性值的计算逻辑作为一个单独函数写在属性外关联属性被改写时调用这个函数 属性的值在关联属性被改写被动地一起改变   需要被频繁访问的属性,不断主动计算其值会损耗性能,所以使用被动式 关联属性需要被频繁改写的属性,不断地被动计算其值会损耗性能,所以使用主动式 根据实际情况选择性能最优的方式  

实践建议

最好永远使用属性来向外暴露数据,裸字段最好永远是private或protected  

标签:10,刘铁猛,只读,C#,初始化,字段,set,声明,属性
From: https://www.cnblogs.com/jk-2048/p/18030530

相关文章

  • 刘铁猛C#学习笔记11 索引器、常量
    一、索引器[]概述使一个对象可以像数组一样用方括号[]去访问其元素ex:字典的声明 1.索引器的声明首先像上文那样声明一个字典Dictionary<,>在VS中输入indexer,然后敲两下tab就能得到:(按下tab可以跳到下一个可编辑项上)第一个类型参数为返回值的类型,第二个类型参数为......
  • 刘铁猛C#学习笔记12 参数种类详解
    一、值参数(传值参数、值传递)指参数的种类为值参数,而非参数数据类型为值类型1.值类型的传值参数类似一个新声明的局部变量,或传进来的实参的一个副本可以在方法体内重现赋值,但其在方法体内被赋值时,不会影响传进来的本体 2.引用类型的传值参数引用类型变量存储的是实例......
  • 代码随想录算法训练营day03 | leetcode 203. 移除链表元素、707. 设计链表、206. 反转
    目录题目链接:203.移除链表元素-简单题目链接:707.设计链表-中等题目链接:206.反转链表-简单题目链接:203.移除链表元素-简单题目描述:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6......
  • 恢复VCPkg(2023-01-27)中Vtk[Qt]的默认依赖为Qt5
    通过查看vtk的更新的日志已于2023-01-27将默认依赖的Qt的版本由5更新到6gitlog--.\ports\vtkcommit27fb19bdcc1f6ddb1261cffb5372724ac1d63a93Author:LilyWang<[email protected]>Date:2023-08-23[manyports]FixURLSofdownlo......
  • P9370 APIO2023 cyberland
    题面:https://www.luogu.com.cn/problem/P9370显然只有从\(0\)出发不经过\(H\)能到达的点是有用的。首先,考虑跑多源最短路,将\(arr=0\)的点都作为源点(当然\(0\)也是源点)。不难发现这样转化后,这些点即可视作\(arr=1\)。对于\(arr=2\)的点,由于能使用除以二技能的次数很......
  • POLIR-Economics-西方经济学学习经验(转发)
    原文:https://bbs.pinggu.org/thread-894259-1-1.htmlhttps://bbs.pinggu.org/forum-47-1.html西方经济学属于纯理论性的学科,它所包括的知识也基本上是比较模式化的,也就是说,相对于政治经济学它联系实际的东西比较少,能与实际联系起来的地方主要是宏观部分的财政政策、货币政策、通......
  • LGC引理
    LGV引理内容(不会证明)\(\omega(P)\)表示P这条路径上所有边的边权之积。(路径计数时,可以将边权都设为1)(事实上,边权可以为生成函数)e(u,v)表示u到v的每一条路径P的$\omega(P)$之和,即$e(u,v)=\sum\limits_{P:u\rightarrowv}\omega(P)$。起点集合\(A\),是有向无......
  • 线段树分治&cdq分治&整体二分
    preface感觉三种分治算法容易搞混并不容易区分它们使用的场景和题目(虽然有些题目根据性质可以使用多种分治),所以还是要归纳一下线段树分治Part1主要是处理一类带有撤回的问题,也就是一次修改只对一段区间生效(这里的区间指的是时间)即区间修改,单点查询流程大致是把区间修改挂在......
  • P10139 [USACO24JAN] Nap Sort G 题解
    DescriptionBessie正在尝试使用她自己的排序算法对一个整数数组进行排序。她有一堆共\(N\)(\(1\leN\le2\cdot10^5\))个整数\(a_1,a_2,\ldots,a_N\)(\(1\lea_i\le10^{11}\)),她将会按排序顺序将这些数放入一个单独的数组中。她反复查找这堆数中的最小数,将其删除,同时将其添加到......
  • Edu-English-Phonetic-IPA:国际音标发音学:英语音标的学习神器,终于找到
    https://mp.weixin.qq.com/s?__biz=MzU3NTIzOTA5OA==&mid=2247493736&idx=1&sn=8ed10241adeaa148ee3053f5db94214e&chksm=fd248ebdca5307abf32a39eed20bb83818e00692a87298d3b1c2d2cb7b2d6572df0c0301fe7d&scene=27英语音标的学习神器,终于找到音标是记录语言的符号,对音标的正确......