概述

在了解运行运算符的前提我们需要了解什么是RTTI ,在任何一门面向对象的语言中,都有RTTI这个概念(即 运行时)。

RTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类指针或引用来检查这些指针或引用所指的对象的实际派生类型。

RTTI提供了以下两个非常有用的操作符:
(1)typeid(C#中叫TypeOf)操作符,返回指针和引用所指的实际类型。
(2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。
面向对象的编程语言,像C++,Java,delphi,C#都提供了对RTTI的支持。 本文将简略介绍 RTTI 的一些背景知识、描述 RTTI 的概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI;本文还将详细描述两个重要的 RTTI 运算符的使用方法, 下面我们来开始学习吧。
 
注:本文没有介绍赋值运算符、比较运算符、逻辑运算符、三目运行符等一二三元运算,这个在前面java 基础文章有提到,请参考本人Java基础或其他人的博客,没有基础运算符的理解,这个文章很难能看懂?

运行时类型标识

  • 运行时标识有什么用呢?

1.运行时类型标识,能预先测试某个强制类型转换操作,能否成功,从而避免无效的强制类型转换异常。
2. 在c#中有三个支持RTTI的关键字:is 、 as  、typeof。 下面依次介绍他们。
  • IS运算符
 通过is运算符,能够判断对象类型是否为特顶类型,如果两种类型是相同类型,或者两者之间存在引用,装箱拆箱转换,则表明两种类型是兼容的。

  class Program
{
static void Main(string[] args)
{
People p1 = new People(); Person p2 = new Person();
if (p1 is People)
{
Console.WriteLine("p1 是 People 的对象 ~~~");
}
if (p2 is People)
{
//这个打印,因为p2是Person类型的对象,而Person类型派生于People类型
//由于Person对象可以转换为People类型,因此Person对象与People类型是兼容的,但是反过来就不成立
Console.WriteLine("p2 是 People 的对象...");
}
if (p1 is Person)
{
Console.WriteLine("p1 是 Person 的对象***");
}
if (p2 is Person)
{ Console.WriteLine("p2 是 Person 的对象---");
}
if (p1 is object)
{
Console.WriteLine("任何类的父类为object");
}
Console.Read();
}
}
/// <summary>
/// 个人信息
/// </summary>
public class People
{
public string Name { get; set; }
public int Age { get; set; } public string Sex { get; set; }
}
/// <summary>
/// 人的群体信息
/// </summary>
public class Person: People
{
public string Household { get; set; }
}

as运算符:

在运行期间执行类型转换,并且能够使得类型转换失败不抛异常,而返回一个null值。

using System;
using System.Collections.Generic;
using System.Data; namespace testData
{
class Program
{
static void Main(string[] args)
{
People p1 = new People()
{
Age=30,Sex="女",Name="mainaizi"
};
Person p2 = new Person() {
Age=29,Sex="男",Name="大棒槌",Household="北京昌平"
};
Person p = p1 as Person; //as类型先检查强制类型转换的有效性,如果有效,则执行强类型转换过程。这些都在这一句完成。
Console.WriteLine(p);
Console.WriteLine("清输入任意字符按Enter继续...");
string s= Console.ReadLine();
try
{
Person person = (Person)p1; }
catch (Exception exe)
{
Console.WriteLine(exe.Message); } People people = p2;
Console.WriteLine(people);//这里执行的是自动转换 所以不需要强制类型转换,我们大类型转换小类型的转换叫做自动转换
Console.Read(); }
}
public class PersonAnws
{
/// <summary>
/// 自定义隐士转换
/// </summary>
/// <param name="v">被转化类型</param>
public static implicit operator PersonAnws(People v)
{
People p = new People();
return p; }
/// <summary>
/// 自定义显示转换【这里不过多解释】
/// </summary>
/// <param name="v"></param>
public static explicit operator Int32(PersonAnws p)
{
return 0;
}
}
/// <summary>
/// 个人信息
/// </summary>
public class People
{
public string Name { get; set; }
public int Age { get; set; } public string Sex { get; set; } public override string ToString()
{
return "{"+$"name:{this.Name},age:{this.Age},sex{this.Sex}"+"}";
}
}
/// <summary>
/// 人的群体信息
/// </summary>
public class Person: People
{
public string Household { get; set; }
public override string ToString()
{
return "{" + $"name:{base.Name},age:{base.Age},sex{base.Sex},Household:{this.Household}" + "}";
}
}
}

  

typeof运算符:

as ,is 能够测试两种类型的兼容性。但大多数情况下,还需要获得某个类型的具体信息。这就用到了typeof,它可以返回与具体类型相关的System.Type对象,通过System.Type对象可以去顶此类型的特征。一旦获得给定类型的Type对象,就可以通过使用该对象定义的各种属性,字段,方法来获取类型的具体信息。Type类包含了很多成员,我们一起来看下吧。

using System;
using System.Collections.Generic;
using System.Data; namespace testData
{
class Program
{
static void Main(string[] args)
{ Type type= typeof(Person);
Console.WriteLine(type);
Console.WriteLine(type.FullName);//完整名称
Console.WriteLine(type.Name);//类名称
Console.WriteLine(type.BaseType);//基类
Console.WriteLine(type.IsSealed);//是否为密封类
Console.WriteLine(type.IsPublic);//是否是共有的
Console.Read(); }
} /// <summary>
/// 个人信息
/// </summary>
public class People
{
public string Name { get; set; }
public int Age { get; set; } public string Sex { get; set; } public override string ToString()
{
return "{"+$"name:{this.Name},age:{this.Age},sex{this.Sex}"+"}";
}
}
/// <summary>
/// 人的群体信息
/// </summary>
public class Person: People
{
public string Household { get; set; }
public override string ToString()
{
return "{" + $"name:{base.Name},age:{base.Age},sex{base.Sex},Household:{this.Household}" + "}";
}
}
}

说到typeOf我们不得不说下类型的装载

列如

Type er= Type.GetType("System.String");
Console.WriteLine(er.Name);

我们管这种的获取类的类型叫做配件的装载。配件装载只能在本程序集中进行搜索,也就是说,在本程序集的命名空间下进行搜索。

Net is as typeof 运行运算符详解的更多相关文章

  1. Net is as typeof 运行运算符详解 net 自定义泛型那点事

    Net is as typeof 运行运算符详解   概述 在了解运行运算符的前提我们需要了解什么是RTTI ,在任何一门面向对象的语言中,都有RTTI这个概念(即 运行时). RTTI(Run-Ti ...

  2. ASP.NET 运行时详解 揭开请求过程神秘面纱

    对于ASP.NET开发,排在前五的话题离不开请求生命周期.像什么Cache.身份认证.Role管理.Routing映射,微软到底在请求过程中干了哪些隐秘的事,现在是时候揭晓了.抛开乌云见晴天,接下来就 ...

  3. ASP.NET运行时详解 集成模式和经典模式

    遗留问题 在<ASP.NET运行时详解 生命周期入口分析>中遗留两个问题,包括Application的InitInternal方法执行细节.IIS6和II7经典模式请求管道管理类Appli ...

  4. CentOS Linux使用crontab运行定时任务详解

    参考博文: (总结)CentOS Linux使用crontab运行定时任务详解

  5. Nginx与PHP-FPM运行原理详解

    目录 1. 代理与反向代理 1. 正向代理:访问google.com 2. 反向代理:通过反向代理实现负载均衡 2. 初识Nginx与PHP-FPM 1. Nginx是什么 2. CGI与FastCG ...

  6. JavaScript运行机制详解

    JavaScript运行机制详解   var test = function(){ alert("test"); } var test2 = function(){ alert(& ...

  7. JVM运行原理详解

    1.JVM简析:      作为一名Java使用者,掌握JVM的体系结构也是很有必要的.      说起Java,我们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Ja ...

  8. 「JVM」知识点详解一:JVM运行原理详解

    前言 JVM 一直都是面试的必考点,大家都知道,但是要把它搞清楚又好像不是特别容易.JVM 的知识点太散,不系统,今天带大家详细的了解一下jvm的运行原理. 正文 1 什么是JVM? JVM是Java ...

  9. PULL解析XML的运行机制详解

    PULL解析简单易上手,基本上看一遍,基本上就会解析啦,但总是感觉对PULL解析的运行机制不是很了解,就总结了以下事件驱动到底是怎么执行的.. PULL: Android内置了PULL解析器.PULL ...

随机推荐

  1. android 获取 imei号码

    Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)) .getDeviceId(); 1.加入权限 在manifest.xml ...

  2. C#项目 学生选课系统 C#窗口 Winform项目 项目源码及使用说明

    这是一个学生选课信息管理系统,使用VS2010+SQL2008编写,VS2017正常使用. 项目源码下载地址 https://gitee.com/whuanle/xkgl 笔者录了两个视频,打开项目源 ...

  3. UWP Button添加圆角阴影(一)

    原文:UWP Button添加圆角阴影(一) 众所周知,17763之前的UWP控件,大部分是没有圆角属性的:而阴影也只有17763中的ThemeShadow可以直接在xaml中使用,之前的版本只能用D ...

  4. 浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入

    在<浏览器环境下JavaScript脚本加载与执行探析之defer与async特性>中,我们研究了延迟脚本(defer)和异步脚本(async)的执行时机.浏览器支持情况.浏览器bug以及 ...

  5. CentOS 7 - 安装MySQL 5.7

    CentOS 7的默认yum仓库中并没有MySQL5.7,我们需要手动添加,好在MySQL官方提供了仓库的地址,所以我们能够比较简单地安装MySQL. 本文我们将介绍CentOS 7下MySQL5.7 ...

  6. Python FTP文件传输

    FTP Server import socket import struct from concurrent.futures import ThreadPoolExecutor import json ...

  7. [原创]K8一句话密码爆破工具{秒破10万} 支持ASP/PHP/ASPX/JSP/CFM/DIY

    工具: K8_FuckOneShell 20161224编译: VS2012  C# (.NET Framework v4.0)组织: K8搞基大队[K8team]作者: K8拉登哥哥博客: http ...

  8. 同时绑定onpropertychange 和 oninput 事件,实时检测 input、textarea输入改变事件,支持低版本IE,支持复制粘贴

    实时检测 input.textarea输入改变事件,支持低版本IE,支持复制粘贴 检测input.textarea输入改变事件有以下几种: 1.onkeyup/onkeydown 捕获用户键盘输入事件 ...

  9. Redis学习系列一Linux环境搭建

    1.简介 Redis是互联网技术架构中在存储系统中用的最广泛的中间件,是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一.所以Redis是.Net技术开发必须掌握的技能之一.所以通过这个系列的随 ...

  10. Mac 下配置 Python 开发环境

    ➜ ~ sudo brew install python3 ==> Downloading https://www.python.org/ftp/python/3.5.1/Python-3.5. ...