Chapter 05 变量的更多内容
5.1类型转换
1.无论什么类型,所有的数据都是一系列的位,即一组0和1。变量的含义是通过解释这些数据的方式来传达的。最简单的示例是char类型,这种类型用一个数字表示Unicode字符集中的一个字符。实际上,这个数字与ushort的存储方式相同----他们都是存储0~65535之间的数字。
2.一般情况下,不同类型的变量使用不同的模式来表达数据。这意味着,即使可以把一系列的位从一种类型的变量移动到另一种类型的变量中(也许他们占用的存储空间相同,也许目标类型有足够的存储空间包含所有的源数据位),结果也可能与期望的不同。这并不是数据位从一个变量到另一个变量的一对一映射,而是需要对数据进行转换。
5.1.1 隐式转换
1.bool和string没有隐式转换
2.隐式转换的规则:任何类型A,只要取值范围完全包含在类型B的取值范围内,就可以隐式转换为类型B。
5.1.2 显示转换
1.关键字 checked和unchecked
5.1.3 使用convert命令进行显示转换
Convert.ToInt32(val)
转换的名称略不同于C#类型名称,例如,要转换为int,应使用Convert.ToInt32()。这是因为这些命令来自于.net framework的System名称空间,而不是C#本身。这样他们就可以在除C#以外的其他.net兼容语言中使用。
5.2 复杂的变量类型
5.2.1 枚举
有时希望变量提取的是一个固定集合中的值,就可以使用枚举类型。
1.定义枚举
枚举可以使用enum关键字来定义:
Enum typeName : underluingType
{
values1,
values2,
……
valuesN
}
接着声明这个新类型的变量:
typeName varName;
并赋值:
varName=typeName.value;
2.枚举使用一个基本类型(underlying)来存储。在默认情况下,该类型为int,可以是byte,short,ushort,int,uint,long和ulong。所以枚举和数组一样,数据类型只有一种的。
3.在默认情况下,每个只都会根据定义的顺序(从0开始),自动赋给对应的基本类型值。这意味着value1的值是0,value2是2......。可以重写这个赋值过程,使用=运算符。
4.还可以使用一个值作为另一个枚举的基础值,为多个枚举指定相同的值。没有赋值的任何值都会自动获得一个初始值,这里使用的值是比最后一个明确声明的值大一的序列。
5.把枚举转化为其他数据类型?
6.使用typeof(<var>)运算符,可以得到操作数类型。
5.2.2 结构
结构就是由几个数据组成的数据结构,这些数据可能有不同的类型。
1.定义结构
使用struct关键字来定义
struct <typeName>
{
<menberDeclarations>
}
<memberDeclarations>部分包含的变量的定义(成为结构的数据成员),其格式与往常一样,每个成员的声明都采用如下的形式:
<accessibility> <type> <name>;
如:
struct myStruct
{
pubilc int x;
pubilc double y;
}
定义了这个结构类型之后,就可以定义新类型的变量,来使用这个结构:
myStruct myStr;
还可以通过句点字符访问这个组合变量中的数据成员:
myStr.x=2;
myStr.y=2.3;
5.2.3 数组
前面所有的类型都有一个共同点:他们都只存储一个值(结构中存储一组值)。有时,需要储存许多数据,有时需要同时存储类型相同的几个值,而不是每个值都使用不同的变量。
数组是一个变量的下标列表,存储在数组类型的变量中。数组有一个基本类型,数组的各个元素都是这种类型。
1.声明数组:
<baseType>[] <name>;
其中<baseType>可以是任何变量类型,包括本章前面介绍的枚举和结构类型。
初始化数组有两种方式。
1)可以以字面形式指定数组的完整内容。需要提供一个用逗号隔开的元素值列表,该列表放在花括号中如:
int[] myIntArray={1,4,5,7,9};
2)也可以指定数组的大小,再使用new关键字初始化数组元素。需要使用下述语法:
int[] myIntArray= new int[5];
notice:
这里使用关键字new显示的初始化数组,用一个常量定义其大小。这种方式会给所有的数组元素都赋予同一个默认值,对于数值类型来说,其默认值是0。也可以使用非常量变量来进行初始化,如:
int[] myIntArray=new int [arraySize];
3)另外,还可以使用这两种初始化方式的组合:
int[] myIntArray=new int[5]{1,3,5,7,9};
使用这种方式,数组的大小必须与元素的个数相匹配。
如果使用变量定义其大小,该变量必须是一个常量,必须用const关键字例如:
const int arraySize=5;
int[] myIntArray=new int[arraySize]{1,3,5,7,9};
2.foreach循环
foreach(<baseType> <name> in <array>)
{
//can use <name> for each elemet
}
这个循环会迭代每个元素,依次把每个元素放在变量<name>中,且不存在访问非法的危险。使用这种方法和标准的for循环的主要区别是foreach循环对数组内容进行只读访问,所以不能改变任何元素的值。
3.多维数组
1)二位数组的声明:
<baseType>[,] <name>;
多维数组只需要更多的逗号:
<baseType>[,,,] <name>;
2)声明和初始化
double[,] hillHeight=new double[3,4];
还可以使用字面值进行初始赋值,这里使用嵌套的花括号用逗号隔开,如:
double[,] hillHeight={{1,1,1,},{2,2,2,2},{3,3,3,3}};
4.数组的数组(变长数组)
可以使用变长数组,其中每行都有不同的元素个数。为此,需要这样一个数组,其中的每个元素都是另一个数组。也可以有数组的数组的数组,或更复杂的数组。但是,注意这些数组必须有相同的基本类型。
1)声明数组的数组(变长数组),其语法要在数组的声明中指定多个方括号对,例如:
int[][] jaggedIntArray;
2)初始化
有两种方式:可以初始化包含其他数组的数组(称之子数组)然后依次初始化子数组:
jaggedIntArray=new int[2][];
jaggedIntArray[0]=new int[3];
jaggedIntArray[1]=new int[4];
也可以使用上述字面值赋值的一种改进形式:
jaggedIntArray=new int[3][]{new int[]{1,2,3},new int[]{1},new int[]{1,2}};
也可以简化,把数组的初始化和声明放在同一行上,如:
int[][] jaggedIntArray={new int[]{1,2,3},new int[]{1},new int[]{1,2}};
3)使用foreach迭代时,通常需要嵌套该循环,循环该数组本身和每个子数组。因为数组jaggedIntArray包含的是int[]元素,而不是int元素。
5.3 字符串的处理
1.string类型变量可以看作是char变量的只读数组,如:
string myString=” A string”;
char myChar=myString[4];
2.但是,不能用这种方式为各个字符变量赋值。为了获得一个可写的char数组,可以使用下面的代码,其中使用了数组变量的ToCharArray()命令:
string myString=” A string”;
char[] myChars=myString.ToChatArray();
接着就可以用标准方式处理char数组。也可以在foreach循环中使用字符串。
3.myString.Length;
4.myString.ToLower(); myString.ToUpper();
5.<string>.Trim()
1)可以使用<string>.Trim()删除输入内容前面<string>.TrimStart()的和后面的空格<string>.TrimEnd()。
2)也可以使用该命令删除指定的字符,只要在一个char数组中指定这些字符即可,如:
char[] trimChars={‘ ‘,’e’,’s’};
string userResponse=Console.ReadLine();
userResponse=userResponse.Trim(trimChars);
if(userResponse==”y”)
{
//act on response.
}
6.<string>.PadLeft()和<string>.PadRight()
1)可以在字符串的左边或者右边添加空格
myString=”Aligned”;
myString=myString.PadLeft(10,);
2)也可以添加指定的字符到字符串上,这需要一个char,如:
myString=”Aligned”;
myString=myString.PadLeft(10,’-’); //这将会在myString开头加上3个’-’。
7.<string>.Split()
1)可以把string转换为string数组,把它的指定的位置分隔开。这些位置采用char数组的形式。如:
string myString =“This is a test.”
char[] separator={‘ ’};
string[] myWords=myString.Split(separator);
notice:
在使用split()时,删除了分隔符。