怎么给C#变量取名字

今天小编给大家分享一下怎么给C#变量取名字的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一.变量命名风格

变量命名风格通常会根据不同的变量类型来区分,以Java语言为例,根据变量类型不同有两种命名风格:

1)类成员变量、局部变量

类成员变量、局部变量通常采用驼峰命名风格,如下:

String userName;

2)静态成员变量、枚举值、常量

静态成员变量、枚举值、常量通常采用所有字母大写、多个单词以英文下划线连接,如:

public static final int MAX_YEARS = 25;
// 建议枚举类都以Enum结尾
enum ColorEnum {
    RED(0, "红色"),
    YELLOW(1, "黄色"),
    GREEN(2, "绿色"),
    WHITE(3, "白色"),
    BLACK(4, "黑色");
    private int code;
    private String name;
    Color(int code, String name) {
        this.code = code;
        this.name = name;
    }
}

二.变量命名最高境界

在函数命名那篇中我们说的函数命名最高境界是见字如面,那么对于变量命名来说,最高境界是什么呢?我认为是:自解释,即"代码即注释"。

为什么这么说呢,因为通常来说一个函数是会有函数注释的,即使函数名字取的不好,如果注释写的比较清楚,对于后续维护人员来说也是了解函数具体功能的一种方式。

而变量则不同,在一个工程里面,变量的数量远远大于函数的数量,所以不太可能对于每个变量都去写注释,所以如果一个工程的变量命名很糟糕,那么对于后续维护人员来说将是毁灭性的打击,因为每读到一个变量,可能就需要去猜测变量的含义,我想没有哪个人愿意读到这样的代码,永远记住一点:“代码是写给人看的,不是写给机器看的”。

譬如下面这段代码的命名就非常糟糕:

ppn = (cpn > 1) ? (cpn - 1) : cpn;
npn = (cpn < tpn) ? (cpn + 1) : tpn;
p = new Page(ppn, cpn, npn, tpn);

上面这段代码估计只有原作者清楚地知道各个变量的含义是啥了,

如果修改为下面这种写法,可读性会好很多,并且一目了然,很容易知道其大概意图是计算分页信息:

prePageNum = (curPageNum > 1) ? (curPageNum - 1) : curPageNum;
nextPageNum = (curPageNum < totalPageNum) ? (curPageNum + 1) : totalPageNum;
page = new Page(prePageNum, curPageNum, nextPageNum, totalPageNum);

三.变量命名最佳实践

1)采用名词或者形容词来命名变量

变量一般情况下建议使用名词、名字组合或者形容词,因为变量一般形容的是一种事物或者事物的属性,所以用名词或者名词组合更容易让人理解,而形容词一般用于bool类型的变量。

2)避免使用单字母变量,尽量细化变量含义

在程序中,尽量避免使用单字母变量,唯一可以接受使用单字母变量的场景只有for循环,不过还是不太推荐在for循环中使用单字母变量(用pos、index比for循环的i、j、k要好很多)。

举个例子,比如下面这行代码:

double calConeVolume(double b, double d) {
  return Math.PI * b * b * d / 3;
}

咋一看这个函数参数感觉挺清晰,但是一细看,b是什么?d又是什么?如果我要用这个函数,该怎么传参?估计大部人是一脸懵逼状,只能进去看实际的函数实现才知道b是圆锥体半径,d是圆锥体高度;

那么怎么优化这段代码命名呢?其实很简单,稍微细化一下变量含义,让变量名自己去表达实际意图:

double calConeVolume(double radius, double height) {
  return Math.PI * radius * radius * height / 3;
}

3)变量命名前后用词需统一

在同一个工程或者一个场景下,变量命名风格需前后统一,比如total和sum都能表示总计的意思,那么所有需要用到"总计"含义的地方要么全部使用total、要么全部使用sum。

保持前后命名风格统一是保证工程代码良好可读性的关键保证。

4)集合变量用类型或者复数s作为后缀

在java中,有很多集合,比如List、Map、Set等,那么集合变量该怎么命名呢?

一般可采取两种方式:

使用复数s结尾

List students = new ArrayList<>();

用集合类型作为后缀

List studentList = new ArrayList<>();

上面两种方式均可,没有比较明显的偏好,根据实际场景决定。第一种方式相对更简洁,第二种在局部作用域里面有多种相关的集合变量时区分度更大,比如:

List<Student> studentList = new ArrayList<>();
Map<Long, Student> studentMap = Maps.newHashMap();
for (Student stu : studentList) {
  studentMap.put(stu.getId, stu);
}

我的建议是如果局部作用域只有一种类型的集合,那么推荐使用复数形式;如果局部作用域有多个相关的集合类型,那么推荐用类型结尾。

5)禁止使用is作为bool类型的类成员变量前置

在java中,禁止用is作为bool类型的类成员变量的前缀,因为is作为前缀会导致序列化/反序列出现问题,阿里的java代码规范中也明确提到了这一点,所以在写代码的时候最好还是遵守公认的规范,不然哪天说不定就踩坑了。

6)尽量避免使用缩写进行命名

有些时候,变量名可能有点长,不利于代码可读性,因此很多时候在写代码的时候喜欢用缩写来命名,但这个不是一个好的习惯,除非使用的缩写是大家都会使用的约定俗称的缩写。

比如下面这个命名:

int averageStudentAge; => int avgStudentAge;

因为avg大家都知道是average的缩写,所以这么写问题不大,不会引起歧义;
但是下面这种缩写命名:

res
tmp
cnt

就不是好的缩写命名,因为不同的人阅读可能会有不同的理解:

res => response、resource、result
tmp => temporary、template
cnt => count、content、context

附上一些约定俗称的缩写:

全称 缩写
identification id
average avg
maximum max
minimum min
buffer buf
error err
message msg
image img
length len
library lib
password pwd
position pos
data transfer object dto
view object vo

7)抛弃掉flag变量

国内一些早期的教材上,到处充斥着各种flag风格的变量,这种命名方式对于大型工程简直就是噩梦,比如:

int flag = getDoctorFlag(doctorId);
if (flag == 1) {
  //....
}

看到这段代码,读者会有疑问flag变量的含义是什么?flag值为1的时候又代表什么含义?是医生的值班/在岗状态、还是医生的身体状态?估计读者的内心是崩溃的。
如果优化成下面这种形式:

DutyStatus doctorDutyStatus = getDoctorDutyStatus(doctorId);
if (doctorDutyStatus == DutyStatus.ONLINE) {
  // ...
}

就比上面的形式清晰多了,很容易看出来判断的是医生的值班/在岗状态。

以上就是“怎么给C#变量取名字”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程之家行业资讯频道。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件的解析。本文会介绍CsvHelper、TextFieldParser、正则表达式三种解析CSV文件的方法,顺带也会介绍一下CSV文件的写方法。 CSV文件标准 在介绍CSV文件的读写方法前,我们需要了解一下CSV文件的格式。 文件示例 一
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的人能快速转入Halcon平台下,通过文中的示例开发者能快速了解一个Halcon项目开发的基本步骤,让开发者能把精力完全集中到算法的开发上面。 首先,你需要安装Halcon,HALCON 18.11.0.1的安装包会放在文章末尾。安装包分开发和
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期使用。 设置dll路径 参考C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁中间的 方法一:配置App.config文件的privatePath : &lt;runtime&gt; &lt;assemblyBinding xml
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——NET的流行高性能JSON框架,当然也可以使用.NET自带的 System.Text.Json(.NET5)、DataContractJsonSerializer、JavaScriptSerializer(不推荐)。
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。&#xA;EventBus维护一个事件的字典,发布者、订阅者在事件总线中获取事件实例并执行发布、订阅操作,事件实例负责维护、执行事件处理程序。
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api/trans/vip/translate,使用方法参考通用翻译API接入文档 。&#xA;请求方式可使用 GET 或 POST 方式(Content-Type 请指定为:application/x-www-for
词云”由美国西北大学新闻学副教授、新媒体专业主任里奇·戈登(Rich Gordon)于2006年最先使用,是通过形成“关键词云层”或“关键词渲染”,对文本中出现频率较高的“关键词”的视觉上的突出。词云图过滤掉大量的文本信息,使浏览者只要一眼扫过文本就可以领略文本的主旨。&#xA;网上大部分文章介绍的是使用P
微软在.NET中对串口通讯进行了封装,我们可以在.net2.0及以上版本开发时直接使用SerialPort类对串口进行读写操作。&#xA;为操作方便,本文对SerialPort类做了一些封装,暂时取名为**SerialPortClient**。
简介 管道为进程间通信提供了平台, 管道分为两种类型:匿名管道、命名管道,具体内容参考.NET 中的管道操作。简单来说,匿名管道只能用于本机的父子进程或线程之间,命名管道可用于远程主机或本地的任意两个进程,本文主要介绍命名管道的用法。 匿名管道在本地计算机上提供进程间通信。 与命名管道相比,虽然匿名
目录自定义日志类NLog版本的日志类Serilog版本的日志类 上个月换工作,新项目又要重新搭建基础框架,把日志实现部分单独记录下来方便以后参考。 自定义日志类 代码大部分使用ChatGPT生成,人工进行了测试和优化,主要特点: 线程安全,日志异步写入文件不影响业务逻辑 支持过期文件自动清理,也可自
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机自动启动的两种常用方法](https://blog.csdn.net/weixin_42288432/article/details/120059296),将里面中的第一种方法做了封装成**AutoStart**类,使
简介 FTP是FileTransferProtocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。 FTP
使用特性,可以有效地将元数据或声明性信息与代码(程序集、类型、方法、属性等)相关联。 将特性与程序实体相关联后,可以在运行时使用反射这项技术查询特性。&#xA;在 C# 中,通过用方括号 ([]) 将特性名称括起来,并置于应用该特性的实体的声明上方以指定特性。
# 简介 主流的识别库主要有ZXing.NET和ZBar,OpenCV 4.0后加入了QR码检测和解码功能。本文使用的是ZBar,同等条件下ZBar识别率更高,图片和部分代码参考[在C#中使用ZBar识别条形码](https://www.cnblogs.com/w2206/p/7755656.htm
C#中Description特性主要用于枚举和属性,方法比较简单,记录一下以便后期使用。 扩展类DescriptionExtension代码如下: using System; using System.ComponentModel; using System.Reflection; /// &lt;
本文实现一个简单的配置类,原理比较简单,适用于一些小型项目。主要实现以下功能:保存配置到json文件、从文件或实例加载配置类的属性值、数据绑定到界面控件。&#xA;一般情况下,项目都会提供配置的设置界面,很少手动更改配置文件,所以选择以json文件保存配置数据。
前几天用SerialPort类写一个串口的测试程序,关闭串口的时候会让界面卡死。网上大多数方法都是定义2个bool类型的标记Listening和Closing,关闭串口和接受数据前先判断一下。我的方法是DataReceived事件处理程序用this.BeginInvoke()更新界面,不等待UI线程
约束告知编译器类型参数必须具备的功能。 在没有任何约束的情况下,类型参数可以是任何类型。 编译器只能假定 System.Object 的成员,它是任何 .NET 类型的最终基类。 如果客户端代码使用不满足约束的类型,编译器将发出错误。 通过使用 where 上下文关键字指定约束。&#xA;最常用的泛型约束为
protobuf-net是用于.NET代码的基于契约的序列化程序,它以Google设计的“protocol buffers”序列化格式写入数据,适用于大多数编写标准类型并可以使用属性的.NET语言。&#xA;protobuf-net可通过NuGet安装程序包,也可直接访问github下载源码:https:/
工作中经常遇到需要实现TCP客户端或服务端的时候,如果每次都自己写会很麻烦且无聊,使用SuperSocket库又太大了。这时候就可以使用SimpleTCP了,当然仅限于C#语言。&#xA;SimpleTCP是一个简单且非常有用的 .NET 库,用于处理启动和使用 TCP 套接字(客户端和服务器)的重复性任务