《C#入门经典》学习笔记(变量)

变量

 

类型转换

类型转换有两种形式:
隐式转换:类型转换可以在所有情况下进行,转换规则简单,可以让编译器进行
显式转换:类型转换只能在某些情况下进行,转换规则复杂,要进行类型处理


隐式转换

隐式转换不需要编写代码做任何处理
例如:
ushort和char的值可以隐式转换(内存储存结构相同)
char cVal = 'a';
ushort uVar = cVal;
结果:
cVal的结果是'a',uVar的结果是97

注意:并不是每个隐式转换的结果都是预期的结果

类型 可以安全地转换为
byte short,ushort,int,uint,long,ulong,float,double,decimal
sbyte short,int,long,float,double,decimal
short int,long,float,double,decimal
ushort int,uint,long,ulong,float,double,decimal
int long,float,double,decimal
uint long,ulong,float,double,decimal
long float,double,decimal
ulong float,double,decimal
float double
char ushort,int,uint,long,ulong,float,double,decimal

隐式转换规则:
任何类型只要其取值范围完全包含在类型B的取值范内,就可以隐式转换为类型B。


显式转换

显式转换就是编译器把数值从一种数据类型转换到另一种数据类型的过程

强制转换
语法:
(destinationType)sourceVar
把sourceVar的值强制转换为destinationType

注意:只有特定情况下可行,没有什么关系的类型之间不能进行强制转换

有时强制转换会得到不是预期的结果,如数据丢失
用关键字checked和unchecked可以对数据进行溢出检查
语法:
checked(expression)
unchecked(expression)

例如:
short sVal = 281;
byte dVal = checked((byte)sVal);
程序会提示溢出错误信息
如果用unchecked就不会对数据进行溢出检查(默认)


使用Convert命令进行显式转换

命令   结果
Convert.ToBoolean(val) val转换为bool
Convert.ToByte(val) val转换为byte
Convert.ToChar(val) val转换为char
Convert.ToDecimal(val) val转换为decimal
Convert.ToDouble(val) val转换为double
Convert.ToInt16(val) val转换为short
Convert.ToInt32(val) val转换为int
Convert.ToInt64(val) val转换为long
Convert.ToSByte(val) val转换为sbyte
Convert.ToSingle(val) val转换为float
Convert.ToString(val) val转换为string
Convert.ToUInt16(val) val转换为ushort
Convert.ToUInt32(val) val转换为uint
Convert.ToUInt64(val) val转换为ulong

其中val可以是各种类型的变量,而Convert命令总是进行溢出检查

 

复杂的变量类型


枚举

枚举类型(orientation类型)是一个固定集合
使用枚举类型:允许定义一个类型,提取提供的限定值集合中的一个值

定义枚举
用enum关键字来定义
语法:
定义枚举:
enum typeName
{
    Value1,
    Value2,
    ....
    ValueN
}

声明一个变量:
typeName varName;

赋值:
varName = typeName.value;

枚举使用一个基本类型来存储(underlyingType)。
枚举类型可以提取的每个值都存储为该基本类型的一个值
enum typeName : underlyingType
{
    value1,
    value2,
    ...
    valueN
}

枚举的基本类型可以是byte,sbyte,short,ushort,int(默认),uint,long和ulong
在默认情况下,每个值都会根据定义的顺序(从0开始),自动赋给对应的基本类型值。
这意味着value1的值是0,value2的值是1,valueN的值是N等。

重写赋值过程
使用"="运算符,指定每个枚举的实际值:
enum typeName : underlyingType
{
    value1 = actualVal1,
    value2 = actualVal2,
    ...
    valueN = actualValN
}

为多个枚举指定相同的值:
enum typeName : underlyingType
{
    value1 = actualVal1,
    value2 = value1,
    value3,
    ...
    valueN = actualValN
}

对于没有赋值的任何值都会自动获得一个初始值,使用的值是比最后一个明确声明的值大1开始的序列。例如,在上面的代码中,value3的值是value2+1。

注意:这可能会产生预料不到的问题,在一个定义的value2 = value1后指定的值可能与其它值相同。例如,在下面的代码中,value4的值与value2相同。
 
enum typeName : underlyingType
{
    value1 = actualVal1,
    value2,
    value3 = value1,
    value4,
    ...
    valueN = actualValN
}
 
注意,以迂回方式赋值可能会产生错误,例如:
enum typeName : underlyingType
{
    value1 = value2,
    value2 = value1
}


结构
 
结构(struct, structure的简写),就是由几个数据组成的数据结构,这些数据可能有不同的类型。根据这个结构,可以定义自己的变量类型。

定义结构
使用struct关键字定义结构:
struct <typeName>
{
 <memberDeclarations>
}

<memberDeclarations>部分包含变量的定义(称为结构的数据成员)
每个成员的声明格式:
<accessibility> <type> <name>;

要让调用结构的代码访问该结构的数据成员,可以对<accessibility>使用关键字public,例如:
struct route
{
 public orientation direction;
 public double distance;
}

定义变量:
route myRoute;

访问变量中的数据成员:
myRoute.direction = orientation.north;
myRoute.distance = 2.5;


数组

数组是一个变量的下标列表,存储在数组类型的变量中。

访问数组成员:
firendNames[<index>]

在方括号中指定下标,下标是一个整数,基数为0
数组有一个基本类型,数组中的各个条目都是这种类型。

1 声明数组
语法:
<baseType>[] <name>;
<baseType>可以是任何变量类型

数组必须在访问之前初始化,初始化有两种方式:
以字面形式指定数组的完整内容,用逗号分隔开的元素值列表
例如:
int[] myIntArray = {5, 9};

指定数组的大小,再使用关键字new初始化所有的数组元素
例如:
int[] myIntArray = new int[2];
这种方式会给所有的数组元素赋予同一个默认值(对于数值类型来说是0)

可以两种方式组合:
int[] myIntArray = new int[2] {5, 9};
使用这种方式,数组大小必须与元素个数相匹配

2 foreach循环
foreach循环可以定位数组中的每个元素
语法:
foreach(<baseType> <name> in <array>)
{
 // can use <name> for each element
}

例如:
foreach ( string friendName in friendNames)
{
 Console.WriteLine(friendName);
}

注意:foreach循环对数组内容进行只读访问,所以不能改变任何元素的值。

3 多维数组
多维数组就是使用多个下标访问其元素的数组。
语法:
<baseType> [,] <name>; //二维数组
<baseType>[, , ,]<name>; //四维数组
例如:
double[,] hillHeight = new double[3,4];
或者
double[,] hillHeight = {{1, 2, 3, 4},{2, 3, 4, 5},{3, 4, 5, 6}};
访问多维数组,只需指定它们的下标,并用逗号分隔开
例如:
hillHeight[2,3]
foreach 循环可以访问多维数组中的所有元素

4 数组的数组
数组的数组实际上就是用数组作为数组的元素,从而产生可变长数组

声明数组的数组
例如:
int [][] jaggedIntArray;

初始化数组的数组
例如:
jaggedIntArray = new int[][];
jaggedIntArray[0] = new int[3];
jaggedIntArray[1] = new int[4];
或者
int[][]jaggedIntArray = {new int[]{1,2,3}, new int[]{1}, new int[] {1,2}};

使用嵌套的foreach循环来访问每一个元素
foreach (int[] divisorsOfInt in divisors1To10)
{
 foreach (int divisor in divisorsOfInt)
 {
  Console.WriteLine(divisor);
 }
}

使用变长数组的语法比矩形数组复杂得多,但工作效率并不会因此而降低。

 

字符串的处理

string类型变量可以看作是char变量的只读数组。
可以用数组形式访问字符:
string myString = "A string";
char myChar = myString[1];
注意:不能用这种方式为各个字符串变量赋值。

使用ToCharArray()命令获得一个可写的char数组:
string myString = "A string";
char[] myChars = myString.ToCharArray();
这样可以得到标准的数组

使用myString.Length可以获取出字符串字符的个数
例如:
string myString = "A string";
int strLength = myString.Length;

<string>.ToLower()和<string>.ToUpper()命令,分别获取<string>的小写和大写形式
注意:这两个命令不会改变字符串本身的值,而是会创建一个新的字符串

<string>.Trim()命令,从<string>的开始位置和末尾移除空白字符的所有匹配项
<string>.Trim (Char[]) 命令,从<string>的开始和末尾移除数组中指定的一组字符的所有匹配项
使用<string>.TrimStart()和<string>.TrimEnd()命令,可以把字符串的前面或后面的空格删除。也可以指定char数组。

<string>.PadLeft()和<string>.PadRight()命令,它们可以在字符串的左边或右边添加空格,使字符串达到的指定的长度。
语法:
<string>.PadX(<desiredLength>);
也可以设置添加的字符
语法:
 <string>.PadX(<desiredLength>, <char>);
例如:
myString = "Aligned";
myString = myString.PadLeft(10, '-');  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值