• 一天一小步_我学C#入门精典_第五天


    第五章 变量的更多内容

    •  枚举-变量类型,用户定义了一级可能的数值,这些数值可以用人类能理解的方式使用。
    • 结构-合成的变量类型,由用户定义的一组其他变量类型组成。
    • 数组-包含一种类型的多个变量,可以用下标全工作更容易完成。

    1,类型转换

    类型转换有两种形式:

    • 隐式转换:从类型A到类型B的转换可以在所有的情况下进行,执行转换的规则非常简单,可以让编译器进行。
    • 显式转换:从类型A到类型B的转换只能在某些情况下进行转换的规则比较复杂,应进行某种类型的处理。

    (1)隐式转换

    示例:ushort和char的值是可以互换的,因为它们都可以存储0~65535之间的数字,在这两个类型之间可以进行隐式转换,例如下面的代码:


    ushort destinationVar;
    char sourceVar = 'a';
    destinationVar 
    = sourceVar;
    Console.WriteLine(
    "sourceVar val: {0}", sourceVar);
    Console.WriteLine(
    "destinationVar val: {0}", destinationVar);

     这里存储在sourceVar中的值 放在destinationVar中。

    输出结果:

    sourceVar val: a

    destinationVar val:97

    即使两个变量存储的是相同的信息,使用不同的类型解释它们时,方式也是不相同的。

    简单类型有许多隐式转换:bool和string没有隐式转换,但数值类型有一些隐式转换。

    下表列出了编译器可以隐式执行的数值转换(char存储的是数值,所以char被当作一个数值类型)。


     类型         可以安全的转换为

    byte         short,ushort,int uint ,long,ulong,float,doubledecimal

    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


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

    例如,short类型的变量可以存储0~32677的数字,而byte可以存储的最大值是255,所以如果要反一个short值转换为byte值,就会出问题。如果short包含的值在256~32767之间,该数值就不能放在byte中。

    如果short类型变量中的值小于255,就可以转换这个值。但必须使用显式转换。

    (2)显式转换

                byte destinationVar;
                
    short sourceVar = 7;
                destinationVar 
    = sourceVar;
                Console.WriteLine(
    "sourceVar val: {0}", sourceVar);
                Console.WriteLine(
    "destinationVar val: {0}", destinationVar);

     如果编译这段代码,就会产生一个编译错误,为了成功编译这段代码,需要添加代码,进行显式转换。

    数据类型转换就是强迫数据从一种类型转换为另一种类型,其语法:

    (destinationType)sourceVar

    *彼此之间没有什么关系的类型不能进行数据转换。

    所以上面第三行代码应改为

    destinationVar = (byte)sourceVar;

    得到如下结果:

    sourceVar val: 7

    destinationVar val: 7

    在试图把一个值转换为不合适的变量时,会发生什么呢?修改代码:

    short sorceVar = 281;

     结果如下:

    sourceVar val: 281

    destinationVar val: 25

    如果看看这两个数字的二进制表示,以及可以存储在byte中的最大值255:

    281=100011001
    25  =000011001

    255=011111111

    可以看出,源数据的最左边一位丢失了。

    这就引出一个问题,何时会丢失数据?所以我们需要知道当显式地把一种数据类型转换为另一种数据类型时,是否有数据丢失了。

    一种方式就是用两个关键字:checked 和 unchecked,称为表达式溢出检查环境。

    语法:

    checked(expression)

    unchecked(expression)

    (3)使用Convert命令进行显式转换

     Convert进行的显式转换:


    命令            结果类型

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



    示例:

            static void Main(string[] args)
            
    {
                
    short shortResult, shortVal = 4;
                
    int integerVal = 67;
                
    long longResult;
                
    float floatVal = 10.5F;
                
    double doubleResult, doubleVal = 99.999;
                
    string stringResult, stringVal = "17";
                
    bool boolVal = true;

                Console.WriteLine(
    "Variable Convertion Examples\n");

                doubleResult 
    = floatVal * shortVal;//将float和short显式转换为double,然后相乘.doubleResult=10.5*4=42
                Console.WriteLine("Implicit,->double:  {0}  *  {1}  ->  {2}", floatVal, shortVal, doubleResult);

                shortResult 
    = (short)floatVal;//将float显示转换为short,然后赋值.shortResult=10.5
                Console.WriteLine("Explicit,->short:  {0}  ->  {1}", floatVal, shortResult);

                stringResult 
    = Convert.ToString(boolVal) + Convert.ToString(doubleVal);//将bool和double显式转换为string,然后相加.stringResult="True99.999"
                Console.WriteLine("Explicit->string:   \"{0}\"  +  \"{1}\"   ->  {2}", boolVal, doubleVal, stringVal);

                longResult 
    = integerVal + Convert.ToInt64(stringVal);//将sting显式转换为long,然后与int相加.longResult=67+17=84
                Console.WriteLine("Mixed, ->long:  {0}  +  {1}  ->  {2}", integerVal, stringVal, longResult);

                Console.ReadKey();
            }


  • 相关阅读:
    【BUAA软工】Beta阶段设计与计划
    Visual Lab Online —— 事后分析
    Alpha阶段项目展示
    Visual Lab Online —— Alpha版本发布声明
    【BUAA软工】Alpha阶段测试报告
    Scrum Meeting #10 2020/04/19
    BUAA-OO-第一单元总结
    [软工顶级理解组] 0520第26次会议
    [软工顶级理解组] 0519第25次会议
    [软工顶级理解组] 0517第24次会议
  • 原文地址:https://www.cnblogs.com/soso_ak/p/1438756.html
Copyright © 2020-2023  润新知