windows C#-对象

类或结构定义的作用类似于蓝图,指定该类型可以进行哪些操作。 从本质上说,对象是按照此蓝图分配和配置的内存块。 程序可以创建同一个类的多个对象。 对象也称为实例,可以存储在命名变量中,也可以存储在数组或集合中。 使用这些变量来调用对象方法及访问对象公共属性的代码称为客户端代码。 在 C# 等面向对象的语言中,典型的程序由动态交互的多个对象组成。

静态类型的行为与此处介绍的不同。

结构实例与类实例

由于类是引用类型,因此类对象的变量引用该对象在托管堆上的地址。 如果将同一类型的第二个变量分配给第一个变量,则两个变量都引用该地址的对象。 本文稍后部分将更详细地讨论这一点。

类的实例是使用 new 运算符创建的。 在下面的示例中,Person 为类型,person1 和 person2 为该类型的实例(即对象)。

using System;public class Person
{public string Name { get; set; }public int Age { get; set; }public Person(string name, int age){Name = name;Age = age;}// Other properties, methods, events...
}class Program
{static void Main(){Person person1 = new Person("Leopold", 6);Console.WriteLine("person1 Name = {0} Age = {1}", person1.Name, person1.Age);// Declare new person, assign person1 to it.Person person2 = person1;// Change the name of person2, and person1 also changes.person2.Name = "Molly";person2.Age = 16;Console.WriteLine("person2 Name = {0} Age = {1}", person2.Name, person2.Age);Console.WriteLine("person1 Name = {0} Age = {1}", person1.Name, person1.Age);}
}
/*Output:person1 Name = Leopold Age = 6person2 Name = Molly Age = 16person1 Name = Molly Age = 16
*/

由于结构是值类型,因此结构对象的变量具有整个对象的副本。 结构的实例也可使用 new 运算符来创建,但这不是必需的,如下面的示例所示:

using System;namespace Example
{public struct Person{public string Name;public int Age;public Person(string name, int age){Name = name;Age = age;}}public class Application{static void Main(){// Create  struct instance and initialize by using "new".// Memory is allocated on thread stack.Person p1 = new Person("Alex", 9);Console.WriteLine("p1 Name = {0} Age = {1}", p1.Name, p1.Age);// Create  new struct object. Note that  struct can be initialized// without using "new".Person p2 = p1;// Assign values to p2 members.p2.Name = "Spencer";p2.Age = 7;Console.WriteLine("p2 Name = {0} Age = {1}", p2.Name, p2.Age);// p1 values remain unchanged because p2 is  copy.Console.WriteLine("p1 Name = {0} Age = {1}", p1.Name, p1.Age);}}/*Output:p1 Name = Alex Age = 9p2 Name = Spencer Age = 7p1 Name = Alex Age = 9*/
}

p1 和 p2 的内存在线程堆栈上进行分配。 该内存随声明它的类型或方法一起回收。 这就是在赋值时复制结构的一个原因。 相比之下,当对类实例对象的所有引用都超出范围时,为该类实例分配的内存将由公共语言运行时自动回收(垃圾回收)。 无法像在 C++ 中那样明确地销毁类对象。 

公共语言运行时中高度优化了托管堆上内存的分配和释放。 在大多数情况下,在堆上分配类实例与在堆栈上分配结构实例在性能成本上没有显著的差别。

对象标识与值相等性

在比较两个对象是否相等时,首先必须明确是想知道两个变量是否表示内存中的同一对象,还是想知道这两个对象的一个或多个字段的值是否相等。 如果要对值进行比较,则必须考虑这两个对象是值类型(结构)的实例,还是引用类型(类、委托、数组)的实例。

  • 若要确定两个类实例是否引用内存中的同一位置(这意味着它们具有相同的标识),可使用静态 Object.Equals 方法。 (System.Object 是所有值类型和引用类型的隐式基类,其中包括用户定义的结构和类。)
  • 若要确定两个结构实例中的实例字段是否具有相同的值,可使用 ValueType.Equals 方法。 由于所有结构都隐式继承自 System.ValueType,因此可以直接在对象上调用该方法,如以下示例所示:
// Person is defined in the previous example.//public struct Person
//{
//    public string Name;
//    public int Age;
//    public Person(string name, int age)
//    {
//        Name = name;
//        Age = age;
//    }
//}Person p1 = new Person("Wallace", 75);
Person p2 = new Person("", 42);
p2.Name = "Wallace";
p2.Age = 75;if (p2.Equals(p1))Console.WriteLine("p2 and p1 have the same values.");// Output: p2 and p1 have the same values.

Equals 的 System.ValueType 实现在某些情况下使用装箱和反射。 记录是使用值语义实现相等性的引用类型。

  • 若要确定两个类实例中字段的值是否相等,可以使用 Equals 方法或 == 运算符。 但是,只有类通过重写或重载提供关于那种类型对象的“相等”含义的自定义时,才能使用它们。 类也可能实现 IEquatable<T> 接口或 IEqualityComparer<T> 接口。 这两个接口都提供可用于测试值相等性的方法。 设计好替代 Equals 的类后,请务必遵循如何为类型定义值相等性和 Object.Equals(Object) 中介绍的准则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM+微信小程序的订餐管理系统(点餐2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的订餐管理系统实现了管理员和用户。管理端实现了 首页、个人中心、用户管理、菜品分类管理、菜品信息管理、订单信息管理、配送信息管理、菜品评价管理、订单投诉管理、…

机器学习周报(RNN的梯度消失和LSTM缓解梯度消失公式推导)

文章目录 摘要Abstract 1 RNN的梯度消失问题2 LSTM缓解梯度消失总结 摘要 在深度学习领域&#xff0c;循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;被广泛应用于处理序列数据&#xff0c;特别是在自然语言处理、时间序列预测等任务中。然而&#xff0c…

Mastercam2025软件安装教程+MC2025中文安装包下载

一、软件下载 【软件名称】&#xff1a;MasterCAM 2025 【支持系统】&#xff1a;win10/win11 【百度网盘】&#xff1a;https://pan.baidu.com/s/12fY66cwRLGcKdeVoJ40ZRw?pwd70zi 二、Mastercam软件 Mastercam是美国 CNC Software 公司开发的一款 CAD/CAM 软件。它集二维…

[vulnhub] DC: 8

https://www.vulnhub.com/entry/dc-8,367/ 描述&#xff1a;在 Linux 上安装和配置双因素身份验证是否可以防止 Linux 服务器被利用 端口扫描主机发现 探测存活主机&#xff0c;179是靶机 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.or…

自扶正救生艇,保障水上救援的安全卫士_鼎跃安全

在应急事件中&#xff0c;自扶正救生艇能够发挥关键的救援和保障作用&#xff0c;确保救援人员和被困人员的生命安全&#xff0c;尤其在极端天气或突发水上事故中展现出明显优势。 在救援过程中如果遭遇翻船&#xff0c;救生艇能够迅速恢复正常姿态&#xff0c;确保救援人员不会…

提升网站安全性 HTTPS的重要性与应用指南

内容概要 在如今数字化快速发展的时代&#xff0c;网站安全显得尤为重要。许多用户在访问网站时&#xff0c;尤其是涉及个人信息或金融交易时&#xff0c;对数据传输的安全性有着高度的关注。HTTPS&#xff08;超文本传输安全协议&#xff09;正是为了满足这种需求而诞生的。通…

QT——自定义控件绘图

一.QPaintEvent绘图事件 QPaintEvent是QT中一个重要的类&#xff0c;专门用于绘图事件。当QT视图组件需要重绘制自己的一部分时&#xff0c;就会产生该事件&#xff0c;通常发生在以下几种情况。 窗口第一次显示时&#xff1a;当窗口或控件第一次出现在屏幕中&#xff0c;系统…

【Python · Pytorch】人工神经网络 ANN(上)

【Python Pytorch】人工神经网络 ANN&#xff08;上&#xff09; 0. 生物神经网络1. 人工神经网络定义2. 人工神经网络结构2.1 感知机2.2 多层感知机2.3 全连接神经网络2.4 深度神经网络 2. 训练流程※ 数据预处理 (Data Preprocessing) 3. 常见激活函数3.1 Sigmoid / Logisti…

【Redis_Day2】在Linux中安装Redis5

本篇涉及Linux中的三条指令&#xff1a;su&#xff1b;apt&#xff1b;vim&#xff0c;可以了解后再来浏览本篇。或在评论留言。 【Redis_Day2】在Linux中安装Redis5 安装修改配置文件使用redis-cli连接服务器 安装 Linux版本选择Ubuntu22.04 Redis版本选择Redis5 登录Ubunt…

第1篇 引言

一、AIGC概念 1、AIGC定义 AIGC&#xff0c;即生成式人工智能&#xff08;Artificial Intelligence Generated Content&#xff09;&#xff0c;是指利用人工智能技术自动生成或辅助创作内容的过程和结果。 简单来说&#xff1a;过去&#xff0c;写文章、画张图、唱首歌、弄个…

深度学习---------------------------------Transformer

目录 Transformer架构多头注意力有掩码的多头注意力基于位置的前馈网络层归一化信息传递预测总结代码多头注意力使用多个头并行计算选择缩放点积注意力作为每一个注意力头测试该部分总代码Transformer基于位置的前馈网络改变张量的最里层维度的尺寸对比不同维度的层归一化和批量…

世界时区划分

1. AoE &#xff08;Anywhere on Earth&#xff09;代表地球上最后一个时区的时间&#xff0c;是全球范围内最晚的时间&#xff0c;通常用于截止日期。 2. UTC/GMT &#xff08;协调世界时/格林威治时间&#xff09;是全球的标准时间&#xff0c;所有时区都是基于UTC计算的。…

qt QImage详解

1、概述 QImage是Qt框架中用于处理图像数据的一个核心类。与QPixmap不同&#xff0c;QImage是在内存中直接存储图像像素数据的&#xff0c;这使得它适用于需要直接访问和修改像素的应用场景&#xff0c;比如图像处理算法、图像绘制以及图像分析等。QImage支持多种图像格式&…

DAY75WEB 攻防-验证码安全篇接口滥用识别插件复用绕过宏命令填入滑块类

知识点&#xff1a; 1、验证码简单机制-验证码过于简单可爆破 2、验证码重复使用-验证码验证机制可绕过 3、验证码智能识别-验证码图形码被可识别 4、验证码接口调用-验证码触发接口可枚举 图片验证码-识别插件-登录爆破&接口枚举 验证码识别绕过等技术适用于&#x…

字符串左旋 (干货无废话)

题目内容&#xff1a;实现一个函数&#xff0c;可以左旋字符串中的k个字符 例如&#xff1a;ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 画图解释&#xff1a; 上图分别是向左挪1次&#xff0c;2次&#xff0c;3次&#xff0c;4次&#xff0c;5次后的结果…

QML基础语法2

函数 函数格式&#xff1a; function关键字 函数名(参数名1:参数类型,参数名2:参数类型,...):返回值类型{} 其中&#xff1a; 函数名必须以小写字符开头&#xff0c;后面驼峰可以有多个参数或者没有参数参数类型可以不写返回值类型也可以不写 如何调用&#xff1a;通过id点…

Mac 配置SourceTree集成云效

1、背景 工作使用的是自己的笔记本&#xff0c;一个是比较卡&#xff0c;在一个是敏感信息比较多还是使用公司的电脑&#xff0c;但是系统是Mac就很麻烦&#xff0c;在网上找了帖子记录一下 2、配置 打开终端 ssh-keygen -t rsa #一直回车就行 cd .ssh cat id_rsa.pub #查…

Kubernetes中常见的volumes数据卷

华子目录 volumesk8s支持的卷的类型emptyDir卷功能emptyDir的使用场景示例 hostPath卷功能用法安全隐患示例 nfs卷功能应用示例&#xff1a;部署一台nfs服务器并在所有k8s节点中安装nfs-utils volumes 容器中文件在磁盘上是临时存放的&#xff0c;这给容器中运行的特殊应用程序…

PaddleNLP的FAQ问答机器人

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【DDRNet模型创新实现人像分割】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实…

Windows的MySQL开机自动启动问题

标题 问题描述 问题描述 在Windows系统中&#xff0c;我设置好了MySQL服务为自动启动&#xff0c;但在开机后发现MySQL服务任没有自动运行。我有点苦恼&#xff0c;每次连接MySQL&#xff0c;都要进入计算机管理&#xff0c;手动打开。 解决方法&#xff1a; 1.前提安装好MySQ…