跟siki老师学C#第五天

第五天,学习第一个知识就是关于类型转换的。

类型转换,顾名思义是与类型密切相关的。为什么要进行类型转换呢?因为我们当前的类型不满足我们使用当前变量,所以要把当前变量转换成我们需要的类型。
例如我们之前做过的练习题中,我们要求用户从控制台输入一个数字,然后我们拿这个数字作一系列运算。但是我们知道,从控制台输入的只是一个字符串,但我们想要的是一个数字,很明显是不满足我们使用要求的,所以这个时候我们就要进行转换,将string类型的字符串转换成能够计算的数值类型。

说完了类型转换的原因,我们来说说类型转换的分类:隐式转换和显式转换。
隐式转换就是这种类型转换是编译器偷偷进行的,在别人不知道的时候就自动转换好了;一般来说,当小类型想大类型转换的时候就用隐式转换,就好比把一个小盒子放在一个大盒子里,很容易很简单,编译器自己就可以进行,不用别人来操心。
显式转换与隐式转换相反,它不是编译器可以自动能转换的,而是需要人为地用代码去控制转换的进行;一般来说,当大类型向小类型转换时用显式转换,就好比把一个大盒子放在一个小盒子里,大盒子太大,放不进去,编译器没有能力处理这件事了,于是报错,接着手动地把大盒子去掉,装到小盒子里。
比如:byte类型比int类型小,byte就可以转换成int类型,反之,int不能转化成byte类型:
这里写图片描述
当int向byte转换的时候,编译器报错了,因为隐式转换完成不了这项工作。
所以需要显式转换:

这样就可以了。在前面加上一个圆括号,里面写上目标类型。

当然,这只是显式转换的一种方法,我们在前面使用的Convert.ToInt32()方法也是显式转换的方法之一。

另外,当一个数值转换成字符串的时候,用到了Convert.ToString()方法,同时,转换成字符串还可以用后面加空字符串的方法:

string oneStr = oneByte + "";

在字符类型转换成数值类型的时候尤其要注意数值类型的类型!!
如:”1234”可以转化成int类型、float类型、double类型,(byte类型不可以,因为范围的原因)
但是”123.4”只能转换成float类型或double类型,不能转换成int类型:

123.4不是标准的int类型。

以上是类型转换的相关内容,接下来介绍三个复杂类型。
为什么说复杂类型呢?我们在之前说了一些数据类型,都是比较简单的:int、string、bool、byte、float、double等等,这些类型意义很简单,用起来也十分简单。
那么复杂类型复杂在哪里呢?
首先:不常见,至少用得较少,没有简单类型那么普遍,其次:定义相对更麻烦一些,最后使用也比较麻烦,但是效率高。

首先来说复杂类型中的枚举类型:
我们说有int类型、string类型、bool类型,那么为什么会有枚举类型呢?
其实这个问题就像一加一为什么等于二或者说为什么会有int类型一样意义不大。我们暂时还无法理解为什么C#(或其他语言)中提出枚举类型,但是它确确实实是简化我们思维的一种方式。
那我们枚举类型会用在什么地方呢?

想象一下:我们在游戏开发中,必然要涉及到游戏状态:开始、暂停、结束、过关等。我们可以都用bool类型来表示游戏状态,但是效果并不好,因为在代码阅读性方面或其他逻辑方面可能不能很好的解决问题;用数字来代替游戏状态呢?可阅读性更差!这个时候我们的枚举类型就可以大展拳脚了。
先来介绍枚举类型的定义方法:枚举类型一般定义在命名空间之下,所有方法(包括主方法)之上。

namespace CSharp学习第五课
{
    enum typeName   //这里写上枚举类型的名称
    {
        value1,    //第一个值
        value2,    //第二个值
        value3,    //第三个值
        value4     //第四个值
    }
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

上面就是枚举类型的定义方法,可以看得出来,的确比较麻烦。
enum是关键字(全是小写哦!) 关键字后面空格,空格后面紧跟枚举名称,接着一对花括号,花括号里面一行一个值,值与值之间用”,”隔开,最后一个值后面不加逗号。

用的时候怎么用呢?
typeName name = typeName.value;
如:

enum GameState
{
    Start,
    Over,
    Pause,
    Succeed
}

GameState playerState = GameState.Pause;

这样我们在控制游戏进程的时候就可以通过游戏状态的值来判断,而不需要通过0、1、2、3或者isStart、isOver、isPause、isSucceed来判断。

在使用枚举类型的时候要注意的一点是枚举类型存储的时候默认为int,也就是说每一个枚举类型的值在内存中占有的空间和int相同,在不设置的情况下,默认从上往下从0开始依次递增:

namespace CSharp学习第五课
{
    enum GameState
    {
        Start,
        Over,
        Pause,
        Succeed
    }
 class Program { static void Main(string[] args) { int a = Convert.ToInt32(GameState.Start); int b = Convert.ToInt32(GameState.Over); int c = Convert.ToInt32(GameState.Pause); int d = Convert.ToInt32(GameState.Succeed); Console.WriteLine(a); Console.WriteLine(b); Console.WriteLine(c); Console.WriteLine(d); Console.ReadKey(); } } }

枚举类型的值默认是int类型的,但是也可以人为修改:

enum GameState:byte
{
    Start,
    Over,
    Pause,
    Succeed
}

这样就用占用空间更小的byte类型替换了int类型。

刚才我们也说到了枚举类型中数值是按0、1、2、3的顺序递增的,同样,这个规则也可以人为更改:

enum GameState:byte
    {
        Start = 100,
        Over = 103,
        Pause = 104,
        Succeed = 200
    }

更改的时候要注意存储类型的取值范围。

上面就是枚举类型的相关知识。天气好冷,手指打字好酸,尤其是左手小拇指,特别累,今天先看视频,明天再总结。

来来来,先把今天的总结了:
今天学习了类型转换,了解了显式转换和隐式转换,还有显式转换的转换方法。
接下来就学习了枚举类型,为什么要学习枚举类型、枚举类型怎么定义、枚举类型怎么使用、枚举类型的存储类型、枚举类型的值。

好,今天就先到这里,欢迎大家批评指正!万分感谢!!

你可能感兴趣的:(C#)