学习笔记二-----数据类型

来源:互联网 发布:部落冲突 知乎 编辑:程序博客网 时间:2024/05/01 09:03

学习笔记二---数据类型来自微软msdn

1.数据类型(C# 编程指南)

C# 是强类型语言;因此每个变量和对象都必须具有声明类型

数据类型概述

数据类型可描述为:

· 内置数据类型,如 int char

· 用户定义数据类型,如 class interface

· 数据类型还可以定义为:

· 值类型(C# 参考)(用于存储值),

· 引用类型(C# 参考)(用于存储对实际数据的引用)。

2.强制转换(C# 编程指南)

数据类型之间的转换可以使用强制转换显式进行,但在某些情况下,也允许隐式转换。

C#

static void TestCasting()

{

    int i = 10;

    float f = 0;

    f = i;  // An implicit conversion, no data will be lost.

    f = 0.5F;

    i = (int)f;  // An explicit conversion. Information will be lost.

}

显式强制转换调用转换运算符,从一种类型转换为另一种类型。如果未定义相应的转换运算符,则强制转换会失败。可以编写自定义转换运算符,在用户定义类型之间进行转换。有关定义转换运算符的更多信息,请参见 explicitC# 参考) implicitC# 参考)

示例

下面的程序将 double 强制转换为 int。如不强制转换则该程序不会进行编译。

C#

class Test

{

    static void Main()

    {

        double x = 1234.7;

        int a;

        a = (int)x;  // cast double to int

        System.Console.WriteLine(a);

    }

}

输出

1234

3装箱和取消装箱(C# 编程指南)

装箱和取消装箱使值类型能够被视为对象。对值类型装箱将把该值类型打包到 Object 引用类型的一个实例中。这使得值类型可以存储于垃圾回收堆中。取消装箱将从对象中提取值类型。

在此示例中,整型变量 i 装箱并赋值给对象 o

C#

int i = 123;

object o = (object)i;  // boxing

然后,可以对对象 o 取消装箱并将其赋值给整型变量 i

C#

o = 123;

i = (int)o;  // unboxing

性能

相对于简单的赋值而言,装箱和取消装箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个全新的对象。次之,取消装箱所需的强制转换也需要进行大量的计算。

4.装箱转换(C# 编程指南)

装箱用于在垃圾回收堆中存储值类型。装箱是值类型(C# 参考) object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。

请看以下值类型变量的声明:

C#

int i = 123;

以下语句对变量 i 隐式应用装箱操作:

C#

object o = i;  // implicit boxing

此语句的结果是在堆栈上创建对象引用 o,而在堆上则引用 int 类型的值。该值是赋给变量 i 的值类型值的一个副本。下图说明了两个变量 i o 之间的差异。

装箱转换

 

还可以像下面的示例一样显式执行装箱,不过显式装箱从来不是必需的:

C#

int i = 123;

object o = (object)i;  // explicit boxing

示例

此示例通过装箱将整数变量 i 转换为对象 o。这样,存储在变量 i 中的值就从 123 更改为 456。该示例表明原始值类型和装箱的对象使用不同的内存位置,因此能够存储不同的值。

C#

class TestBoxing

{

    static void Main()

    {

        int i = 123;

        object o = i;  // implicit boxing

 

        i = 456;  // change the contents of i

 

        System.Console.WriteLine("The value-type value = {0}", i);

        System.Console.WriteLine("The object-type value = {0}", o);

    }

}

输出

The value-type value = 456

The object-type value = 123

 

5取消装箱转换(C# 编程指南)

取消装箱是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。

取消装箱操作包括:

· 检查对象实例,确保它是给定值类型的一个装箱值。

· 将该值从实例复制到值类型变量中。

以下语句同时说明了装箱和取消装箱操作:

C#

int i = 123;      // a value type

object o = i;     // boxing

int j = (int)o;  // unboxing

下图显示了以上语句的结果。

取消装箱转换

 

要在运行时成功取消装箱值类型,被取消装箱的项必须是对一个对象的引用,该对象是先前通过装箱该值类型的实例创建的。尝试对 null 或对不兼容值类型的引用进行取消装箱操作,将导致 InvalidCastException

示例

下面的示例演示无效的取消装箱及引发的 InvalidCastException。使用 try catch,在发生错误时显示错误信息。

C#

class TestUnboxing

{

    static void Main()

    {

        int i = 123;

        object o = i;  // implicit boxing

 

        try

        {

            int j = (short)o;  // attempt to unbox

 

            System.Console.WriteLine("Unboxing OK.");

        }

        catch (System.InvalidCastException e)

        {

            System.Console.WriteLine("{0} Error: Incorrect unboxing.", e.Message);

        }

    }

}

输出

Specified cast is not valid. Error: Incorrect unboxing.

如果将下列语句:

int j = (short) o;

更改为:

int j = (int) o;

将执行转换,并将得到以下输出:

Unboxing OK.

 

原创粉丝点击