目录
本篇主要介绍一下高级的变量类型
类型转换
隐式
Type A中的值都包含在Type B中,A可以隐式的替换为Type B
显示
- 类型转换注意值是否有溢出,可以使用checked/unchecked关键字,如checked((byte)var)如果有溢出就会报错
- Convert中的类型转换函数
高级变量
枚举
用enum定义枚举变量
enum<typeName>
{
<value1>,
<value2>,
...
<valueN>
}
声明
<typeName> <varName>;
赋值
<varName> = <typeName>.<value>;
枚举默认基本存储类型为int,要想指定其他基本类型,可在声明中添加类型
enum<typeName>:<underlyingType>
{
<value1>;
<value2>;
...
<valueN>
}
默认,枚举定义的值关联int从0开始,且按文本顺序递增1,及<value2>=<value1>+1,也可重写赋值过程,使用=指定每个枚举实际值
enum<typeName>:<underlyingType>
{
<value1>=<actualVal1>;
<value2>=<actualVal2>;
...
<valueN>=<actualValN>;
}
结构
使用struct定义结构
struct<typeName>
{
//<memberDeclatations>
<accessibility> <type> <name>;
}
//定义结构变量
<typeName> name;
//实例
struct route
{
public orientation direction;
public double distance;
}
//定义结构变量
route myRoute;
数组
声明
<baseType>[] <name>;
数组初始化有两种方式:
- 字面值指定完整内容
- 指定数组大小后使用new关键字初始化所有数组元素
//字面值指定
int[] myIntArray = {5,9,10,2,99};
//new初始化
int[] myIntArray = new int[5];
Note:
- 使用new显示初始化数组会给所有数组元素赋一个相同的默认值,数值类型是0
- 使用非常量的变量初始化
- 当组合两种方式定义,则该变量必须为常量,且赋值元素需和new指定大小相同
//非常量初始化
int arraySize = 5;
int[] myIntArray = new int[arraySize]
//两种结合
int[] myIntArray = new int[5]{1,2,3,4,5};
//下面是错误的
int[] muIntArray = new int[5]{1}; //大小不匹配
//除非arraySize声明为const否则是错误的
int[] myIntArray = new int[arraySize]{1,2,3,4,5};
array.Length 可以得到数组大小
特别的数组必须在访问前初始化,下面的赋值是错误的
int[] myIntArray;
myIntArray[10] = 5;
foreach可以只读的访问数组
foreach(<baseType><name> in <array>)
{
//can use <name> for each element
}
//实例
foreach(string firendName in firends)
{
WriteLine(firendName);
}
多维数组
声明:使用,声明
//二维数组
<baseType>[,] <name>;
//四维数组
<baseType>[,,,] <name>;
数组初始化
//声明一个x*y的二维数组
<baseType>[,] <name> = new <baseType>[x,y]
int [,] location = new int[3,4]
//隐式表示大小~一个3*3大小的二维数组
int [,] location = {
{1,2,3},{4,5,6},{7,8,9}};
访问,指定每个坐标即可
location[1,1];
foreach遍历多维数组和一维方式相同
数组的数组
声明:使用多个[]
<baseType>[][] <name>
int[][] data;
初始化
//基础
<name> = new <baseType>[x][];
<name>[0] = new <baseType>[y0];
...
<name>[N] = new <baseType>[yN];
//实例
data = new int[2][];
data[0] = new int[3];
data[1] = new int[4];
//也可以用字面值赋值
data = new int[2][]{
new int[]{1,2,3},
new int[]{4,5}
};
//隐式第一维初始化
int[][] data = {
new int[]{1,2,3},
new int{4,5}
};
foreach的遍历和多维数组不同,通常需要嵌套
foreach(int[] nums in data)
{
foreach(int num in nums)
{
WriteLine(num);
}
}
字符串处理
string可以看成char的只读数组(即字符串不可变),支持下标访问
string myString = "a string";
char myChar = myString[0];
修改单个字符
不能在原string上操作,需要从字符串生成字符数组,修改数组中的内容,然后从数组的已修改内容创建新字符串。使用String.ToCharArray()方法来创建字符数组。
string myString = "a string";
char[] myChars = myString.ToCharArray();
替换文本
使用String.Replace()方法来替换文本,该方法可替换字符串或单个字符,且搜索文本的每个匹配项均被替换。需要注意该替换不会改变原始字符串,想要保留改变后的字符串,需要创建一个新字符串保存。
string myString = "A string";
string myNewString = myString.Replace("A","New");
note:更高级的替换查找可以查阅正则表达式的相关内容。
删除文本
使用String.Remove()方法删除字符串中的文本,此方法移除特定索引处开始的某些字符。
string myString = "A string";
string removeString = "A";
int i = myString.IndexOf(removeString);
string result = string.Empty;
if(i>=0)
{
result = myString.Remove(i,removeString.Length);
//输出 string
Console.WriteLine(result);
}
Note:
- String.IndexOf("str")方法查找str在string中的起始索引
- string.Length返回字符串中字符的数量
- string.Empth返回一个空字符串
去除空格
使用String.Trim(),String.TrimStart(),String.TrimEnd()方法删除前/后置空格。使用该方法原字符串内容保持不变,保留修改内容需要创建新的字符串。此外也可指定删除其他前置或后置字符。
string myString = " A string ";
//删除前/后置空格
string myNewString = myString.Trim();
//删除前置空格
string myNewString = myString.TrimStart();
//删除后置空格
string myNewString = myString.TrimEnd();
//删除其他字符,在一个char数组中指定
char[] trimChars = {' ','s'}
string myNewString = myString.Trim(trimChars); //删除前后空格,字符s
添加空格
和上面类似,使用String.PadLeft()和StringPadRight()方法可以在字符串左右添加空格使字符串达到指定长度,也可以添加指定的字符,但是是使用char字符指定而非char数组
string myString = "A string";
//在左边添加两个空格
myString = myString.PadLeft(10);
//在左边添加两个 -
myString = myString.PadLeft(10,'-');
替换大小写
使用String.ToLower()和String.ToUpper()方法替换字符串大小写
string myString = Console.ReadLine();
if(myString.ToLower() == "yes")
{
Console.WriteLine("yes");
}
//使用上面的方法可以检查输入为 YES,Yes,yEs...等形式的字符串