不得不说这本书对于基础知识非常全面,今天重新学习了变量这一知识,受益匪浅。
变量
变量的声明:
变量由 datatype identifier;的形式声明而成,例如 int i;
声明后的变量可以接收数据,但数据必须符合声明的类型,比如不能讲int类型的变量赋值字符串 例如 int i= “string”; ×
可由类型推断关键字 var 进行变量声明,在变量初始化时将确定此变量的数据类型。此后不能改变此变量的类型了,强类型化必须以推断出类型为基础。
可以创建由用户自定义的对象作为类型,但在初始化时必须由new关键字在堆上创建一个对象,此变量将储存对这个对象的引用
需要注意的一点为变量在初始化之前使用将会被编译器识别为错误。需要对变量进行初始化即赋值才可使用。
变量的作用域:
变量被声明所在的花括号内则被称为变量的作用域。
不能再同一个作用域内再次声明已经存在的变量,否则编译器将无法识别您使用的该变量是哪一个,即错误。
可以在for while循环中声明变量,此变量将被视为循环内的局部变量。
若在方法中声明了变量而在方法中的循环体中也声明了与此变量同名的变量视为错误,因为在方法中此变量已被声明,而循环体内部的变量虽为局部变量,但对于方法体来说,方法体内的变量与方法体内循环体的变量处于同一作用域所以是不允许拥有同名的。
但可以在类级别声明变量的同时在此类中的方法体中声明与此类级别变量同名的变量,因为可以使用classname.indentifier 来区分它们。
常量:
常量的存在就是一种“不变量”,即一旦被定义初始化就不可改变,由const关键字声明,常量实际存在为static的修饰,但实际上你不允许使用static来修饰它,它是隐含的静态,不需要也不允许被static修饰。
常量的存在实际上是为了便于理解,而且能够避免错误!
值类型和引用类型:
值类型就是直接储存值,值类型将直接被储存在堆栈中。引用类型则是储存对复制对象的引用,这个对象储存在托管堆中。他们的差别在于:
值类型的变量赋值给另一个值类型后他们俩是独立存在的,就是说内存中会存在两个相同的数据,他们没有联系,改动一个另一个也不会发生改变。
引用类型则是储存对其引用,也可以说储存地址。改变其中一个另一个也发生改变,因为他们指向的是在堆中的同一个对象。像我们自己创建的类就是引用类型的,若想创建类型定义为值类型那么使用struct就可以了。
.NET类型
.NET其实有着自己的数据类型,编译器将把C#所定义的数据类型映射到.NET中,有很大的相似但也有明显的区别,举个例子:C#中的int总是32位而.NET则需要根据操作系统来确定。
之后的知识我就不细讲了,值得一提的有:
1)所以整形类型都支持十进制和十六进制,十六进制以 0x开头作为前缀。
2)C# 7支持使用下划线_分隔,但不支持下划线在前,7.2之后支持前缀下划线
3)可以使用0b作为表示二进制整数,但值只能为0和1组合。
4)C#提供了许多浮点类型的数据类型 float为单精度7位精度使用f后缀 double为双精度15/16位精度使用d,特别说明C#专门使用decimal作为财务运算使用的数据类型,用于28位精度使用m为后缀标识。
5)与Java一样string为特殊的一个数据类型,它是引用类型的数据类型,但不同的是它在被赋予另一个string类型数据时,它俩指向堆中同一个对象,当它再次被赋值时,会重新再堆中建立一个新对象再将地址给与它。所以说字符串string具有特殊性。
6)C# 使用@“”来是内部有使用转义字符时将它视为字符串而不具备转义字符特性,就是说强制视为字符串。$“”则使字符串能够穿插值(变量)但需要将变量使用花括号{}包裹。例:
“c:\\abc\\file.cs”等同于@“c:\abc\file.cs” || string a="abc"; Console.WriteLine("a is {1} ",a); 等同于 Console.WriteLine($"a is {a}");
最后附上数字字面值表:
字面值 | 位置 | 说明 |
U | 后缀 | 无符号 unsigned |
L | 后缀 | 长整形 long |
UL | 后缀 | 无符号长整形 unsigned long |
F | 后缀 | float 浮点型 |
M | 后缀 | Decomal 货币类型 |
0x | 前缀 | 十六进制数 |
0b | 前缀 | 二进制数 |
true | NA | 布尔值 真 |
false | NA | 布尔值 假 |