当前位置: 首页 > news >正文

c#中字段和属性的区别,委托和事件的区别

IDE眼里的字段和属性

class Test
{public int age1 = 12;public int Age2 { get; set; } = 18;public void Show(){Console.WriteLine(age1++);Console.WriteLine(Age2++);} 
}

很多新人发现在类中定义变量时,有些人会在后面写上get,set
这种写法定义出来的变量,在使用的时候看起来和普通的变量没有区别。
所以不理解这样做有什么意义。

首先,我们去掉Age2。只关注age1.
用你的IDE对他点右键,快速重构中会出现两个选项,封装字段并使用字段/并使用属性。
在这里插入图片描述

class Test
{private int age1 = 12;public int Age1 { get => age1; set => age1 = value; }public void Show(){Console.WriteLine(age1++);//如果选择使用属性,那么此句会使用Age1}
}

无论选择哪一种,类中都会出现一个Age1,并且他的内容是相同的。
然后,根据你选择的使用属性 / 仍使用字段,下面对这个变量的调用会替换为age1 / Age1
得出结论,没有get,set的东西是字段,带有get,set的东西叫做属性。

然后,对Age1点右键,快速重构为自动属性.
在这里插入图片描述

class Test
{public int Age1 { get; set; } = 12;public void Show(){Console.WriteLine(Age1++);//如果选择使用属性,那么此句会使用Age1}
}

这说明,{ get; set; }写法的叫自动属性,是一种简略的写法。
他的完整写法应该包含一个字段,并在get,set中添加逻辑内容去控制一个字段。

匿名字段

在使用自动属性时,编译器会自动创建一个你无法访问的字段,这称为匿名字段。
由于无法访问到匿名字段,所以无法为他决定初始值。因此,自动属性改为直接在属性上赋值初始值。
public int Age1 { get; set; } = 12;
但是,对于完整属性,public int Age1 { get => age1; set => age1 = value; }是不能这样写的。

事件

事件和属性类似,同样是一种缩略写法,同样引入了匿名字段。

class Test
{public Action action = () => { };public event Action Action = () => { };public void Show(){action();Action();}
}

事件和委托的使用方式一样,所以看不出来区别。但如果将事件写全,那么事件就不能赋值或调用。

class Test
{public Action action = () => { };public event Action Action { add => action += value; remove => action -= value; } //= () => { };public void Show(){action(); //Action();}
}

继承中的字段和属性

程序里的东西可以分类为储存的值,或可以执行的指令。

在类中,属性和事件是可以设置为虚拟,抽象,重写的。这说明属性和事件更与方法类似。
在接口中,不能存在字段,但是可以存在属性和事件。这说明属性和事件有别于字段。

interface ITest
{public event Action Action;public int Age { get; set; }
}
abstract class BTest : ITest
{public abstract int Age { get; set; }public abstract event Action Action;
}
class DTest : BTest
{public override int Age { get { return default; } set { } }public override event Action Action { add { } remove { } }
}

并且,在这个抽象类中,不能为属性或事件赋值初始值,也不能像使用委托一样调用这个事件。
这再次说明了,属性和事件不储存值。我们平常对他们的调用都是转为调用一个匿名字段的。

反射眼里的字段和属性

声明两个类,其中一个属性和事件写上空的逻辑。

class Test1
{public int Age { get; set; }public event Action Action;
}
class Test2
{public int Age { get => default; set { } }public event Action Action { add { } remove { } }
}

使用反射查看这两个类里面所有的东西。

Type t1=typeof(Test1);
Type t2=typeof(Test2);foreach (var item in t1.GetMembers((BindingFlags)(-1)))
{Console.WriteLine(item.Name);
}
Console.WriteLine("=========");
foreach (var item in t2.GetMembers((BindingFlags)(-1)))
{Console.WriteLine(item.Name);
}
get_Age
set_Age
add_Action
remove_Action
.ctor
Age
Action
<Age>k__BackingField
Action
=========
get_Age
set_Age
add_Action
remove_Action
.ctor
Age
Action

在这里面Age是属性,get_Age和set_Age分别是属性里面的get访问器和set访问器。
同样的,Action,add_Action,remove_Action这三个东西都是事件生成的东西。
然后.ctor是构造器 / 构造方法 / 构造函数。

最后,上面的类型多出来了一个<Age>k__BackingField和一个Action。
这两个东西就是匿名字段。验证代码如下。

Type t1 = typeof(Test1);
FieldInfo field1 = t1.GetField("<Age>k__BackingField", (BindingFlags)(-1));Test1 test = new Test1();
Console.WriteLine(test.Age);field1.SetValue(test, 666);
Console.WriteLine(test.Age);

最后,在类型上。反射出来的属性和事件,可以获取他们的访问器。此方法在名字上,和返回值的类型上,
都认为访问器是一种方法。也就是说属性和事件是包含方法的东西。

Type type = null;//此代码仅展示类型,运行会有异常。
MethodInfo method = type.GetMethod("");//获取方法PropertyInfo property1 = type.GetProperty("");//获取属性
MethodInfo get = property1.GetGetMethod();//获取get访问器,以方法形式
MethodInfo set = property1.GetSetMethod();//获取set访问器,以方法形式EventInfo eventInfo = type.GetEvent("");
MethodInfo add = eventInfo.GetAddMethod();
MethodInfo remove = eventInfo.GetRemoveMethod();

并且在属性实例和事件实例这两个类型里,也确实没有任何能获取包含的值的方法。
所以,属性和事件的本质工作并不包含储存一个值。

相关文章:

c#中字段和属性的区别,委托和事件的区别

IDE眼里的字段和属性 class Test {public int age1 12;public int Age2 { get; set; } 18;public void Show(){Console.WriteLine(age1);Console.WriteLine(Age2);} }很多新人发现在类中定义变量时&#xff0c;有些人会在后面写上get,set。 这种写法定义出来的变量&#xf…...

香橙派使用外设驱动库wiringOP来驱动蜂鸣器

硬件接线 回顾香橙派的物理引脚对应&#xff1a; 所以将VCC接到1&#xff0c;GND接到6&#xff0c;I/O口接到7&#xff1a; 代码编写 香橙派的wiringOP库提供了很多的例程&#xff0c;可以将blink.c拷贝进自己的代码文件夹来修改&#xff1a; 小插曲---将手动对齐的Tab和自动对…...

微信小程序Day3笔记

1、页面导航 1. 什么是页面导航 页面导航指的是页面之间的相互跳转。例如&#xff1a;浏览器中实现页面导航的方式有如下两种&#xff1a; <a>链接location.href 2. 小程序中实现页面导航的两种方式&#xff1a; 声明式导航&#xff1a; 在页面上声明一个<navigat…...

大数据技术之Hadoop:提交MapReduce任务到YARN执行(八)

目录 一、前言 二、示例程序 2.1 提交wordcount示例程序 2.2 提交求圆周率示例程序 三、写在最后 一、前言 我们前面提到了MapReduce&#xff0c;也说了现在几乎没有人再写MapReduce代码了&#xff0c;因为它已经过时了。然而不写代码不意味着它没用&#xff0c;当下很火…...

[论文笔记]BiMPM

引言 这又是一篇文本匹配的论文Bilateral Multi-Perspective Matching for Natural Language Sentences阅读笔记。 论文题目为自然语言文本中双向多视角匹配。 提出了BiMPM(bilateral multi-perspective matching)模型: 基于匹配-聚合(比较-聚合)框架; 采用双向匹配提取交…...

JS判断当前是早上,中午,下午还是晚上

<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><div></div><script>function getTimeState() {// 获取当前时间let timeNow new Date();// 获取当前小时let…...

使用Docker部署Gitlab的记录

docker版本 使用docker -v查看 Docker version 1.13.1, build 7d71120/1.13.1运行容器镜像 映射本机的9980端口为Docker内部的80端口 映射本机的9922端口为Docker内部的22端口 使用root用户启动 映射本机目录/mnt/sda/gitlab/log为Docker内部的/var/log/gitlab 映射本机目录…...

Spark【Spark SQL(二)RDD转换DataFrame、Spark SQL读写数据库 】

从 RDD 转换得到 DataFrame Saprk 提供了两种方法来实现从 RDD 转换得到 DataFrame&#xff1a; 利用反射机制推断 RDD 模式使用编程方式定义 RDD 模式 下面使用到的数据 people.txt &#xff1a; Tom, 21 Mike, 25 Andy, 18 1、利用反射机制推断 RDD 模式 在利用反射机制…...

LabVIEW检测润滑油中的水分和铁颗粒

LabVIEW检测润滑油中的水分和铁颗粒 润滑油广泛应用于现代机械设备&#xff0c;由于工作环境日益恶劣&#xff0c;润滑油经常被水分乳化&#xff0c;加速对机械设备的腐蚀。此外&#xff0c;润滑油还受到机械零件摩擦中产生的Fe颗粒的污染&#xff0c;削弱了其机械润滑效果。润…...

【新版】系统架构设计师 - 软件架构设计<SOA与微服务>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 架构 - 软件架构设计&#xff1c;SOA与微服务&#xff1e; 考点摘要 面向服务SOA&#xff08;★★★★&#xff09;微服务&#xff08;★★★★&#xff09; 基于/面向服务的&#xff08;SOA&#xff09; 在SO…...

React+Typescript+react-router 6 创建路由操作

本文我们来看看路由的安装 其实路由的操作没有什么变化 但是还是给大家讲一下 那么我们打开项目 在项目终端输入 npm install --save react-router react-router-dom安装 一下 react-router 和 react-router-dom 这都是react开发很基本的插件了 不过大家安装前先注意好我的版…...

前端list.push,封装多个对象

js var fruit [apple, banana];fruit.push(pear);console.log(fruit); // [apple, banana, pear]现在为对象 data1:{addUser: 1,editUser: 1,addTime: null,editTime: 1527410579000,userId: 3,systemNo: mc,userName: zengzhuo,userPassword: e10adc3949ba59abbe56e057f20f88…...

指令延迟隐藏

一、指令延迟隐藏 1. 延迟和延迟隐藏 指令延迟指计算指令从调度到指令完成所需的时钟周期如果在每个时钟周期都有就绪的线程束可以被执行&#xff0c;此时GPU处于满符合状态指令延迟被GPU满负荷计算状态所掩盖的现象称为延迟隐藏延迟隐藏对GPU编程开发很重要&#xff0c;GPU设…...

《React vs. Vue vs. Angular:2023年的全面比较》

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

win10自带wifi共享功能

1、按下【wini】组合键打开windows设置&#xff0c;点击【网络和internet】&#xff1b; 2、按照下图&#xff0c;打开个移动热点&#xff0c;设置名称、密码。...

React如何实现国际化?

目录 一、Redux准备工作 commonTypes.js commonActions.js commonReducer.js rootReducer.js 二、然后定义SelectLang组件 index.js index.less 三、创建语言包 welcomeLocale.js index.js 四、使用 react的入口文件 App.js welcome.js 附 关于如何实现国际…...

netrw模拟nerdtree的go命令连续打开多个文件

vim9自带的文件浏览器netrw功能很强大。过去用惯了nerdtree的我&#xff0c;对netrw的文件操作还要适应一些时间。 使用netrw一段时间后发现它没有nerdtree的go命令的替代操作&#xff0c;今天就自制一个。 一、制作go命令&#xff1a; nerdtree的go命令功能&#xff1a;就是…...

算法通关村第十九关——动态规划高频问题(白银)

算法通关村第十九关——动态规划高频问题&#xff08;白银&#xff09; 前言1 最少硬币数2 最长连续递增子序列3 最长递增子序列4 完全平方数5 跳跃游戏6 解码方法7 不同路径 II 前言 摘自&#xff1a;代码随想录 动态规划五部曲&#xff1a; 确定dp数组&#xff08;dp tabl…...

Matlab如何导入Excel数据并进行FFT变换

如果你发现某段信号里面有干扰&#xff0c;想要分析这段信号里面的频率成分&#xff0c;就可以使用matlab导入Excel数据后进行快速傅里叶变换&#xff08;fft&#xff09;。 先直接上使用方法&#xff0c;后面再补充理论知识。 可以通过串口将需要分析的数据发送到串口助手&a…...

华为mate60 上线 媒介盒子多家媒体报道

为什么你的品牌营销不见效&#xff1f;如何能推动品牌破圈&#xff1f;让媒介盒子给你一些启发。本期盒子要跟大家分享地新机上市&#xff0c;数码科技行业企业该如何做线上宣传。 HUAWEI Mate 60系列8月29日官宣发布&#xff0c;出色的拍照功能、强大的性能表现和持久的续航能…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...