666666666666666666666666666666666666## 1.显示转换和隐式转换
- 分类
隐式转换:编译器自动识别 , 不需要我们写更多的代码
显示转换:需要我们告诉编译器,什么类型转换成什么类型
short i=34;
int j=i;
当小盒子放入大盒子的时候,可以进行类型转换。
例子:
把一个小类型的数据复制给大类型的变量的时候,编译器会自动进行类型的转换。
byte myByte = 34;
int myInt = myByte;
例子:
myByte = (byte)myInt;
当把一个大类型赋值给一个小类型的变量的时候,需要进行显示转换(强制类型转换),就是加上括号里面写需要转换的类型。
int i = 33434;
short j = i;
当把大盒子里面的数据放入小盒子里面的时候,有可能小盒子装不下,所以编译器不允许直接这样写。
我们可以通过显示转换的方式
short j = (short)i;
2.使用Convert命令进行显示转换
前面说的显示转换跟隐式转换都是针对于数字来说的。
如果要把一个数字字符串转换成一个数字类型(整形或者浮点型),就要用到Convert里面的方法
string str = "123";
int num = Convert.ToInt32(str);
当字符串里面存储的是整数的时候,就可以转化为int类型,否则出现异常,当字符串里面是一个小数的时候,就可以转化为double类型。
int myNum = 2345;
它可以把一个int,float,double,byte类型转换成字符串。
string str2 = Convert.ToString(myNum);
string str3 = myNum + "";
一个int,float,double类型直接加上一个空的字符串,相当于把一个数字转化成一个字符串。
装箱和拆箱(先写这里以后再改)
3.复杂的变量类型——枚举,结构和数组
除了简单的变量类型之外,C#还提供了3个复杂的变量:枚举,结构和数组。
一.枚举类型
枚举类型的定义
enum < typeName >{
< value1 >,
< value2 >,
< value3 >,
…
< valueN>
}
枚举类型的声明 < typeName > < varName >;
枚举类型的赋值< varName >=< typeName >.< value >;
1.为什么使用枚举类型
在游戏中我们可以定义一个int类型来存储状态 0 游戏暂停 1游戏失败 2游戏胜利 3开始菜单,但是这样不容易阅读,而且容易出错。
这个时候我们通过枚举类型来解决
enum GameState{
Pause,
Failed,
Success,
Start
}
在游戏中定义一个 GameState state = GameState.Start;
namespace 初级教程练习01
{
enum GameState:byte//修改该枚举类型的存储类型,默认为int
{
Pause=100,//默认为0,可以自己修改,一般不改。往下依次递增
Failed,
Success,
Start
}
class Program
{
static void Main(string[] args)
{
//GameState state = GameState.Start;
//if (state==GameState.Start)//枚举类型作比较
//{
// Console.WriteLine("当前游戏状态为开始状态");
//}
GameState state = GameState.Start;
int num = (int)state;
Console.WriteLine(num);
Console.ReadKey();
}
}
}
2.枚举的其他内容
枚举类型中的每一个值,其实都是一个整数,默认为int类型
默认情况下枚举类型中的值从0开始,我们可以直接在枚举类型定义的时候 使用=运算符给每一个枚举指定一个特定的值
二.结构/结构体
如果我们要表示一个向量的话 需要定义,三个float类型 x y z
这样比较麻烦,不方便管理,我们可以使用结构
定义结构
struct < typeName >{
< memberDeclarations >
}
其中< memberDeclarations >是结构体的成员,每个成员的声明如下
< type > < name >;
struct Vector3{
float x;
float y;
float z;
}
namespace 初级教程练习01
{
//我们可以把结构体当成几个类型组成了一个新的类型
//比如下面的这个就是使用了3个float类型的变量来表示一个坐标类型。
struct Position
{
public float x;
public float y;
public float z;
}
class Program
{
static void Main(string[] args)
{
//当使用这个结构体声明变量的时候,相当于使用结构体中所有的变量去声明。
Position enemyPosition;
enemyPosition.x = 34;//可以通过加上属性名来访问结构体中的变量。
//使用结构体让程序变得更清晰
Position enemy2Position;
Console.ReadKey();
}
}
}
namespace 初级教程练习01
{
enum Direction
{
West,
North,
East,
Sourth
}
struct Path
{
public float distance;
public Direction dir;
}
class Program
{
static void Main(string[] args)
{
Path path1;
path1.dir = Direction.East;
path1.distance = 1000;
Console.ReadKey();
}
}
}
三.数组
前面所有的类型都有一个共同点:他们都存储一个值(结构存储一组值),这样会带来不方便,假如我们要存储几个类型相同的值。
案例:我们要存储玩游戏10次的得分:
int score1 = 34;
int score2 = 34;
int score3 = 56;
…
int score10=3434;
另外一种方式是使用数组,数组的声明
< baseType >[] < name >;
数组是一个变量的索引列表,这个索引是一个整数,第一个条目的索引是0,第二个是1,以此类推…
int[] scores; 声明了分数的数组(int类型的数组)
1.数组的初始化
int[] scores;
第一种方式
scores ={34,34,3,43,43,4,34};
第二种方式
scores = new int[10]; 里面的每一个元素按照类型的默认值赋值
第三种方式
scores = new int[10]{123,12,34,56,77,89,85,6,45634,34};
数组的访问
< arrayName >[条目索引]
namespace 初级教程练习01
{
class Program
{
static void Main(string[] args)
{
int[] Score01 = {23,34,56,76,68,87 };//使用这种方式赋值的时候,一定要注意在声明数组的时候赋值。
int[] scores02 = new int[10];
int[] scores03;
scores03 = new int[10];
int[] scores04 = new int[3] { 1,3,2};
Console.WriteLine(Score01[10]);//当我们访问一个索引不存在的值的时候,会出现异常exception。
Console.ReadKey();
}
}
}
namespace 初级教程练习01
{
class Program
{
static void Main(string[] args)
{
//字符数组
char[] charArray = new char[2] { 'a','b'};
Console.WriteLine(charArray[0]);
//字符串数组
string[] names = new string[] { "awf","法华寺","嘿嘿"};
Console.WriteLine(names[0]);
Console.ReadKey();
}
}
}
2.数组的遍历
遍历数组中的每一个元素并输出
第一种方式for
for(int i =0;i<array.Length;i++){
}
第二种方式while循环
int i=0;
while(i<array.Length){
//use array[i]
i++;
}
第三种方式foreach
foreach(int temp in array){
}
namespace 初级教程练习01
{
class Program
{
static void Main(string[] args)
{
int[] scores = { 23,34,25,24,23,234,45};
for (int j=0; j < scores.Length; j++)
{
Console.WriteLine(scores[j]);
}
int i = 0;
while (i<scores.Length)
{
Console.WriteLine(scores[i]);
i++;
}
foreach (var item in scores)//foreach会依次取到数组中的值,然后赋值给temp,然后执行循环体
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
}