Hi,你好! 下面我们来学习数据类型、 变量与常量。
这些概念呢,对于我们有一定程序设计基础的同学来说呢, 不是很难,当然也有一些细节我们要注意。
下面我们来看呢,程序里面的变量与常量。
我们知道呢,程序的基本 任务呢,就是对数据进行处理,这也就是计算机啊,它说的那个计算最基本的功能。
那数据进行处理呢,任何一个程序呢,首先接触的就是这个数据。
那这个数据呢,它就表现为变量与常量。
变量呢 就是我们常用的,比如说这里有个年龄等于 18,然后变量呢它值是可以改变的。
我们用了这么久的变量,它变量的本质是什么呢? 它的本质呢,就是内存里面的空间,所以我们一旦说到变
量,那么它就指内存的空间,只不过这个空间呢,是由编译器
和这个运行环境帮我们分配的,我们给它取个名字,我们就可 以用这个变量、 这个空间啦。
它的作用呢,就是用来存储信息。
所以反而是你在设计程序的时候,你想到我要记忆某个东西,那这个时候就要用变量。
变量可以说是程序最基本的。
另外一个呢,有的时候我们也用常量,这个常
量呢值是固定的,当然有一种呢是符号常量,我们这里指的是字面上写出来的, 叫 literal,这个字面常量。
变量的声明和赋值呢跟 C 语言很相似,
它基本上呢,我们就说,有一个类型 int 整数 x 和 y。
我们在声明某一个变量的时候,还可以赋一个初始值,那这个下面呢这是个 double 实数。
bool 类型呢,就是逻辑型,b 等于 true。
String 呢就是字符串型,字符串型呢,这里呢我们用字符串常量呢,要用双引号引起来。
还有一类呢,比如说 Person 等于 new 一个 Person ()。
总的来说呢,都是 声明一个变量,然后在声明的同时呢可以赋值,也可以呢在别的地方赋值。
在 C# 里面呢,变量的命名, 所有的变量的名字呢,它都是一个标识符。
这个标识符呢,是我们写变量、 函数名、
类名都要用标识符,那标识符呢用字母、 数字、 下划线构成。
一般地说呢,也不要超过 31 个字符。
有同学要问了:『我究竟能超出多长呢?』 那你可以去试一下,把这个留一个问题, 你试试看最长能多长。
变量名呢也不要与关键字或者是我们已有的类的名字同名, 那比如说
Age 等等、 personName 等等 这种书写呢都比较常见。
在 C# 里面,我们一般地说呢,不太主张用这个下
划线,除非一些特殊的那个变量用下划线,那么一般是用字母大写来区分这两个, 这样输入起来也比较方便。
当然 C# 呢是大小写敏感的,这个我们已经知道了。
在所有的数据在使用的时候呢,都有一个类型,大家看这里, int age
等于 5,或者说标签的位置、 Left 的位置加等于 5,我们以前用过。
然后呢 Timer 1.
Enabled 的,就是它的 使能等于 true,然后或者是文本等于一个字符串, 或者呢我们显现当前时间 DateTime.
Now,所以 我们看到有数字的、 有逻辑的、 有文本的、
有日期的, 那么所有的这些呢,都涉及到一个数据类型。
在本质上,任何一个数据呢,它都是有类型的。
那这个 数据究竟是什么意思呢?它实际上是一个是存储方式,
一个是参与的运算的一个抽象,也就是说我们整数
它在计算机里面,比如说它是用母码、 用补码的方式来存储的,
那字符串呢,它又是另一种方式来存储的,那日期呢,当然有另一种方式, 所以它存储方式,另外一个参与运算的不同。
当然我们复杂的类型呢, 比如说一个按钮,它也是一个类型,所以它也有
它的按钮类型,当然它的存储方式和运算呢就更复杂。
这是数据类型的概念。
在 C# 里面呢, 它的数据类型呢分了两种,分得特别明显这两种。
一种呢叫值类型,一种呢叫引用类型。
这里呢,这个表呢它比较复杂, 我们简单地说呢,有最常见的整数,那它就是个值类型。
引用类型呢,比如说按钮啊、 标签啊这种属于某种类的,就属于引用类型。
那这是这个图,我们等一下还可以再仔细讲。
那我们看一下, 这个数据类型,这两类一个叫 Value Type 值类型,一个呢 Reference Type 引用类型。
前者呢,比如说什么样值呢?整数、 实数,然后还有一些简单的结构体,那比如说
Point,实际上它就是 x、 y;Size 呢,实际上是宽和高;
DateTime 是年月日、 时分秒等等,所以呢这种
简单的基本类型,以及这种结构那种类型呢,它都属于值类型。
还有一类呢,就是按钮啊、 标签啊、 一本书啊、 人啊等等,这个呢都属于引用类型。
当然我们可以简单理解,就是说特别简单的,就是值类型; 复杂的,然后呢就是引用类型。
但是这个说法呢,不是特别准确。
我们下面来看一下它们的具体的那个差别,我们说类型呢肯定就有差别,那这个差别最大的呢 首先就是存储方式。
看我们这里呢,有这样的语句, 比如说 int a 等于
5,然后我们说 a 呢, b 等于 a,也就是说把 a 赋到 b 里面。
那这 里面它实际上呢,是做的一个工作呢就相当于是
把这个值啊拷贝到那去,所以我们画一个示意图。
变量在内存里面呢,它都是存储空间,那我 们这里呢,a
和 b 这两个,我们假定这是内存,然后我们给它 两个空间,这个
a 是一个空间,那 b 也 是一个空间。
那这个空间我们把 a 赋值为 5,然后呢 b 等于
a 呢实际上就是把这个 5 复制到这里面来,也就这里面变成了 5。
所以这个复制过程呢,我们就是说这两个变量都存到这,并且复制的时候就会把它复制过来。
这就是属于我们说的叫值类型,还有一类呢是引用类型。
引用类型在内存里的存储呢,它就复杂一点。
也画一个示意图, 那比如说这里有个变量 p,这个空间呢我们叫做
p,p 这个空间呢, 当它等于 new 一个 Person ()
的时候,它实际上呢是引用到,我们也可以理解 成指针呢,只不过呢,我们在
C# 里头呢,这个指针呢我们不叫指针了,我们叫引用。
这个人呢有姓名呢,有姓名呢、 年龄呢,然后还有其他一些属性等等,
就放到这里,从这个 p 变量引用到它,
当然有点像 C++ 的那个指针了,就指向它,引用了它,所以
这个,也就是说它实际上这个 p 里面呢,并没有把人的 所有信息全存到这个
p 这个地方,它是只是引用到这个地方, 所以这个叫引用类型。
如果我们有一个变量 p2,这个叫 p2 这个变量, 这个 p2
这个变量呢如果等于 p,它实际上是把这个引用呢也复制到这儿来了。
那引用复制到这儿的意思呢,它实际上就相当于 p2 也指向这个人了,因为它也是引用了它。
所以呢,也就是说它的复制并不是把这个人的信息全复制进来,只是把它的一个指针,或- 者叫引用
复制到它,所以这是这两类的一个最大区别, 它的存储方式和赋值,它有很大的差别。
在这里呢,我把它,给它一个术语呢, 我经常说呢,这个值类型呢就是存到这里,就是在这个变量里面,
它的一个术语呢叫做『栈』,叫做,叫做『栈空间』。
我写一下那个栈,堆栈的栈。
那这个我们 引用型的变量除了栈以外呢,它还存到堆里头,也就是说
这个地方呢,我们叫做堆。
也就是说,任何一个引用型变量呢,它实际上呢栈里面 有个引用,在另外一个地方呢,这个堆呢,是真正地存储信息。
这是一个很关键的地方,所以我把这个地方呢,就叫做它就是存到这里,然后呢
这一种呢,我把它存在那里,我把它叫做存在那里,所以你以后呢 你就记住我在这里、 在那里就是指的是
这个实际的变量呢,它是引用的关系,一个叫这,在这里,一个叫那里。
好了,下面你想一想,我这个 DateTime 它是一个值类型,
它的,它就不是引用类型, 虽然它也写个
new 什么,但是它是值类型,所以它的存储空间呢,大家可以想一下
这个 DateTime 它里面,它可能有年月、
时分秒, 占了一个很复杂的一个信息,比如说 2018 年等等。
然后我们有一个 t2, t2 这个空间,t2
这个 空间呢,它实际上在复制的时候,就把年月日、 时分秒全都复制下来了。
因为它没有引用,所以它把这里面的信息全复制下来。
所以这个呢它 所以 DateTime 和 int 呢,都是值类型,中间那个 Person 是引用 类型。
这是我们 C# 类型里面,要掌握的最重要的地方,所以我花的时间比较多。
当然两种类型呢又是统一的,首先它们都是类型,好象这有点废话。
都是类型,那当然了。
任何变量也都有类型,比如说 int,所以它的写法很相似,
很相似,比如说按钮等于 new 一个 Button (),也很相似。
所以然后呢,同样地,我们 double 它也是个
类型,所以类型呢它也有 Parse 这样的方法,因为它也是个类型。
类型呢 都是一样的,在一定程度上一样。
另外所有的对象呢,它又都是 Object, 所以它也是都是统一的。
那么因为 Object 都可以 ToString (),都可以转成字符串。
我们前面比如说 标签的文本等于 age.
ToString (), 所以这个两种类型,它又是统一的一种关系。
当然类型的细分呢,我们后面会逐渐讲到,这里呢简 单说一下,值类型呢就包括简单类型、
整数啊等等;结构类型就是刚才我们说的 日期时间啊、
Size 啊、 Point 啊等等,简单的这种结构类型,也叫
Struct, 所以这个 Struct 呢就是结构。
然后引用类型呢, 就主要就是类类型,当然以后还有引,还有接
口,还有委托,还有一个数组,这是我们要学的。
这个 Struct 和 Class,有的同学学了 C++,但是 C++
呢这两个 Struct 和 Class 是一样的,但是在 C# 里面
它是两种完全不同的类型,一个是值类型,一个是引用类型。
另外我们注意一下,每一种简单类型呢,都有一个等价的一个 那个类型。
比如说 int 它就等价于、 相当于 System.
Int 32 这个类型; 同样地 double 相当于 System.
Double; bool 呢相当于 System.
Boolean 型; string 相当于 System.
String。
注意呢,一个是小写的,一个是 大写的。
当然如果我们 using System 以后呢,string 就相当于 大写的 String,因为它是相当于大写的 System.
String。
这就是关于类型的一些最基本的一些知识。