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…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
