Net is as typeof 运行运算符详解
概述
在了解运行运算符的前提我们需要了解什么是RTTI ,在任何一门面向对象的语言中,都有RTTI这个概念(即 运行时)。
RTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
运行时类型标识
运行时标识有什么用呢?
- 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 运行运算符详解的更多相关文章
- Net is as typeof 运行运算符详解 net 自定义泛型那点事
Net is as typeof 运行运算符详解 概述 在了解运行运算符的前提我们需要了解什么是RTTI ,在任何一门面向对象的语言中,都有RTTI这个概念(即 运行时). RTTI(Run-Ti ...
- ASP.NET 运行时详解 揭开请求过程神秘面纱
对于ASP.NET开发,排在前五的话题离不开请求生命周期.像什么Cache.身份认证.Role管理.Routing映射,微软到底在请求过程中干了哪些隐秘的事,现在是时候揭晓了.抛开乌云见晴天,接下来就 ...
- ASP.NET运行时详解 集成模式和经典模式
遗留问题 在<ASP.NET运行时详解 生命周期入口分析>中遗留两个问题,包括Application的InitInternal方法执行细节.IIS6和II7经典模式请求管道管理类Appli ...
- CentOS Linux使用crontab运行定时任务详解
参考博文: (总结)CentOS Linux使用crontab运行定时任务详解
- Nginx与PHP-FPM运行原理详解
目录 1. 代理与反向代理 1. 正向代理:访问google.com 2. 反向代理:通过反向代理实现负载均衡 2. 初识Nginx与PHP-FPM 1. Nginx是什么 2. CGI与FastCG ...
- JavaScript运行机制详解
JavaScript运行机制详解 var test = function(){ alert("test"); } var test2 = function(){ alert(& ...
- JVM运行原理详解
1.JVM简析: 作为一名Java使用者,掌握JVM的体系结构也是很有必要的. 说起Java,我们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Ja ...
- 「JVM」知识点详解一:JVM运行原理详解
前言 JVM 一直都是面试的必考点,大家都知道,但是要把它搞清楚又好像不是特别容易.JVM 的知识点太散,不系统,今天带大家详细的了解一下jvm的运行原理. 正文 1 什么是JVM? JVM是Java ...
- PULL解析XML的运行机制详解
PULL解析简单易上手,基本上看一遍,基本上就会解析啦,但总是感觉对PULL解析的运行机制不是很了解,就总结了以下事件驱动到底是怎么执行的.. PULL: Android内置了PULL解析器.PULL ...
随机推荐
- hog行人检测
本文主要介绍下opencv中怎样使用hog算法,因为在opencv中已经集成了hog这个类.其实使用起来是很简单的,从后面的代码就可以看出来.本文参考的资料为opencv自带的sample. 关于op ...
- ip网段变更
背景 公司网络跟集团靠拢,先走第一步:IP网段变更.从XX网段切换到OO网段 方法 1. 准备工作 a. 保证IPMI连接正常 b. 获得新IP并核对对应主机名.旧IP是否相符 2. 确认网卡名称 # ...
- 《AngularJs实战》学习笔记(慕课网)
1. Controller使用过程中的注意点 不要试图去复用Controller, 一个控制器一般只负责一小块视图 不要在Controller中操作DOM, 这不是控制器的职责. 封装在指令里. 不要 ...
- linux的cd命令
面试时被问到了一个命令是什么意思 cd - 还真是一脸懵逼.... 回来试了下 发现真的是一个神奇的命令~ 会跳到之前目录下并输出, 比如
- Python地理位置信息库geopy的使用(一):基本使用
geopy是Python关于地理位置的一个第三方库,用这个库来进行地址位置信息的查询和转换非常方便,本文介绍关于geopy的常用的几种用法 geopy的安装 pip install geopy 根据地 ...
- 【CF995F】 Cowmpany Cowmpensation
CF995F Cowmpany Cowmpensation Solution 这道题目可以看出我的代码能力是有多渣(代码能力严重退化) 我们先考虑dp,很容易写出方程: 设\(f_{i,j}\)表示以 ...
- Shell命令之文本操作
前言 在Linux中,文本处理操作是最常见的,应用非常广泛,如果能熟练掌握,可以大大提高开发效率. awk/sed/grep是文本操作领域的“三剑客”,学会了这3个命令就可以应对绝大多数文本处理场景. ...
- 基于Django+celery二次开发动态配置定时任务 ( 一 )
需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还 ...
- sql开启远程访问
我们用的是SQL Server 数据库 2008 版本,数据库配置完之后从另一台电脑访问数据库死活连接不上,提示信息如下 “ 无法连接到 *.*.*.*. 在于SQL Server建立连接时出现与网络 ...
- POJ 2845
#include <iostream> #include <string> #include <algorithm> #define MAXN 350 using ...