关于var1=var2=something赋值语句的思考

2023-11-21 07:32

本文主要是介绍关于var1=var2=something赋值语句的思考,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

刚才在阅读《c#本质论》一书时,开头有提到var1=var2=something的赋值体,之前也曾用过(但是个人不建议这么使用),但是没有认真思考这种赋值方式的本质问题,即:var1是对var2的引用还是对something的引用。后面我编写了一些PoC代码对此进行验证。

代码片段1:

            #region TestStringstring str1, str2;//str1 = str2 = "This is a test string...";str2 = "This is a test string...";str1 = str2;Console.WriteLine("Str1: " + str1);Console.WriteLine("Str2: " + str2);str2 = "This is another test string...";Console.WriteLine();Console.WriteLine("Str1: " + str1);Console.WriteLine("Str2: " + str2);#endregion

 输出的结果是:

Str1: This is a test string...
Str2: This is a test string...

Str1: This is a test string...
Str2: This is another test string...

还是

Str1: This is a test string...
Str2: This is a test string...
Str1: This is another test string...
Str2: This is another test string...

呢?

测试答案是前者。

 

再看看片段2:

class Program{static void Main(string[] args){#region TestObjectObjectToTest ott1, ott2;//ott1 = ott2 = new ObjectToTest(100);ott2 = new ObjectToTest(100);ott1 = ott2;Console.WriteLine("OTT1: " + ott1.Num);Console.WriteLine("OTT2: " + ott2.Num);ott2 = new ObjectToTest(150);Console.WriteLine("OTT1: " + ott1.Num);Console.WriteLine("OTT2: " + ott2.Num); #endregionConsole.Read();}}class ObjectToTest{int num;public int Num{get { return num; }set { num = value; }}public ObjectToTest(int num){Num = num;}}

 

输出结果又是如何呢?这里的ott1和ott2都是对象,也就是涉及到引用传递的问题了。我们记new ObjectToTest(100)为obj1, new ObjectToTest(150)为obj2.则在语句ott1=ott2执行后,ott1是对ott2的引用,还是对obj1的引用呢?在后面当ott2=new ObjectToTest(150)执行后,ott1是对obj1的引用还是对obj2的引用呢?

 

执行代码,观看结果为:

OTT1: 100
OTT2: 100
OTT1: 100
OTT2: 150

可知,这里的ott1只是对obj1的引用,而非obj2的引用。

这篇关于关于var1=var2=something赋值语句的思考的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/400814

相关文章

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

MySQL 中的 LIMIT 语句及基本用法

《MySQL中的LIMIT语句及基本用法》LIMIT语句用于限制查询返回的行数,常用于分页查询或取部分数据,提高查询效率,:本文主要介绍MySQL中的LIMIT语句,需要的朋友可以参考下... 目录mysql 中的 LIMIT 语句1. LIMIT 语法2. LIMIT 基本用法(1) 获取前 N 行数据(

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd