初学C#_3

类型分类及转换


在说类型分类及转换之前先说一下其他几个小知识点

null,它在C中是大写的,在Java中是小写的,它表示将一个变量设置为“无”,它只能赋给引用类型、指针类型和可空值类型,如

string s = null  //string类型是引用类型

再说的是,C#3.0添加的一个关键字var,它用于声明隐式类型的局部变量。用通俗的话讲,就是在声明变量时,只要进行初始化(关于初始化,在关于C的博客中已经说过),该变量就会被定义成相应的数据类型,下面举例

例1:

using System;

class Program
{
    static void Main(string[] args)
    {
        var num = 30;
        Console.WriteLine(num);

        var f = 99.9;
        Console.WriteLine(f);

        var ch = 'A';
        Console.WriteLine(ch);

        var str = "放假了";
        Console.WriteLine(str);
        //可以看出,在使用var声明变量时,变量的类型会成为与其值相同的数据类型
        Console.ReadLine();
    }
}

输出结果为:

好了,下面说一下数据类型的分类

以前说过数据类型有int、byte、long、float、double等,前三个可以说成是整数类型,后两个可以说成浮点数类型,但在这里,并不以这样的标准分类,

这里的分类,是以它们的复制方式分类的,这样可以分为两类:值类型和引用类型,值类型数据总是被值复制,引用类型总是被引用复制。

值类型:即变量直接包含值,,就像在C中所说的,变量就是值在内存中的编号,通过变量可以直接找到内存中存储的数据,它在进行复制时,原有的内存空间依然存在,只是多了一个内存副本(即又从内存中新申请了一块内存空间),这两个变量(新变量和被复制的变量),修改任何一个的值令一个都不会改变。

引用类型:引用类型直接包含的是数据存储在内存中的地址,这个类似于C中的指针引用类型指向的内存区称为堆。也因此,引用类型变量复制后,改变一个的值,另一个的值也会被改变。


还有,前面说过,null只能赋给引用类型,因为它可以解释为对“无”的引用,而如果值类型要存储null(这点在数据库编程中很有用,这里不多说),这就要用到可空修饰符(?),下面举例

例2:

using System;

class Program
{
    static void Main(string[] args)
    {
        int? count = null;

        Console.WriteLine("输出看看什么样子:{0}\n", count);
        Console.WriteLine("什么也没有!");

        Console.ReadLine();
    }
}

输出结果为:

下面说数据类型之间的转换

首先说的是显示转换,需要用到转型运算符,其实就是C语言中的强制类型转换,格式也一样;C#提供了checked和unchecked这两个关键字来进行检查,使代码更安全,这个有点儿java中的try/catch的一些意思,使用checked后,会对数据进行检查,而使用unchecked后,代码会正常地(即使代码不太安全)执行;其次要说的是隐式转换,其实就是低精度数据向高精度数据转换,这样数据保证了不会丢失精度,下面举例说明

例3:

using System;

class Program
{
    static void Main(string[] args)
    {
        int num = 99;
        //short dnum = num;  //这样是错误的
        short dnum = (short)num;  //这里的(short)就是C#所说的转型运算符
        Console.WriteLine("显示转换的例子输出:{0}\n", dnum);

        int numb = 111;
        long lnumb = numb;
        Console.WriteLine("隐式转换的例子输出:{0}\n", lnumb);

        Console.ReadKey(); //功能与ReadLine()相同
    }
}

输出结果为:


例4:

using System;

class Program
{
    static void Main(string[] args)
    {
        int number = int.MaxValue; //前面说过,这是int型数据所表示的最大值
        int t = number + 1;
        Console.WriteLine("输出t的值为:{0}\n", t);
        /* 结果为:
            * 输出t的值为:-2147483648
            * 这表明数据已经溢出
        */

        //checked
        //{
        //    int cnt = int.MaxValue;
        //    int s = cnt + 1;
        //    Console.WriteLine("输出t的值为:{0}\n", s);
        //}

        Console.ReadKey();
    }
}

当注释部分取消后,再将上面的代码注释,会显示这样的结果:


出现异常,程序被中断

Unchecked的功能上面说了,使用unchecked后,代码会正常地(即使代码不太安全)执行,需要注意的是unchecked会屏蔽掉checked的功能,这里就不举例了


还有一种就是不进行转型的类型转换(其实在我看来还是类型转换,如果我理解错了,以后会改正),这个需要用到像Parse()这样的方法

下面举个例子

例5:

using System;

class Program
{
    static void Main(string[] args)
    {
        //使用Parse()方法
        string str = "101";
        int number = int.Parse(str);
        Console.WriteLine("字符串转换为整型:number = {0}\n", number);

        //使用Convert()方法,它允许从任何基本类型转换为其他基本类型
        string misc = "36.987";
        //string mis = "0";       //这里出错,因为在C#中bool类型只能是true或false
        string mis = "True";
        double dbu = Convert.ToDouble(misc);
        bool boolean = Convert.ToBoolean(dbu);
        bool boomis = Convert.ToBoolean(mis);
        //int cnt = Convert.ToInt32(misc);       //这里也出错,因为将字符转换为数字类型,需要符合其相应规范
        Console.WriteLine("字符串转换为浮点型:dbu = {0}\n", dbu);
        Console.WriteLine("字符串转换为布尔型:boolean = {0}\n", boolean);
        //Console.WriteLine("字符串转换为整型:cnt = {0}\n", cnt);

        /*
            上面都是string转换为其它类型,下面是其它类型转换为string,这需要用到ToString()这个方法
        */
        bool bo = true;
        string textbool = bo.ToString();
        Console.WriteLine("textbool的值为:{0}\n", textbool);

        int num = 987;
        string textint = num.ToString();
        Console.WriteLine("textint的值为:{0}\n", textint);

        double doub = 13.87;
        string textdouble = doub.ToString();
        Console.WriteLine("textdouble的值为:{0}\n", textdouble);

        Console.ReadKey();
    }
}

输出结果为:


    这些博客主要是讲我在学C#(我主要看的书是《C#本质论第三版》)的过程中,发现它和C/C++、Java的不尽相同之处,都是自己的见解,也是比较浅显的知识,如有错误,欢迎指出

如无说明,所有程序都是在Visual Studio 2012下运行通过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值