C#编程自学之数据类型和变量三

了解了数据类型与变量的基本概念之后,我们来讨论数据类型的转换与装箱与拆箱!装箱和取消装箱使我们能够统一地来考察类型系统,其中任何类型的值最终都可以按对象处理。
一、数据类型转换
在编程时 我们有时候会遇到将一个类型的变量转换成另一种数据类型,我们称它为数据类型的转换,C#数据类型的转换有两种方式如下:
1.默认安全的数据类型转换
默认安全的数据类型转换:我们称之为 隐式的数据类型转换,什么是隐式的数据类型转换?隐式的数据类型转换就是数据类型的低范围(参考C#数据类型与变量一中的数据类型的范围)向高范围的数据类型的转换。例如:

int a = 200; //int 范围是 -2147483648~2147483647
long b = a; //long 范围是 -9223372036854775808~9223372036854775807 表示的整数范围更大 并且这个范围包含200
//所以我们认为这两个数据类型转换是默认合法的也称隐式数据类型转换
Console.WriteLine("b = "+b.ToString());

运行结果当时会输出:“b = 200”这段话啦!

2.强制的数据类型转换
了解隐式数据类型的转换后,我们在来了解下强制的类型转换,强制类型转换就是,当不满足隐式数据类型转换的规则时,的一种数据类型转换的方法,强制数据类型转换必然会引发一些错误,例如:
将高范围数据类型(简称高)转换低范围数据类型(简称低)时,那么当“高”变量的值,超出了“低”数据类型的范围时,我们简称数据类型溢出。代码如下:

long a = 3333333333; //long 范围是 -9223372036854775808~9223372036854775807 ->3333333333在这个范围中合法
int b = (int)a; //int 范围是 -2147483648~2147483647 -> 3333333333 超出了这个范围 所以导致数据类型溢出
Console.WriteLine("a =" + a.ToString());
Console.WriteLine("b ="+b.ToString());//类型溢出这里会输出一个非常大的负数

输出结果如下:

二、装箱与拆箱
理解完基本数据类型的转换后我们来看一下值类型与引用类型之间的转换,我们称为装箱与拆箱。
1.装箱
装箱就将值类型转换成引用类型:

int a = 10;
object obj = a; //将值类型转换引用类型,装箱操作

在装箱操作时,运行时会在托管堆上分配一个空间,存放a 中的10,并标志这块空间的装箱类型是int。
如图:

2.拆箱
那拆箱就跟装箱相反,就是将引用类型还原会值类型。

int a = 10;
object obj = a; //将值类型转换引用类型 装箱
int b = (int)obj; //将引用类型转换为值类型 拆箱

当拆箱时我们会将推中的10强制类型转换放到栈空间中(图中代表int b)。
如图

3.装箱与拆箱的作用
当我需要显示的方法,分别来显示 int float double类型的值到控制台。一般我们的设计方法如下:

class MyProgram
{
  //用来打印int类型的值
  public static void ShowInt(int a)
  {
    Console.WriteLine(" a ="+a.ToString());
  }

  //用来打印float类型的值
  public static void ShowFloat(float a)
  {
    Console.WriteLine(" a ="+a.ToString());
  }

  //用来打印double类型的值
  public static void ShowDouble(double a)
  {
    Console.WriteLine(" a ="+a.ToString());
  }

  static void Main(string[] args)
  {
    int a = 10;
    ShowInt(a);

    float b = 2.2;
    ShowFloat(b);

    double c = 2.22;
    ShowDouble(c);
  }
}

那么我们思考一下,这个时候我需要在支持 string , short,char等等的类型显示的时候,我们是不是需要对每一个类型都定义一个显示的方法? 此时我们在看看引入了装箱与拆箱概念的方法设计:

class MyProgram
{
  //将参数类型改为object
  public static void ShowObject(object obj)
  {
    Console.WriteLine("obj ="+obj.ToString());
  }

  static void Main(string[] args)
  {
    int a = 10;
    ShowObject(a); //int a 被装箱

    float b = 2.2;//float b 被装箱
    ShowObject(b);

    double c = 2.22;//double c 被装箱
    ShowObject(c);
  }
}

这样我们将来不管需要扩展多少数据类型我们这个方法都可以满足。
装箱用于在垃圾回收堆中存储值类型。装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。
关于C#数据类型与变量就介绍到这,希望上面三篇文章对大家的学习有所帮助。

(0)

相关推荐

  • C#编程自学之数据类型和变量一

    一.数据类型与变量的介绍 在程序运行的过程中计算机需要记录大量的状态 数据(这里我们统称数据).那这些数据都存放在哪呢?程序在运行过程中的数据一般都存放在内存.那么他们在内存中如何存放的一种描述就是数据类型.变量则就是数据类型的实体.那么我们来看一个例子: 假如现在需要设计一个程序计算整数 10 与 20 的和, 请看如下代码: using System; namespace MyProgram { class Program { static void Main(string[] args)

  • C#装箱和拆箱原理详解

    .NET包含一个特殊的Object类,可以接受任意的数据类型的值,当所传递或所赋值的类型不是一个特定的数据类型时,object类就提供了一种传递参数和赋值的通用方法.赋给object的值必须作为引用类型,并存放砸托管堆中. 装箱: int age = 24; object refAge= age; 可以看的出,第一条语句创建一个变量age,并将值放在托管栈中: 第二条语句将age的值赋给引用类型.它将值24放在托管堆中. 这个值类型包装为引用类型的过程,称为装箱. 拆箱: 相反,将引用类型转换为

  • C# 对文件与文件夹的操作包括删除、移动与复制

    在.Net中,对文件(File)和文件夹(Folder)的操作可以使用File类和Directory类,也可以使用FileInfo类和DirectoryInfo类.文件夹(Folder)是只在Windows操作系统中使用的名词.在操作系统的理论中,人们更习惯于使用目录(Directory)这个名词.或许微软为了有朝一日将.Net移植到其他的操作系统中(实际上也有很多人也在做着这个项目),所以还是以Directory来命名操作文件夹的类. File类和Directory类都是静态类.使用它们的好处

  • C# Bitmap 复制的小例子

    复制代码 代码如下: public Bitmap CopyBitmap(Bitmap source){    int depth = Bitmap.GetPixelFormatSize(source.PixelFormat); if (depth != 8 && depth != 24 && depth != 32)    {        return null;    } Bitmap destination = new Bitmap(source.Width, sou

  • C#中深度复制和浅度复制详解

    本文章主要是讲解C# 语言编程中,深度复制和浅度复制,下面我将通过一个实例进行讲解.在实例开发之前,我们得先知道深度复制是什么和浅度复制是什么,它们之间的区别又是什么,下面将为大家一一揭晓. 1.深度复制是什么? 深度复制就是引用类型的复制. 2.浅度复制是什么? 浅度复制是值类型的复制. 以下是C#中深度复制和浅度复制的实例代码引用片段: using System; using System.Collections.Generic; using System.Text; namespace T

  • C#编程自学之数据类型和变量二

    我们继续自学C#编程教程,在上一课中介绍了C#的基本数据类型以及变量,今天这一节课我们来介绍值类型与引用类型! 一.什么是值类型与引用类型? C#与大多数面向对象语言数据类型一样,分为值类型与引用类型两种?如何区分这两种类型?如图: 根据类型结构图我们得出: 1.值类型包括 内置数据类型如(int double float) 用户自定义值类型(struct 结构体) 枚举(emun) 2.引用类型包括 接口类型 类类型等等. 知道了那些类型属于值类型与那些类型属于引用类型之后,我们来分析一下值类

  • c#根据文件大小显示文件复制进度条实例

    初学者,照着书上的抄袭制作,但已经理解了里面的意思和应用,并且进行了稍微改善和异常捕捉.这里记录下,以防以后用到这方面的知识点. 窗体设计: code: 复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.

  • C#进行文件读写、创建、复制、移动、删除的方法

    本文实例讲述了C#进行文件读写.创建.复制.移动.删除的方法.分享给大家供大家参考.具体分析如下: 1.文件夹创建.移动.删除 //创建文件夹 Directory.CreateDirectory(Server.MapPath("a")); Directory.CreateDirectory(Server.MapPath("b")); Directory.CreateDirectory(Server.MapPath("c")); //移动b到a D

  • C#编程自学之运算符和表达式

    我们了解完C#数据类型与变量之后,还会遇到变量之间的运算,例如计算两个数的和等等运算.那么,C#中都有那些常用的运算符呢?那么,往下看吧! 一.算数运算符 1.基本算数运算符 说到算数运算符,我们首先就应该可以想到我们数学中一些常用的运算符例如:加 减 乘 除 求余! 那么在C# 这些运算符都是如何表示的呢? 知道C#基本运算符的表示之后我们该如何去使用呢?那么我们来看段代码来看下什么是表达式. int a = 10; //定义一个整形变量a 值为10 int b = 20; //定义一个整形变

  • C#使用SqlBulkCopy批量复制数据到数据表

    本文实例讲述了C#使用SqlBulkCopy批量复制数据到数据表的方法.分享给大家供大家参考.具体实现方法如下: 使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据 1.使用Datatable作为数据源的方式: 下面的代码使用到了ColumnMappings,因为目标表和数据源Datatable的结构不一致,需要这么一个映射

  • ASP.NET深度复制和浅度复制分析

    本文深入浅出的分析了ASP.NET深度复制和浅度复制.分享给大家供大家参考.具体分析如下: 之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉. 如果大家不懂值类型和引用类型的区别,请先看http://www.jb51.net/article/57471.htm,本来想自己写的,但刚好看到了这篇写的非常全面,就不自己写了. 大家都知道Object是所有类共同的基类,其有个方法是MemberwiseClone(),其用途为 我们可以通过这个方法来达到浅

随机推荐