【C#学习笔记】属性和字段
前言
最近在工作的过程中常常会觉得自己在程序设计方面的能力还是有欠缺。例如一直对于变量的声明感到不足,在工作中为了图方便总是直接public定义字段,实际上造成了很多困扰,特写此文总结一下应当怎样定义成员变量。
属性和字段的区别
字段
【字段】
- 字段(Field)是一种表示与对象或类关联的变量的成员,字段声明用于引入一个或多个给定类型的字段。字段是类内部用的,private类型的变量(字段),通常字段写法都是加个"_"符号,然后声明只读属性,字段用来储存数据。
public int Index = 0;
private int m_index;
private static int s_index;
public static int s_Index;
字段,或者说变量是类中最基本的要素。一般来说我们定义一个字段的时候,需要考虑的是以下几点:
- 使用何种访问修饰符
- 是否使用其他关键字
- 定义的变量类型
- 变量名的取名
- 变量在定义时的赋值
以上要素对于属性定义也是一样的。
访问修饰符和关键字定义
这里这介绍一些常用的:
当我们希望一个字段可以被其他类访问时,通常会将其定义为public
,若不希望被其他类访问,则为private
,若想要被子类访问,则会定义为protected
然后是一些关键字的运用:若想要即使生成了多个类,但其中的一些字段值依旧全局唯一,我们会使用static
来定义。
如果我们想要对字段值在方法中进行类似指针的赋值引用,会用到ref,in,out
关键字,或者直接进行指针引用(指针引用和C相同,但是必须要在unsafe
块中进行)。
ref,in,out
的共同点是:
- 需要在方法定义与方法调用处显示的使用关键字。
- 参数按引用传递,而非值传递。
ref,in,out
的不同点是:
ref
:参数变量需要初始化,参数在方法中可以修改或不修改。out
:参数变量无需初始化,参数在方法中必须进行赋值。in
:参数变量需要初始化,参数在方法中不能进行修改。
在类中实现方法的时候,我们还会用到abstract
关键字,virutal
和override
关键字。abstract
用于抽象类中定义的抽象方法。而virutal
定义了父类虚方法,override
则用于继承了该父类的子类中重写同名虚方法和抽象方法。还有sealed
关键字用来密封类或者函数,如果类使用了sealed
则不可被继承,若函数使用了override sealed
来描述则该方法不可再被override
重写
关键字还有很多种,例如定义委托的delegate
,基本语法的if,else,switch,case,break,continue,
等等等等
变量类型的定义
定义的变量类型当然是需要什么定义什么,有些特殊的情况,例如我们在调用class类型的变量时,可以不定义为该class本身的类型:若需要访问其父类中的方法,则可以直接定义为它的父类;若需要访问该类中继承的接口方法,也可以直接定义为它的接口类型。
变量命名
变量名的取名我通常是匈牙利命名法和驼峰命名法相结合:
- 私有成员变量
m_name
,例如m_maxNum
- 公共变量
Name
,例如MaxNum
- 常量或宏
NAME
,例如MAX_NUM
- 静态变量
s_
开头,结合公有或私有命名
虽然C#官方推荐私有变量_
开头,但是似乎许多宏也是_
开头的,为避免不必要的问题,我觉得不用以_
开头
从取名上尽量要取得详细,除了一些专用名词如TCP,UDP等等,尽量不要使用首字母大写进行缩写。例如一个TCP的接收消息管理器我会命名为TCP_ReceiveManager
,或者一个游戏场景内物体管理器GameSceneObjManager
。不要因为嫌麻烦而简化命名
变量的赋值
一些变量在运行时需要提前进行初始化,否则会导致空引用,而一些变量虽然不赋值也可以调用,但往往会导致错误的结果。因此变量初始化的赋值很重要,要么在脚本开始执行时调用一个初始化方法统一分配,要么就直接在字段定义时进行赋值。
属性
【属性】
- 属性(Property)是另一种类型的类成员,定义属性的目的是在于便于一些私有字段的访问。类提供给外部调用时用的可以设置或读取一个值,属性则是对字段的封装,将字段和访问自己字段的方法组合在一起,提供灵活的机制来读取、编写或计算私有字段的值。属性有自己的名称,并且包含get 访问器和set 访问器。
属性和字段的定义几乎是一模一样的,唯一的不同在于属性提供了get
访问器和set
访问器。这使得我们可以在为属性进行取值和赋值的时候定义一个自定义的方法。
属性本质上可以看作是字段的一层封装,它的内部包含了一个私有字段,并提供了一个get和set来读写这个私有字段,如下所示:
pulic class User
{private string m_name;//_name为字段public string Name //Name为属性,它含有代码块{get{return m_name;//读取(返回_name值)}set {m_name= value;//为m_name赋值,value可以直接获取赋值}}
}
所以为什么我们要多一层封装而非直接将字段public出来呢?因为程序设计中我们不希望一个字段可以被其他类轻易的访问,有时我们只想它可读或者可写,或者在读写时进行一些其他操作。如果不用属性则需要定义读写的方法,显然太麻烦了。
使用属性,我们可以用get代表字段可读,set代表可写,以此控制字段的读写权限。同时属性接口是只对外的(对内直接修改字段即可了),我们可以自定义访问器的代码,保证了外部修改的安全性。
所以我们才建议将字段作为类中的私有变量,属性作为公共变量,通过属性的设置,我们既可以灵活的定义读写字段时会发生什么事情,也可以很好的封装字段以实现保护的目的。
不同的使用情况
公共字段:
- 允许自由读写
- 取值范围只收数据类型约束而无其他任何特定限制;
- 值的变动不需要引发类中其它任何成员的相应变化;
如果满足上述情况,则可以自由使用public 的字段,但是还是不建议使用
属性:
- 要求字段只能读或只能写;
- 需要限定字段的取值范围;
- 在改变一个字段的值的时候希望改变对象的其它一些状态;
然而为什么我们建议使用属性而非公共字段,从设计的耦合性和项目的可维护性来举例,假如我们只是公开了这个字段,一旦我们想要修改这个字段的某些处理逻辑,那就必须对每一个引用了该字段的类中都进行处理。而使用属性,我们则只需要设置get方法即可。
实际上属性并不占用内存,只是用起来冗余一点,但是对于工程的提升是实打实的。
并且.net也提供了语法糖,我们只需定义属性即可使用同名字段了(打出prop+回车 自动补全):
public int Index{ get; set; }
相关文章:
【C#学习笔记】属性和字段
文章目录 前言属性和字段的区别字段访问修饰符和关键字定义变量类型的定义变量命名变量的赋值 属性 不同的使用情况 前言 最近在工作的过程中常常会觉得自己在程序设计方面的能力还是有欠缺。例如一直对于变量的声明感到不足,在工作中为了图方便总是直接public定义…...
最佳实践的实践 - API 不应将 HTTP 重定向到 HTTPS
原文:jviide - 2024.05.23 TL;DR: 与其将 API 调用从 HTTP 重定向到 HTTPS,不如让失败显而易见。要么完全禁用 HTTP 接口,要么返回明确的 HTTP 错误响应,并撤销通过未加密连接发送的 API 密钥。遗憾的是,许多知名的 A…...
四种跨域解决方案
文章目录 1.引出跨域1.基本介绍2.具体演示1.启动之前学习过的springboot-furn项目2.浏览器直接访问 [localhost:8081/furns](http://localhost:8081/furns) 可以显示信息3.启动前端项目,取消请求拦截器,这样设置,就会出现跨域4.跨域原因 2.跨…...
移动端投屏到大屏幕的操作详解
如果你懒得折腾电脑、电视或其他大屏设备上的影视软件安装及配置,可以选择直接在手机端上将影片投屏到电脑、电视或其他大屏设备上,这里给大家分享三种手机投屏的方法。 系统自带的投屏功能 不管是安卓、鸿蒙还是苹果操作系统,都自带了无线…...
【环境搭建】3.阿里云ECS服务器 安装Redis
在阿里云的 Alibaba Cloud Linux 3.2104 LTS 64位系统上安装 Redis 可以通过以下步骤完成: 1.更新系统软件包: 首先,更新系统软件包以确保所有软件包都是最新的: sudo yum update -y2.安装编译工具和依赖项: Redis…...
动态语言的开源编译器汇总
对于动态语言而言,我们通常不会使用传统意义上的“编译器”,因为动态语言往往是在运行时解释执行的,或者被转换为中间形式(如字节码),再由虚拟机执行。不过,为了性能考虑,现代动态语…...
Linux防火墙配置001
Linux防火墙主要用于控制网络流量,保护系统安全。在Linux中,有几种不同的防火墙管理工具,其中最常见的是iptables和firewalld。本章主要讲述如何关闭防火墙。 操作系统: CentOS Stream 9 操作步骤: 关闭防火墙&…...
Tomcat概述及部署
目录 一.Tomcat概述 1.介绍 2.使用场景 3.组件构成 4.组件结构 5.请求过程 二.Tomcat部署 1.关闭防火墙 2.下载安装JDK 3.安装启动tomcat 4.部署虚拟主机 4.1.创建 xy101 和 xy102 项目目录和文件 4.2.修改 Tomcat 主配置文件 server.xml 一.Tomcat概述 1.介绍 …...
[Vue3:Vite构建项目]:安装router实现登录页面路由跳转
文章目录 一:前置依赖查看依赖安装vite npm create vitelatest sys-instruction-0607 --template vue-ts安装路由:npm install vue-router4安装elementUI:npm install element-plus --save 二:配置文件:viewsÿ…...
概率论与数理统计,重要知识点——全部公式总结
二、一维随机变量及其分布 五个分布参考另外一篇文章 四、随机变量的数字特征 大数定理以及中心极限定理 六、数理统计...
Spring系列-SpringMvc父子容器启动原理解析
1、Spring整合SpringMVC 特性: 说到Spring整合SpringMVC唯一的体现就是父子容器: 通常我们会设置父容器(Spring)管理Service、Dao层的Bean, 子容器(SpringMVC)管理Controller的Bean .子容器可以访问父容器的Bean, 父容器无法访…...
[ssi-uploader插件]解决如何接收服务器返回数据+修改参数名称
前言 ssi-uploader是一款非常好用的多文件上传插件,源码是开源的,在github上面即可下载: https://github.com/ssbeefeater/ssi-uploader 但是源码有些微小的不足,今天我们解决两点问题: 上传文件完成后,…...
InfiniGate自研网关实现思路七
25.网关Nginx负载模型配置 通过模拟多个HTTP服务配置到 Nginx 做负载均衡,以学习API网关负载的配置和使用 API 网关是用于支撑分布式 RPC 接口协议转换提供 HTTP 调用的一套服务,那么 API 网关系统就需要可横向扩展来满足系统的吞吐量诉求。所以这里需…...
277 基于MATLAB GUI火灾检测系统
基于MATLAB GUI火灾检测系统,可以实现图片和视频的火苗检测。火焰识别的三个特征:1个颜色特征,2个几何特征颜色特征:HSV颜色空间下,对三个通道值进行阈值滤波,几何特征1:长宽比,几何…...
【西瓜书】4.决策树
1 递归返回情况 (1)结点包含样本全为同一类别 (2)属性集为空,没有属性可供划分了 或 有属性,但是在属性上划分的结果都一样 (3)结点为空结点 **结束时判定该结点的类别遵循如下规则&…...
区块链--Ubuntu上搭建以太坊私有链
1、搭建私链所需环境 操作系统:ubuntu16.04,开虚拟机的话要至少4G,否则会影响测试挖矿时的速度 软件: geth客户端 Mist和Ethereum Wallet:Releases ethereum/mist GitHub 2、安装geth客户端 sudo apt-get update …...
菜品信息分页查询——后端SpringBoot
1.分页查询的逻辑: 页面发送ajax请求,将分页查询参数(page,pageSize, name)提交到服务端,获取分页数据; 页面发送请求,请求服务端进行图片下载,用于页面图片展示。 开发菜品信息分页查询功能&a…...
利用GPT和PlantUML快速生成UML图用于设计
在软件开发中,设计阶段可是关键的一步。UML(统一建模语言)图能帮我们更清晰地理解和规划系统结构,但手动画UML图有时会很费时费力。好消息是,通过结合使用ChatGPT和PlantUML,我们可以高效地生成UML图&#…...
web-上传项目文件夹到Git远程仓库
Git初识 概念:一个免费开源,分布式的代码版本控制系统,帮助开发团队维护代码 作用:记录代码内容,切换代码版本,多人开发时高效合并代码内容 检验成功 打开bash终端(git专用)命令…...
使用OpenPCDet训练与测试Transformer模型:如何加载自己的数据集
引言 Transformer架构因其强大的序列处理能力和长距离依赖捕捉能力,在自然语言处理领域取得了巨大成功。近年来,这一架构也被引入3D物体检测领域,如Voxel Transformer等,显著提升了模型在复杂场景下的检测性能。OpenPCDet整合了多…...
四舍五入问题
单纯输出四舍五入可以用 printf("%.nf",num); 但是这个方法有时候会出错 代表输出n位四舍五入小数 而将数四舍五入赋值给变量可以用round()函数 a round(num); 表示将num四舍五入赋值给a 但是这么些只能转换位四舍五入的整数 可以改…...
零基础入门学用Arduino 第一部分(三)
重要的内容写在前面: 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后,整体感觉是很好的,如果有条件的可以先学习一些相关课程,学起来会更加轻松,相关课程有数字电路…...
C++标准库random
random 完整文档看这里 三步走: 选择一种随机数种子选择一个随机数引擎选择一个随机数分布输出 随机数种子 //生成随机数种子,在Linux的实现中,是读取/dev/urandom设备 std::random_device rd; unsigned seed1 rd();// 获取当前时间点作为随机数种子 unsigned seed2 std:…...
电子电气架构——车载诊断DTC一文通
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…...
Golang | Leetcode Golang题解之第129题求根节点到叶节点数字之和
题目: 题解: type pair struct {node *TreeNodenum int }func sumNumbers(root *TreeNode) (sum int) {if root nil {return}queue : []pair{{root, root.Val}}for len(queue) > 0 {p : queue[0]queue queue[1:]left, right, num : p.node.Left, …...
工业信息化SCI期刊,中科院1区TOP,IF=12.3,收稿范围广泛
一、期刊名称 IEEE Transactions on Industrial Informatics 二、期刊简介概况 期刊类型:SCI 学科领域:工程工业 影响因子:12.3 中科院分区:1区TOP 三、期刊征稿范围 IEEE工业信息学汇刊是一本多学科期刊,发表技…...
Spring Boot整合Redis
Spring Boot整合Redis Spring Boot 整合 Redis 是一种常见的做法,用于在 Spring Boot 应用程序中添加缓存、会话管理分布式锁等功能。 浅谈Redis Redis用于存储数据,且在内存当中进行存储。 但是在日常编写代码时,定义一个变量也就是属于在内…...
kafka的leader和follower
leader和follower kafka的leader和follower是相对于分区有意义的,不是相对于broker。 因为每个分区都有leader和follower, leader负责读写数据。 follower负责复制leader的数据保存到自己的日志数据中,并在leader挂掉后重新选举出leader。 kafka会再…...
git 空仓库笔记
标识身份,建议先完成 Git 全局设置 git config --global user.name “账号” git config --global user.email “email” 方式一:克隆仓库 git clone https://url/your.git cd your_path touch README.md git add README.md git commit -m "add …...
字母异位词分组(charyw)
字母异位词分组 题目描述 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 输入格式 第一行正整数n,表示有n个字符串(1<n<1000) 第二行n个字符串,空格隔开 输出格式 多组字母…...
wordpress首页添加价格/软文写作公司
假设需要交换的两个数为 a, b 使用中间变量 ------------- | a | b | t | ------------- 使用一个中间变量来做媒介来交换,设中间变量为t;则通过 a -> t; b -> a; t -> b 完成了交换,代码如下 var t a; a b; b t; 不使用中间变量…...
做淘宝客的网站需要备案吗/seo索引擎优化
自学PMP报考--考试全流程:如何自学通过PMP? PMP考试是需要35PDU才可以报名的,如果你要自学就可以在某宝上购买PDU,但是个人不建议(PDU证明一般是需要授权培训机构提供,在某宝买的第一不知道是否正规,第二…...
如何做网站服务器映射/bt磁力搜索
什么是WinRT? 首先WinRT是微软为了方便开发者编写Metro风格的程序而提供的一个开发平台。对于广大普通开发者而言,WinRT就是一堆Storage, Pickers, Controls,network,Media等组件的可供调用的API函数。开发者可以调用微软通过W…...
专业网站建设模板下载/什么软件可以推广自己的产品
给出凸包的定义: 简要说一下思路: 首先将所有点按照x从小到大(x同则y从小到大)排序 把p1,p2放入凸包,从p3开始,当新点在凸包‘前进’方向的左边时继续,否则依次删除最近加入凸包的点,…...
wordpress删除自豪的/搜索引擎优化管理实验报告
系列文章目录 Vue基础篇一:编写第一个Vue程序 Vue基础篇二:Vue组件的核心概念 Vue基础篇三:Vue的计算属性与侦听器 Vue基础篇四:Vue的生命周期(秒杀案例实战) 文章目录系列文章目录一、生命周期图示与说明…...
django做网站比较容易/深圳网络推广大师
声明使用的JDK9&Tomcat9版本; ① cookie的有效路径仅仅能被 其自身和其子路径访问; ② 当cookie的有效路径为 / 时候,web项目下所有的路径均可以访问到 cookie; 测试如下: 创建cookie: 访问 serv…...