zoukankan      html  css  js  c++  java
  • C#3.0学习笔记(9)转换

    1, 什么是转换?

           答:转换是接受一个类型的值并使用它作为另一个类型的等价值的过程。

    2, 隐式转换?

           语言(C#)会自动做这些转换,并且转换不会丢失数据或精度,这叫隐式转换。

           例如,将8位的值转换为16位的值。

    3, 显式转换(或称强制转换)?

           对于语言不提供自动转换的,如果仍要将源类型转换为目标类型的,就叫显式转换。

           隐式转换时丢失数据或精度由程序负责,显式转换时丢失数据或精度由程序员负责。

           例如:

           class Program

    {

    static voidMain(string[] args)

    {

    ushort sh = 10;

    byte sb = (byte)sh; //顯式轉換

    Console.WriteLine("sb={0},此時數據沒有丟失。",sb);



    sh = 1365;

    sb = (byte)sh;//顯式轉換

    Console.WriteLine("sb={0},此時數據丟失了。",sb);

    Console.ReadKey();

    }

    }

            程序输出结果为:

       

    4, 转换的类型?

           如下图所示:

          

    5, 数字的转换?

      1>    隐式数字转换:

             占据较少位的数字类型可以隐式转换为占据较多位的数字类型。

      2>    显示数字转换:

              例如:

           class Program

    {

    static voidMain(string[] args)

    {

    ushort sh = 2000;

    byte sb;



    sb = unchecked((byte)sh); //unchecked運算符,不檢測溢出,大多數重要的位丟失了。

    Console.WriteLine("sb={0}",sb);

    Console.ReadKey();

    sb = checked((byte)sh); //checked運算符,檢測溢出,拋出OverflowException異常。

    Console.WriteLine("sb={0}", sb);

    Console.ReadKey();

    }

    }


    6, 引用转换?

           引用转换接受源引用并返回一个指向堆中同一位置的引用,但是把引用“标记”为其它类型。

           例如:

             class A { public int Field1;}

    class B : A { public int Field2; }

    class Program

    {

    static voidMain(string[] args)

    {

    B myVar1 = new B();

    A myVar2 = (A)myVar1; //強制轉換,作業A類的引用返回myVar1的引用。

    Console.WriteLine("{0}",myVar2.Field1); //正確

    Console.ReadKey();

    Console.WriteLine("{0}",myVar2.Field2); //編譯錯誤,因為Field2對于myVar2不可見。

    }

    }


    7, 装箱(Boxing)?

           定义:装箱是一种接受值类型的值,根据这个值在堆上创建一个完整的引用类型对象             并返回对象引用的隐式转换。

           例如:

           class Program

    {

    static voidMain(string[] args)

    {

    int i = 10; //創建并初始化值類型。

    object oi = i; //創建并初始化引用類型(使用裝箱后變量i的副本進行初始化)。

    Console.WriteLine("i={0},oi={1}",i,oi);

    //演示了i和oi是如何被獨立操作的。

    i = 12;

    oi = 15;

    Console.WriteLine("i={0},oi={1}", i, oi);



    Console.ReadKey();

    }

    }

        程序输出结果为:

             程序在内存中的布局如下图所示:       

    8, 拆箱(unboxing)?

           定义:拆箱就是把装箱后的对象转换回值类型的过程。

           需要注意的有以下几点:

      1>    拆箱是显式转换。

      2>    尝试拆箱一个值为非原始类型时会抛出一个InvalidCastException异常。

           例如:

           class Program

    {

    static voidMain(string[] args)

    {

    int i = 10; //创建并初始化值类型。

    object oi = i; //装箱i并把引用赋值给oi.

    int j = (int)oi; //拆箱并把值赋值给j.

    Console.WriteLine("i={0},oi={1},j={2}",i,oi,j);

    Console.ReadKey();

    }

    }

      程序输出结果为:

     

     

    9, 用户自定义转换?

      除了标准转换外,我们还可以为类或结构定义隐式和显式转换,这叫用户自定义转换。

      需要注意以下几点:

      1>    除了implicit和explicit关键词之外,隐式和显式转换的声明语法是一样的。

      2>    需要public和static修饰符。

      例如:

    class Program

    {

    static voidMain(string[] args)

    {

    Person bill = new Person("bill",25); //实例化对象。

    int age = bill; //将Person对象转换为int。

    Console.WriteLine("Person Info:{0},{1}",bill.Name,age);



    Person anon = 35; //将int转换为Person对象。

    Console.WriteLine("Person Info:{0},{1}", anon.Name, anon.Age);

    Console.ReadKey();

    }

    }

    class Person

    {

    public string Name; //声明变量。

    public int Age;

    public Person(string name, int age) //构造函数,初始化变量。

    {

    Name = name;

    Age = age;

    }

    public static implicit operator int(Person p)//将Person转换为int。

    {

    return p.Age;

    }

    public static implicit operator Person(int i)//将int转换为Person。

    {

    return new Person("Nemo",i);

    }

    }

      程序输出结果为:

     

     关于转换,今天先写到这儿了,欢迎各位园友拍砖,谢谢!

     

  • 相关阅读:
    用react重构个人网站 3-23
    用react重构个人网站 3-22
    React官方文档笔记之快速入门
    .Net多线程编程—同步机制
    .Net多线程编程—Parallel LINQ、线程池
    .Net多线程编程—并发集合
    .Net多线程编程—任务Task
    【翻译】MongoDB指南/聚合——聚合管道
    【翻译】MongoDB指南/CRUD操作(四)
    【翻译】MongoDB指南/CRUD操作(三)
  • 原文地址:https://www.cnblogs.com/mcgrady/p/2240326.html
Copyright © 2011-2022 走看看