C#引用类型转换的常见方式总结

本文以实例形式简单讲述了引用类型转换的几种常见方式,如:子类转换成父类,父类转换成子类,以及不是子父级关系类之间的转换。现分述如下,供大家参考:

一、隐式转换:子类转换成父类

public class Animal
{
    public int _age;
    public Animal(int age)
    {
      this._age = age;
    }
}
public class Dog : Animal
{
    public float _weight;
    public Dog(float weight, int age) : base(age)
    {
      _weight = weight;
    }
}

客户端,子类转换成父类。

static void Main(string[] args)
{
  Dog dog = new Dog(2.5f,12);
  Animal animal = dog;
  Console.WriteLine(animal._age);
}

结果:12

可见,子类转换成了父类是隐式转换。这种转换在栈上完成,栈上先有代表子类的变量dog,然后有代表父类的变量animal,最后把dog保存的堆地址赋值给了anmial。

二、强转:父类转换成子类

如果客户端父类转换成子类。

static void Main(string[] args)
{
  Animal animal = new Animal(12);
  Dog dog = (Dog)animal;
  Dog dog = animal as Dog;
  if (dog != null)
  {
 Console.WriteLine(dog._age);
  }
  else
  {
 Console.WriteLine("转换失败");
  }
}

结果:抛出异常,Animal无法转换成Dog

可见,使用以上方式把父类强转成子类,转换失败会抛出异常。

三、使用as强转:父类转换成子类

如果客户端使用as把父类转换成子类。

static void Main(string[] args)
{
  Animal animal = new Animal(12);
  Dog dog = animal as Dog;
  if (dog != null)
  {
 Console.WriteLine(dog._age);
  }
  else
  {
 Console.WriteLine("转换失败");
  }
}

结果:转换失败

可见,使用as把父类强转成子类,转换失败不会抛出异常。

四、使用is先判断再强转:父类转换成子类

可以在强转之前,先使用is判断父类是否能转换成子类,再根据子类实例是否为null判断是否转换成功。

static void Main(string[] args)
{
  Animal animal = new Animal(12);
  Dog dog = null;
  if (animal is Dog)
  {
 dog = (Dog)animal;
  }
  if (dog == null)
  {
 Console.WriteLine("转换失败");
  }
  else
  {
 Console.WriteLine("转换成功");
  }
}

五、使用操作符实现强转

可以在一个类中设计一个静态的、隐式的、操作符方法,把本类实例转换成另外一个目标转换对象实例。

public class Benz
{
    public int Mile { get; set; }
    public Benz(int mile)
    {
      Mile = mile;
    }
    public static implicit operator Car(Benz benz)
    {
      return new Car(){Mile = benz.Mile};
    }
}
public class Car
{
public int Mile { get; set; }
}

客户端

static void Main(string[] args)
{
  Benz benz = new Benz(1000);
  Car car = benz;
  Console.WriteLine(car.Mile);
  Console.ReadKey();
}

结果:1000

○ 使用操作符,把原本毫无关系的2个类建立关系,可实现转换
○ 当执行Car car = benz的时候,就会执行Benz类的操作符方法operator Car
○ 操作符方法必须满足几个条件:静态的、implicit,名称和需要转换的类名保持一致,返回需要转换的类实例
○ 当执行Car car = benz的时候,在堆上创建一个Car实例,然后赋值给栈上的变量car

总结:

① 子类转换成父类是隐式转换,其本质是栈上的一个变量值赋值给了栈上另外一个变量
② 父类转换成子类,如果直接使用"(子类)父类实例"的方式,很容易抛出异常
③ 父类转换成子类,如果使用as,可以避免抛出异常
④ 父类转换成之类,也可以先使用is判断,然后再进行转换
⑤ 2个不是子父级关系的类,可以在1个类中设计一个操作符方法,把该类实例转换成目标对象实例

相信本文所述对大家C#程序设计的学习有一定的借鉴价值。

(0)

相关推荐

  • c#之用户定义的数据类型转换介绍

    c# 允许用户进行两种定义的数据类型转换,显式和隐式,显式要求在代码中显式的标记转换,其方法是在圆括号中写入目标数据类型. 对于预定义的数据类型,当数据类型转换时可能失败或丢失某些数据,需要显式转换, 1 把int数值转换成short时,因为short可能不够大,不能包含转换的数值. 2 把有符号的数据转换为无符号的数据,如果有符号的变量包含一个负值,会得到不正确的结果. 3 把浮点数转换为整数数据类型时,数字的小数部分会丢失. 此时应在代码中进行显式数据类型,告诉边起义你知道这会有丢失数据的危

  • 浅析C#数据类型转换的几种形式

    1.Convert.ToInt32(); //转换成32位的整数.2.变量.ToString();/最常见的转换成 字符串.3."订单"+2514 //后面的数字会转换为字符串.4.((类名A)对象名X) //强行将 对象X 转换成 A类 的对象.5.int.Parse(string);把字符串型转换成其他类型.6.还有,如果要转换成的类型为引用类型,还可以用 as teacher tea = teahcer();如 student stu = tea as student; (1)

  • C#转换日期类型实例

    本文实例讲述了C#转换日期类型的方法.分享给大家供大家参考.具体分析如下: 如:将日期1999-5-31 11:20转换成 /Date(928120800000+0800)/ 其中928120800000实际上是一个1970 年 1 月 1 日 00:00:00至这个DateTime中间间隔的毫秒数. 0800代表的是时区,(0800代表就是中国地区) 具体代码如下: 复制代码 代码如下: public long MilliTimeStamp(DateTime TheDate) { DateTi

  • C#基础之数据类型转换

    int x; long y = 123456789101112; x = (int)y; Console.WriteLine(x); 输出结果: 我们知道long类型的取值范围是-9223372036854775805~+9223372036854775807:int类型的是:-2147483648~+2147483647 上面的代码中,由于long变量的值超过了int能容纳的最大值,造成了数据的丢失:像这样有可能造成数据丢失或引发异常的任何转换都需要执行显式转换(explicit); 相反的就

  • c#入门之类型转换详解

    "无论是什么类型,所有的数据都是一系列的位,即一系列0和1.变量的含义是通过解释这些数据的方式来传达的."--这句原话是书上翻译的,不过后一句话总感觉理解起来不是很通俗,自己觉得这样理解可能会合适些:无论什么类型的数据,在计算机存储时都是0和1,而变量的意义,就是以不同的方式来解释这些数据,以达到满足程序应用.节约内存等需求. 换句话说:变量存在的意义,就是建立规(标)范(准)的数据存储方式. 隐式转换 类型转换分两种形式:隐式转换.显示转换. 隐式转换不需要单独的表达式,只需要把满足

  • C#用户定义类型转换详解

    C#用户定义类型转换 •用于自定义类和结构能够进行隐式转换和显示转换.例如:将一个自定义类类型转换成整型,浮点型等,反之亦然. C#提供隐式转换和显式转换 •隐式转换:编译器自动执行转换•显式转换:编译器只在使用显式转换运算符时才执行转换声明隐式转换的语法如下.注:所有用户定义转换必须使用public和static修饰符 复制代码 代码如下: public static implicit operator TargetType(SourceType Identifier){       ... 

  • C#自定义类型强制转换实例分析

    本文实例讲述了C#自定义类型强制转换的用法.分享给大家供大家参考.具体分析如下: 先来举一个小例子 类定义: public class MyCurrency { public uint Dollars; public ushort Cents; public MyCurrency(uint dollars, ushort cents) { this.Dollars = dollars; this.Cents = cents; } public override string ToString()

  • c# 类型转换

    CLR允许将一个对象转换为它的实际类型,或者它的基类型. 在C#中,可将一个对象隐式转换为它的基类型,将对象转换成派生类型需要显示转换.例: object o = new Emplee(); Emplee e = (Emplee)o; 但是如果将一个对象转换成自己的派生类型是,会运行时报错: object o = new object(); Emplee e = (Emplee)o; 所以CLR是类型安全的. c#中is as的操作符用法 在c#语言中,进行类型转换的另一个方式是使用is as操

  • C#将布尔类型转换成字节数组的方法

    本文实例讲述了C#将布尔类型转换成字节数组的方法.分享给大家供大家参考.具体如下: byte[] b = null; b = BitConverter.GetBytes(true); Console.WriteLine(BitConverter.ToString(b)); 希望本文所述对大家的C#程序设计有所帮助.

  • C#引用类型转换的常见方式总结

    本文以实例形式简单讲述了引用类型转换的几种常见方式,如:子类转换成父类,父类转换成子类,以及不是子父级关系类之间的转换.现分述如下,供大家参考: 一.隐式转换:子类转换成父类 public class Animal { public int _age; public Animal(int age) { this._age = age; } } public class Dog : Animal { public float _weight; public Dog(float weight, in

  • 一篇文章搞定JavaScript类型转换(面试常见)

    为啥要说这个东西?一道面试题就给我去说它的动机. 题如下: var bool = new Boolean(false); if (bool) { alert('true'); } else { alert('false'); } 运行结果是true!!! 其实啥类型转换啊,操作符优先级啊,这些东西都是最最基本的.犀牛书上有详细的介绍.但我很少去翻犀牛书的前5章... 比如说优先级那块儿,很多书都教育我们,"不用去背诵优先级顺序,不确定的话,加括号就行了."平常我们写代码时也确实这么做的

  • Go语言创建、初始化数组的常见方式汇总

    本文实例总结了Go语言创建.初始化数组的常见方式.分享给大家供大家参考.具体分析如下: Go语言的语法很灵活,以下展示了创建并初始化数组的多种方式: 复制代码 代码如下: //数组初始化的各种方式  func arraySliceTest0201() {      //创建数组(声明长度)      var array1 = [5]int{1, 2, 3}      fmt.Printf("array1--- type:%T \n", array1)      rangeIntPrin

  • js字符串引用的两种方式(必看)

    如下所示: function setName(obj) { obj.ok = "ccccccc"; } function aa() { var name = new String("hechangmin"); name.ok = "sdf"; //第一种方式 // String.prototype.ok = "aaaaa"; //第二种方式 alert(name.ok); // aaaaa setName(name); ale

  • java及C++中传值传递、引用传递和指针方式的理解

    java的值传递理解: 代码1: public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); System.out.println( buffer); } public static void SChange (StringBuffer str) { st

  • JS中原始值和引用值的储存方式示例详解

    在ECMAscript中,变量可以存放两种类型的值,即原始值和引用值 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number.Stirng.Boolean.Null.Underfined 引用值指的是复合数据类型的值,包括:Object.Function.Array.Date.RegExp 根据数据类型不同,有的变量储存在栈中,有的储存在堆中.具体区别如下: 原始变量及他们的值储存在栈中,当把一个原始变量传递给另一个原始变量时,是把一个栈房间的东西复制到另一个栈房间,且这两个原始

  • jquery实现Ajax请求的几种常见方式总结

    本文实例讲述了jquery实现Ajax请求的几种常见方式.分享给大家供大家参考,具体如下: 用原生的javascript开发ajax有着许多重复的代码,当然你也可以封装成可以复用的js代码,但却不一定那么通用.但jquery  提供的几种AJAX请求的几种方式,从简单到复杂,有更多的选择空间,下面总结几种在项目中常用的jquery ajax请求的方式,由于AJAX 与语言不相关,所以省略后台语言部分,重点放在前端. 1. 用jquery 的 load() 方法实现ajax请求 2. 用jquer

  • Tomcat部署项目的几种常见方式[亲测]

    1 /直接将web项目文件件拷贝到webapps目录中 这是最常用的方式,Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用.如果你想要修改这个默认目录,可以在conf下的server.xml文件里修改Host标签里的appBase值. 这个方法实际上和在IDE开发环境里部署项目是一样的. 用此方法的访问路径为http://localhost:8080/webname 2 /修改Server.xml文件 在conf下的server.xml文件

  • Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结

    本文实例讲述了Vue指令v-for遍历输出JavaScript数组及json对象的常见方式.分享给大家供大家参考,具体如下: 定义数据: <script> new Vue({ el:"#test", data:{ message:"infor", list:["a","b","c","d","e"], web:{ "百度":"

  • JavaScript遍历DOM元素的常见方式示例

    本文实例讲述了JavaScript遍历DOM元素的常见方式.分享给大家供大家参考,具体如下: 对于元素之间的空格,IE9以及之前的版本不会返回文本节点,,其他的浏览器会返回文本节点,所以我们在使用firstChild,lastChild时会导致行为不一致. DOM中为元素新增了下面几个属性: childElementCount:返回子元素(不包括文本节点和注释)的数量: firstElementChild:firstChild的元素版: lastElementChild:lastChild的元素

随机推荐