编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

2.1.3 C#8.0 声明变量,你所不知道的一些事儿

gowuye 2024-05-16 14:32 3 浏览 0 评论

Hello World! 虽然让我们正式开始接触 C# 语言。但它只是输出了一串字符,并不能真正处理信息。有用的程序通常会获取、处理和生成信息,因此定义和识别信息的能力是语言最重要的特性之一。与大多数语言一样,C#允许您定义局部变量,这些变量是方法中的命名元素,每个元素包含一条信息。

说明:在c#规范中,术语 “变量” 可以指局部变量,也可以指对象和数组元素中的字段。本节完全关注局部变量,因此在本节中提到的 “变量 variable” 均指局部变量。

本节讨论的具体问题如下:

  1. 静态类型声明
  2. 隐式声明数据类型
  3. 要不要用 var ?
  4. 变量的命名方法
  5. 关于变量的其他问题

静态类型声明

c#是一种静态类型语言,也就是说,代码中表示或生成信息的任何元素,比如变量或表达式,都要在编译时确定的数据类型。这与动态类型语言 (如JavaScript) 不同,后者的类型是在运行时确定的。

认识到 C# 是静态类型的最简单方法是使用简单的变量声明,例如 示例3.1 中的那些。每个变量都以数据类型开始,前两个变量的类型是 string,后面跟着两个 int 变量。这些类型分别表示 文本字符串32位有符号整数

// 示例 3.1
string part1 = "the ultimate question";
string part2 = "of something";
int theAnswer = 42;
int andAnotherThing;

数据类型后面紧跟着变量的名称。名称必须以字母或下划线开头,可后跟字母、十进制数字和下划线的任何组合。(至少,如果您坚持使用 ASCII,这些是选项。C# 支持 Unicode,因此如果您以 UTF-8 或 UTF-16 格式保存文件,则标识符中第一个字符之后的任何字符都可以是Unicode规范附录 “标识符和模式语法” 中描述的任何字符。这包括各种重音符号、变音符号和许多有些模糊的标点符号。

虽然 C# 完全支持 Unicode 作为变量名称,甚至可以是中文或是一些表情包。但我仍然不认为那是合适的。最好还是坚持 ASCII 命名规则。

示例3.1 显示了变量声明的几种形式。前三个变量(part1 / part2 / theAnswer)都包括了初始化过程,它提供变量的初始值,但正如最后一个变量所示,也可不对其进行初始化、不指定具体值。你可以在任何时候为变量赋新值。示例3.2 从 示例3.1 继续,目的是给你展示:虽然 part2 已经被制定了初始值,但随时可为其赋新值。

// 示例 3.2
part2 = " of life, the universe, and everything";
andAnotherThing = 123;

因为变量具有静态类型,所以编译器将拒绝尝试分配错误类型的数据。因此,如果我们继续在上例中添加下方 示例3.3 语句,编译器就会用白眼儿瞪你。因为它知道名为theAnswer的变量被指定为 int 整数类型,所以如果我们试图向其分配文本字符串,它将报告错误。

//示例 3.3
theAnswer = "The compiler will reject this";  // 这是错误示例

您可以在 JavaScript 等动态语言中这样做,因为在这些语言中,变量没有自己的类型,唯一重要的是它所包含值的类型,并且可以在代码运行时更改。在 C# 中也可以通过声明一个类型为 dynamic 或 object 的变量来做类似的事情。然而,C#中最常见的做法依然是指定类型。

隐式声明数据类型

另外一种声明形式可以不必显式地声明变量类型。通过使用关键字 var 代替具体的数据类型名称,这时编译器将会为您解决变量类型的问题。示例3.4 声明并初始化了三个变量,但是使用了var而不是显式的使用 string 或 int 来定义变量类型。

// 示例 3.4 ;
var part1 = "the ultimate question";
var part2 = "of something";
var theAnswer = 40 + 2;
var theQuestion;  //警告!警告!警告!本行编译错误,请看下面文字说明。

这段代码经常误导了解一些 JavaScript 的人,因为在JavaScript 中也是使用 var 关键字来声明变量。但是在c#中,var 的工作方式与 JavaScript 不同:这些变量仍然都是静态类型的,虽然我们是让编译器为我们推断它。编译器会查看初始化过程,可以看到前两个变量是字符串,而第三个变量是整数。

警告,如果使用 var 来声明变量,必须进行初始化,为其赋值,以便于编译器判断其数据类型!这也时证明 C# 是静态数据类型的一个体现。示例3.4 第四行 theQuestion 的定义是错误的,会产生编译错误:

Implicitly-typed variables must be initialized [C2BasicCoding]

你可以通过尝试为 var 声明的变量分配不同类型的字面值来演示它们是静态类型的。我们可以在 例3.5中 尝试的相同事情,它将产生编译器错误,提示我们试图分配一个文本字符串到一个不兼容类型的变量。这个变量theAnswer,有一个int类型,尽管我们没有明确地说。

// 示例 3.5
var theAnswer = 42;
theAnswer = "The compiler will reject this";

要不要用 var ?

用var声明的变量的行为与等效的显式类型声明完全相同,这就产生了一个问题:应该使用哪个?在某种意义上,这并不重要,因为它们是等价的。然而,如果您希望您的代码保持一致,您将希望选择一种样式并坚持使用它。并不是每个人都同意哪种风格是“最好的”。

一些开发人员认为显式变量类型所需的额外文本是徒劳的“仪式”,他们更喜欢更简洁的var关键字。让编译器为您推断类型,而不是自己做这些工作,减少了代码中的视觉混乱。

我持不同的观点,从开发时间开销来说,写代码并不需要花很长时间,但阅读、调试、改写、重构则似乎才是 “头发数量屈指可数” 的主要原因。任何使这些活动变得更容易的事情都值得花一些时间去减少后期的工作量。所以用较少的时间显式地编写类型名就是在“保护你的”地中海”。到处使用var的代码会降低你的速度,因为为了理解代码,你必须弄清楚类型到底是什么。尽管var在编写代码时为您节省了一些工作,但当您每次回头查看代码时,额外的思考很快就会将这些收获抹去。所以,除非你是那种只写新代码,让别人帮你整理代码的开发人员,否则“无处不在的var”哲学真正提供的唯一好处就是它看起来更整洁。

在号称“宇宙最强”的 Visual Studio 中,您可以编写击键友好的 var,然后按 Ctrl+ . 打开 “智能提示” 菜单。这提供了将其替换为显式类型。( Visual Studio 使用 c# 编译器的 API 来发现变量的类型。)

所以,从上文中,你应该能感觉出来,我并不建议大家使用 var 。

变量的命名方法

虽然在本节上半段已经给大家了变量命名的基本要求。但显然只遵守基本要求是不够的,如果你的程序中充斥的大量的 a1、a2 这样的变量名,很快就会把自己搞乱,因为这些变量名显然没有什么特定的意义。

虽然变量的命名约定有很多,但我还是推荐大家在使用 C# 时,遵守 “骆驼 camelCase” 和 “帕斯卡 PascalCase” 命名法。

骆驼 camelCase:示例 myExamSocre 大家注意到 ES 两个大写字母了吗?这就是骆驼的驼峰。首单词小写 + 多个首字母大写的单词,构成了骆驼命名法。

帕斯卡 PascalCase:示例 MyExamSocre 与骆驼命名法不同的是,帕斯卡命名法的首单词(骆驼脑袋)的字母也是大写的。

通常情况下,在C#中,简单的变量一般用camelCase规则,而比较高级的命名使用PascalCase(如类名等)。

关于变量的其他问题

关于声明,值得了解的其他几件事是:

1.您可以在一行中声明和可选地初始化多个变量

如果需要多个相同类型的变量,这可以减少代码中的混乱。例2-8在一个声明中声明了三个相同类型的变量。

double a = 1, b = 2.5, c = -3;

2.变量的初始化

当您使用一个变量时,它的值是您上次分配给它的值。如果你在赋值之前尝试使用变量,就像例子2-10所做的那样,c#编译器会报告一个错误。

int willNotWork;
Console.WriteLine(willNotWork);

编译器将会产生如下错误:

error CS0165: Use of unassigned local variable 'willNotWork'

编译器是一个谨慎多疑的家伙,它会小心的判断变量是否有值。但由于实际情况过于复杂,某些情况下确实很难做出判断。但编译器却绝不能犯错,所以当代码运行时,即便变量已经有了值,但是编译器仍然会抱怨。解决方案是编写一个初始化器,以便变量总是包含一些内容,可能对数值使用 0,对布尔值使用 false,对字符串时用 "" 等。未来,我我们还将介绍引用类型,顾名思义,这种类型的变量可以保存对该类型实例的引用。如果您需要在获得引用内容之前对这样的变量进行初始化,您可以使用关键字null,这是一个特殊的值,表示对nothing的引用。

本课小结

总体来说本节知识点属于 “了解” 内容,看一遍,知道即可。不用深究!下一节讨论变量的作用域。

相关推荐

R语言数据挖掘实践——支持向量机的常用函数
R语言数据挖掘实践——支持向量机的常用函数

e1071包是R语言中用于支持向量机建模与分析的软件包,其主要用于支持向量机的模型构建,提供核心函数svm()来建立支持向量机的基础模型,并且可辅助使用pred...

2024-05-18 12:15 gowuye

R数据分析:如何做聚类分析,实操解析
R数据分析:如何做聚类分析,实操解析

Clusteringisabroadsetoftechniquesforfindingsubgroupsofobservationswi...

2024-05-18 12:14 gowuye

用R语言做数据分析——马赛克图
用R语言做数据分析——马赛克图

到目前为止,我们已经学习了许多可视化定量或连续型变量间关系的方法。但如果变量是类别型的呢?若只观察单个类别型变量,可以使用柱状图或者饼图;若存在两个类别型变量,...

2024-05-18 12:14 gowuye

用R语言做数据分析——方差分析基本概论
用R语言做数据分析——方差分析基本概论

在实际工作中,影响一件事的因素是很多的,我们总是希望通过各种试验来观察各种因素对试验结果的影响。例如,不同的生产厂家、不同的原材料、不同的操作规程,以及不同的技...

2024-05-18 12:14 gowuye

R语言数据分析实战:数据清洗与可视化
R语言数据分析实战:数据清洗与可视化

《R语言数据分析实战:数据清洗与可视化》是一本深入浅出的实践指南,专为对数据分析感兴趣的读者精心编撰。本书旨在帮助读者掌握R语言这一强大的统计分析工具,通过实例...

2024-05-18 12:13 gowuye

用R语言做数据分析——双因素方差分析
用R语言做数据分析——双因素方差分析

在双因素方差分析中,受试者被分配到两因子的交叉类别组中。以基础安装中的Tooth-Growth数据集为例,随机分配60只豚鼠,分别采用两种喂食方法(橙汁或维生素...

2024-05-18 12:13 gowuye

用R语言做数据分析——独立两样本和K样本检验
用R语言做数据分析——独立两样本和K样本检验

coin包简介对于独立性问题,coin包提供了一个进行置换检验的一般性框架,通过这个包,我们可以回答如下问题:响应值与组的分配独立吗?两个数值变量独立吗?两个类...

2024-05-18 12:13 gowuye

用R语言做数据分析——用回归做方差分析
用R语言做数据分析——用回归做方差分析

之前提到方差分析和回归都是广义线性模型的特例,之前文章的所有设计都可以用lm()函数来分析。为了更好地理解输出结果,需要弄明白在拟合模型时,R语言是如何处理类别...

2024-05-18 12:13 gowuye

数据分析R语言——数据结构
数据分析R语言——数据结构

数据分析R语言——数据结构数组数组(array)与矩阵类似,但是维度可以大于2.数组通过array()函数创建。形式如;myarray<-array(v...

2024-05-18 12:13 gowuye

R语言数据挖掘实践——关联分析的常用函数
R语言数据挖掘实践——关联分析的常用函数

arules和arulesViz是R语言中两个专用于关联分析的软件包。其中arules用于关联规则的数字化生成,提供Apriori和Eclat这两种快速挖掘频繁...

2024-05-18 12:12 gowuye

R语言数据挖掘实践——判别分析的常用函数
R语言数据挖掘实践——判别分析的常用函数

判别算法在R语言中实现主要涉及4个软件包中的相关函数,它们依次为MASS、klaR、class和kknn。其中MASS包含有大量实用而先进的统计计数函数及适用数...

2024-05-18 12:12 gowuye

用R语言读取Excel、PDF和JSON文件,终于有人讲明白了
用R语言读取Excel、PDF和JSON文件,终于有人讲明白了

导读:本文将讨论Excel、PDF等文件的读取,以及相应函数的参数设置。作者:刘健邬书豪如需转载请联系华章科技下图总结了主要程序包,希望读者在日常练习和工作中...

2024-05-18 12:12 gowuye

R语言数据挖掘实践——聚类分析的常用函数
R语言数据挖掘实践——聚类分析的常用函数

使用R语言可以轻松实现聚类分析,stats、cluster、fpc和mclust是常用的四个聚类分析软件包。stats主要包含一些基本的统计函数,如用于统计计算...

2024-05-18 12:12 gowuye

用R语言做数据分析——时间序列分类
用R语言做数据分析——时间序列分类

时间序列分类是根据已标注的时间序列建立一个分类模型,然后使用分类模型预测未标记时间序列的类别。从时间序列中抽取出新特征肯呢个有助于提高分类模型的性能。特征提取技...

2024-05-18 12:11 gowuye

一文看懂用R语言读取Excel、PDF和JSON文件(附代码)
一文看懂用R语言读取Excel、PDF和JSON文件(附代码)

导读:本文将讨论Excel、PDF等文件的读取,以及相应函数的参数设置。作者:刘健邬书豪如需转载请联系华章科技下图总结了主要程序包,希望读者在日常练习和工作中...

2024-05-18 12:11 gowuye

取消回复欢迎 发表评论: