NET框架程序设计-第4章类型基础
4.1 所有类型的基类型:System.Object
CLR 要求每个类型最终都要继承自 System.Object 类型。
两种类型定义:
1)隐式继承
//隐式继承 Object
class Employee{}
2)显式继承
class Employee:System.Object{}
System.Object 主要的公有实例方法:
公有方法 | 描述 |
---|---|
Equals | 如果两个对象具有相同的值,方法将返回 true。 |
GetHashCode | 方法返回对象的值的散列码。 |
ToString | 默认情况下,方法返回类型全名(this.GetType().FullName.ToString())。但是,还有一种常见的做法是重写该方法使其返回一个表示对象状态的字符串。例如,.NET 框架中的一些核心类型(如 Boolean 和 Int32)就重写该方法,使其返回表示它们的值的一个字符串。另一种常见的做法是重写该方法以用于调式目的:我们可以通过调用它来得到一个表示对象字段值的字符串。注意 ToString 通常会利用与调用线程相关联的 CultureInfo。 |
GetType | 方法返回一个类型为继承自 Type 的对象实例,其标识了该方法所属对象的类型。返回的 Type 对象可以和反射类一起使用来获得类型的元数据信息。 |
System.Object 主要的受保护方法:
受保护方法 | 描述 |
---|---|
MemberwiseClone | 这是一个非虚方法,它创建一个新的类型实例,并将其字段设置为和 this 对象的字段相同,最后返回新创建的实例引用。 |
Finalize | 这是一个虚方法,当垃圾收集器判定某个对象为可回收的垃圾时,垃圾收集器会在对象内存被回收之前调用此方法。那些内存回收时需要资源清理的类型应该重写该方法。 |
创建一个对象:
Employee e = new Employee("ConstructorParaml");
new 操作符所执行的工作:
-
1、从托管堆(managed heap)中分配指定类型所需数量的字节来作为存储其对象的内存空间。
-
2、初始化对象的附加成员(overhead members)。每一个对象实例都有两个附加成员。其中第一个成员为指向类型方法表的指针,第二个成员为 SyncBlockIndex。(CLR 使用该字段来进行线程同步控制。该字段的某些位还用作垃圾收集时的标记。另外 FCL 中 System.Object 类型默认的 GetHashCode 方法也用到了该字段)。CLR 使用这两个成员来管理对象实例。
-
3、传入 new 操作符中指定的参数,调用类型的实例构造器。虽然大多数语言在编译构造器时都会要求它们调用基类型中相应的构造器。但 CLR 本身没有这样的要求。
4.2 类型转换
隐式转换:可以将对象转换为其任何一个基类型,因为转换为基类型被认为是安全的隐式操作。
显示转换:将对象转换为它的任何派生类型时,C# 要求进行显示转型。
class Employee{}class App{public static void Main(){//这里不需要转型Object o = new Employee();//这里需要转型Employee e = (Employee)o;}}
显示转换的安全性:
class Employee{}class Manager : Employee{}class App1{public static void Main(){Manager m = new Manager();PromoteEmployee(m);DateTime newYears = new DateTime(2001, 1, 1);//CLR 将禁止执行转型操作,并抛出一个 System.InvalidCastException 异常。PromoteEmployee(newYears);}public static void PromoteEmployee(object o){//1、编译并不知道对象 o 引用的实际类型。//2、所以编译器允许代码通过编译。//3、在运行时(进行转型操作时),CLR 获取到o引用的类型//4、检查对象 o 是否为 Employee。Employee e = (Employee) o; }}
4.2.1 使用 is 和 as 操作符转型
is: 检查对象的类型,如果类型兼容,则返回 true,否则,返回 false;
if(o is Employee){//此处再进行一次检查对象的类型;Employee e = (Employee)o;}
as: 执行转换,若类型兼容,则返回要转换对象的类型,否则,返回 NULL;
Employee e1 = o as Employee;if(e1 != null){}
若转换的类型为 null ,抛出异常:
Object o = new object();Employee e = o as Employee;e.ToString();//若e为空,访问 e 将导致抛出异常 NullReferenceException
s 和 as 的用法情况:
- is 适合用在只检查对象的类型,若吗,若满足 if 条件,则在 if 语句内最好不出现对象类型的转换行为,否则会出现二次检查对象类型的行为。
- as 适用于既要检查对象类型,又要引用对象转换的类型;
4.3 命名空间与程序集
例子:
class Test{public void fun(){System.IO.FileStream fs = new System.IO.FileStream("test.txt", System.IO.FileMode.Open);System.Collections.Queue q = new System.Collections.Queue();}}
优化:
using System.IO;
using System.Collections;class Test{public void fun(){FileStream fs = new FileStream("test.txt", System.IO.FileMode.Open);Queue q = new Queue();}}
二义性
例子:微软和 Wintellect 公司的组件都有一个名为 Widget 的类型。
using Microsoft;
using Wintellect;
class Test{public void fun(){Widget w = new Widget();//具有二义性Wintellect.Widget w2 = new Wintellect.Widget(); //消除二义性}}
进一步消除二义性的优化:
using Microsoft;
using Wintellect;
//定义命名空间的别名using WintellectWidget = Wintellect.Widget;
class Test{public void fun(){WintellectWidget w = new WintellectWidget();}}
相关文章:

NET框架程序设计-第4章类型基础
4.1 所有类型的基类型:System.Object CLR 要求每个类型最终都要继承自 System.Object 类型。 两种类型定义: 1)隐式继承 //隐式继承 Object class Employee{}2)显式继承 class Employee:System.Object{}System.Object 主要的公…...

Java设计模式-备忘录模式
简介 在软件开发中,设计模式是为了解决常见问题而提出的一种经过验证的解决方案。备忘录模式(Memento Pattern)是一种行为型设计模式,它允许我们在不破坏封装性的前提下,捕获和恢复对象的内部状态。 备忘录模式是一种…...

Zookeeper集群 + Kafka集群
Zookeeper 概述 Zookeeper 定义 Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。 Zookeeper 工作机制 Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数…...

“邮件营销新趋势,这个平台让你收获颇丰!
随着各媒体平台的迅速发展,2023年大家更专注于视频营销、网红营销、直播营销等营销方式。可以见得,数字媒介手段的发展,对于营销方式也产生了巨大的影响。但是,企业在拥抱新兴的营销方式的同时,也不要忽视传统的营销方…...

Python列表推导
列表推导式 列表推导式创建列表的方式更简洁。常见的用法为,对序列或可迭代对象中的每个元素应用某种操作,用生成的结果创建新的列表;或用满足特定条件的元素创建子序列。 例如,创建平方值的列表: squares [] for …...

git使用查看分支、创建分支、合并分支
一、查看分支 查看的git命令如下: git branch 列出本地已经存在的分支,并且当前分支会用*标记 git branch -r 查看远程版本库的分支列表 git branch -a 查看所有分支列表(包括本地和远程,remotes/开头的表示远程分支)…...

vue3.0与vue2.0
一、生命周期的变化 1.vue2.响应式架构 2.vue3.0 响应式架构图 Vue3.0响应式框架在设计上,将视图渲染和数据响应式完全分离开来。将响应式核心方法effect从原有的Watcher中抽离。这样,当我们只需要监听数据响应某种逻辑回调(例如监听某个text属性的变化…...

HTML 中的常用标签用法
HTML是构建Web页面的基础语言,其中包含许多不同类型的标签。这些标签由尖括号包围,以指示浏览器如何呈现文本。下面是HTML中的一些常用标签以及它们的使用方法: 标题标签(h1-h6) 标题标签用于标识页面内容的标题&…...

【C++】指针 - 定义和使用,所占内存空间,空指针,野指针,const 修饰指针,指针和数组,指针和函数
文章目录 1. 定义和使用2. 所占内存空间3. 空指针4. 野指针5. const 修饰指针6. 指针和数组7. 指针和函数 1. 定义和使用 数据类型 * 变量名; 指针的作用是,可以通过指针间接访问内存。 内存编号是从 0 开始记录的,一般用十六进制数字表示。可以利用指…...

新规之下产业园区如何合理收费水电费用
一、政策背景 2018年3月30日,国家发改委发布《国家发展改革委关于降低一般工商业电价有关事项的通知》。明确提出进一步规范和降低电网环节收费,一是提高两部制电价的灵活性;二是全面清理规范电网企业在输配电价之外的收费项目,重…...

1011. 在 D 天内送达包裹的能力
传送带上的包裹必须在 days 天内从一个港口运送到另一个港口。 传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量(weights)的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。 返回能在 days 天内将…...

基于SpringBoot养老院管理系统
目录 一、项目介绍 二. 运行环境 三、项目技术 四、部署项目 五、项目运行 六、项目展示 五、项目下载 一、项目介绍 基于springboot的养老院管理系统拥有多种角色账号:管理员和用户 管理员:管理员管理、用户管理、健康管理、病例方案管理、药品…...

1.3 eBPF的工作原理初探
写在前面 上一节提到过,eBPF程序是面向BPF体系结构指令集编写的,它并不直接运行在Linux内核中,我们可以理解为它是运行在eBPF虚拟机,由eBPF虚拟机来执行eBPF字节码,就像java运行在jvm一样。 我们用一张原理图来看下eBPF程序的编译,加载,验证,钩子,映射等结点。 如上是…...

【CH32】| 02——常用外设 | GPIO
系列文章目录 【CH32】| 00——开发环境搭建 【CH32】| 01——新建工程 | 下载 | 运行 |调试 【CH32】| 02——常用外设 | GPIO 失败了也挺可爱,成功了就超帅。 文章目录 前言1. GPIO简介2. IO口的内部结构框图保护二极管上下拉电阻施密特触发器两个MOS管输出寄存器…...

第四章 测试用例编
本科程目标 1.什么是测试用例 2.测试用例的重要性 3.测试用例的八大要素(重点) 4.测试用例的评审 一、什么叫软件测试用例 测试用例(TestCase)是为项目需求而编制的一组测试输入、执行条件以及预期结果,以便测试…...

解决dpdk reserve的内存返回的虚拟地址和iova地址一样的问题
1. 背景: 在ubuntu20.04上用dpdk API: rte_memzone_reserve_aligned("L1L2_PCIE_MEMORY", 1.5*1024*1024*1024, rte_socket_id(), RTE_MEMZONE_1GB|RTE_MEMZONE_IOVA_CONTIG, RTE_CACHE_LINE_SIZE); 分配1.5…...

JQuery实现小项目
博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶 目录 文章目录 一、JQuery是什么 二、JQuery项目 2.1 猜数字 2.2 表白墙 2.3 聚合搜索 2.4 计算器 一、JQuery是什么 jQuery是一个快速、简洁的JavaScript框架,是继Prototype之…...

【C++/嵌入式笔试面试八股】一、23.结构体指针 | 指针和引用 | 万能指针 | 野指针
结构体指针 28.将结构体作为参数向函数中传递 传递方式有两种: 值传递地址传递,利用操作符 -> 可以通过结构体指针访问结构体属性//学生结构体定义 struct student {//成员列表string name; //姓名int age; //年龄int score; //分数 };//值传递...

【C++初阶】类和对象(下)构造函数(初始化列表) + explicit关键字 +static成员
👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞…...

chatgpt赋能python:Python代码怎么用?一个10年编程经验工程师的实践总结
Python代码怎么用?一个10年编程经验工程师的实践总结 如果你正在学习Python或已经是一名Python开发者,你需要知道如何正确地使用Python代码以实现项目需求。在本文中,我将分享我的10年Python编程经验,并介绍一些关于如何使用Pyth…...

【Android定制】修改BUILD_AGO_GMS = no 和 BUILD_GMS=no属性
文章目录 概要名词解释细节小结 概要 在安卓底层源码中,有这样的两个属性,这两个第一眼看上去都像是带不带谷歌,BUILD_AGO_GMS no和BUILD_GMSno有什么区别?? 如果带了谷歌,那么这个设备就差不多是国外定…...

第十章:C语言的调试
很多小伙伴刚开始听到C语言的调试,这是个啥,表示很怀疑,敲代码不就是直接就是干嘛,结果很多小白们,一运行错误多的数都数不过来。就开始这改改,那删删,莫名奇妙就运行成功了。到最后都不知道到底…...

【20】SCI易中期刊推荐——计算机信息系统工程电子与电气(中科院3区)
💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…...

初识网络之UDP网络套接字
目录 一、UDP中的socket编程常用接口 1. socket的含义 2. sockaddr结构 3. socket编程中UDP协议常用接口介绍 3.1 创建socket文件描述符(TCP/UDP、客户端 服务器) 3.2 绑定端口号(TCP/UDP,服务器) 3.3 接收数据…...

数据中心末端配电的数字化方案及设备选型
普通PDU和智能PDU有什么区别? 机架安装配电盘或机架配电单元 (PDU) 是一种配备许多插座的设备,可将电力分配给位于数据中心机架或机柜内的服务器、存储设备和网络设备。领先的分析公司 IHS 将它们分为两大类: 1) 基本 PDU 提供可靠的配电。 2…...

k8s入门实战-Service
k8s入门实战-Service Service 和 Label Service 通过一组 Pod 路由通信。Service 是一种抽象,它允许 Pod 死亡并在 Kubernetes 中复制,而不会影响应用程序。在依赖的 Pod (如应用程序中的前端和后端组件)之间进行发现和路由是由Kubernetes Service 处理…...

Python量化交易:策略创建运行流程
学习目标 目标 知道策略的创建和运行知道策略的相关设置知道RQ的策略运行流程应用 无 1、体验创建策略、运行策略流程 1.1 创建策略 1.2 策略界面 2、 策略界面功能、运行介绍 2.1 一个完整的策略需要做的事情 选择策略的运行信息: 选择运行区间和初始资金选择回…...

企业该如何自主构建信息化管理系统?
实践证明,企业自己搭建的信息化系统灵活性更高,更能契合企业的需求。 我们可以借助零代码平台自主搭建,既提供了各个应用系统的标准化功能,又支持自定义搭建,可根据企业自身需求修改。 全球领先的信息技术研究和顾问公…...

linuxOPS基础_操作系统概述
计算机发展史 第一台计算机是1946 年2 月14 日诞生日,第一台名称ENIAC。体积一间屋子的大小,重量高达28t。 第一代:1946 – 1958 > 12 年 (电子管) 第二代:1958 – 1964 > 6 年 (晶体管…...

常用adb命令记录下
adb root 获取root 权限(以root权限运行ADB守护程序)adb remount 以读写方式重新挂载设备的文件系统adb reboot 重启设备adb devices 查看当前连接设备adb get-serialno 获取设备的序列号adb backup 备份设备的应用程序和数据adb bugreport 收集设备的当前状态信息以进行故障排…...