简介:
在.NET框架中,C#语言的类(class)属于引用类型。
这意味着当你声明一个类的实例时,实际上是在堆上创建一个对象,并在栈上创建一个引用指向这个对象。
因此,当你将对象作为参数传递给函数时,实际上是传递了这个引用的副本,而不是对象本身。
这就是所谓的"传引用"或"按引用传递"。
让我们深入探讨一下这个问题,以标题和描述中给出的代码为例:```csharpclass Program{ static void Main(string[] args) { TestClass objA = new TestClass(); objA.Name = "I am ObjA"; Console.WriteLine(String.Format("In Main:{0}", objA.Name)); TestFun(objA); Console.WriteLine(String.Format("In Main:{0}", objA.Name)); Console.Read(); } static void TestFun(TestClass obj) { obj.Name = "I am be modified in TestFun"; Console.WriteLine(String.Format("In TestFun:{0}", obj.Name)); } public class TestClass { public string Name { get; set; } }}```在这个例子中,`TestFun`函数接收到`objA`的引用副本`obj`。
当在`TestFun`中修改`obj.Name`时,实际上是修改了`objA`引用的对象,因为它们都指向同一个堆上的实例。
因此,`Main`函数中再次打印`objA.Name`时,值已经被修改为"I am be modified in TestFun"。
然而,如果我们更改`TestFun`的实现:```csharpstatic void TestFun(TestClass obj){ TestClass objB = new TestClass(); obj = objB; obj.Name = "I am ObjB"; Console.WriteLine(String.Format("In TestFun:{0}", obj.Name));}```这里我们创建了一个新的`TestClass`实例`objB`,然后让`obj`引用`objB`。
虽然在`TestFun`内部`obj`的值改变了,但这不会影响`Main`函数中的`objA`,因为`objA`仍然指向原始的`TestClass`实例。
所以,`Main`函数中的`objA.Name`输出仍然是"I am ObjA",因为`objA`并没有被修改指向新创建的`objB`。
这个现象可以用内存模型来解释,就像描述中提到的那样。
在调用`TestFun`时,`objA`的地址被复制到`obj`,但是`objA`本身并未改变。
在`TestFun`中,`obj`被重新分配给`objB`的地址,但`objA`仍然指向原始对象,所以`Main`中的`objA`不会受到影响。
C#中的对象参数传递特性对于理解和调试代码非常重要。
理解这种行为可以帮助我们避免意外地修改了原本不想修改的对象,同时也能有效地利用引用传递来共享和修改数据。
在编写函数时,要清楚地知道参数是值类型(value type,如int、struct)还是引用类型(reference type,如class),因为这将直接影响到参数的处理方式和函数的行为。
2025/6/15 20:02:36 44KB
1
基础..4并发编程模型的分类..4java内存模型的抽象..4重排序....6处理器重排序与内存屏障指令...7happens-before....10.......................
2024/12/21 8:25:17 1.31MB java
1
关于MPI、并行计算的总结对比,目录如下:1.并行计算1.1.相关背景1.2.什么是并行计算1.3.主要目的1.4.并行计算与分布式计算1.5.并行的基本条件1.6.主要的并行系统1.6.1.共享内存模型1.6.2.消息传递模型1.6.3.数据并行模型1.6.4.对比分析2.MPI2.1.什么是MPI2.2.MPI的实现2.3.MPI基本函数2.4.MPI功能特点2.5.技术对比分析2.5.1.共享内存模型(以OpenMP为例)2.5.2.分布式内存模型2.6.小结3.问题解释3.1.并行计算和MPI是什么关系?为了实现并行计算,是否使用MPI技术即可实现?3.2.MPI技术原理是什么,即基础设施提供什么样的支持能力?3.3.为了实现并行计算,应用软件需要什么样的特殊设计3.4.什么样的软件需要并行计算4.部分参考资料
2024/11/16 2:14:47 669KB MPI 并行计算 分布式计算
1
上传文件为百度云链接,文件太大,自行下载。
《C++Primerplus》是2015年人民邮电出版社出版的图书,作者是史蒂芬·普拉达。
该书讲述了C语言基础知识和C++新增的特性。
C++是在C语言基础上开发的一种集面向对象编程、通用编程和传统的过程化编程于一体的编程语言。
本书是根据2003年的ISO/ANSIC++标准编写的,通过大量短小精悍的程序详细而全面地阐述了C++的基本概念和技术。
全书分17章和10个附录,分别介绍了C++程序的运行方式、基本数据类型、复合数据类型、循环和关系表达式、分支语句和逻辑操作符、函数重载和函数模板、内存模型和名称空间、类的设计和使用、多态、虚函数、动态内存分配、继承、代码重用、友元、异常处理技术、string类和标准模板库、输入/输出等内容。
49B C++
1
这本书主要是讲在使用C++11特性时对并发的深入探讨。
它是由作为语言新线程支持基础的BoostThread库的主要开发及维护人员编写的。
总之,作者很有权威性。
该书从最基础的东西开始,假设读者已经有良好(甚至是非常好)的语言基础,但是首次接触并行代码。
该书逐步地探讨了一些由并发带来的问题,讲述了互斥的解决方案和局限性,以及它们是如何在C++11中实现的。
接下来讲述了C++的内存模型和原子类型。
最后,深入探讨了基于锁和无锁数据结构的设计。
这是自从HerbSutter在书中讨论这个话题之后,我所见过的最好的处理方法。
这本书很全面地涵盖了一些真正重要的话题,这些话题在其他书籍中是经常被忽略的,比如像,多线程的代码设计,线程应用程序的调试。
当然,在我看来,这两者都描述得太少了。
书中大部分内容都是作为参考资料(就单独的C++线程库就有差不多130页)。
另一个附录是一个完整的消息框架,并给出了代码和注解。
毫无疑问,作者还是花费了很大的心思,相关的内容都讲到了。
对于这本书,我也有不满意之处,但是它们都微不足道。
第一个就是你必须深入了解C++,否则阅读起来比较困难。
另一个就是作者最后一章讲述的线程池,用红色字体显示的”高级线程”。
在我看来,线程池在并发处设定标记很有意思,但是很可惜,作者却在这儿停笔了。
由此可得知,虽然作者在目录有提及到角色模型,但并没有进行讲解,就好像它压根儿不存在一样,可能在William看来,它其实对好几种语言至关重要,却不包括C++。
总的来说,这些不满意之处只能反应我的偏好,不能说明这本书有缺陷。
William的这本书非常棒,至少在未来的很长一段时间里都能称得上是这个领域的典型著作。
如果你想更仔细地看下这本书的内容,我们最近在一篇很受欢迎的文章里”WaitingforOne-OffEventswithFutures。
”有摘选了一些片段。
2024/7/2 3:36:47 2.13MB C++ 并发
1
ARM体系结构参考手册ARMv7-A和ARMv7-R版本手册介绍符合ARMv7(A&R配置文件)标准的处理器的指令集、内存模型和程序员模型,包括:*Cortex-A系列*Cortex-R系列*QualcommScorpion本手册还介绍用于ARM11处理器的较新的ARMv6体系结构版本,介绍Thumb-2和TrustZone安全扩展。
2024/5/13 1:09:47 12.73MB ARM结构参考手册
1
(先打开一个程序在计算机中到底是如何运行的.html)2.虚拟内存到底是什么?为什么我们在C语言中看到的地址是假的?3.虚拟地址空间以及编译模式4.C语言内存对齐,提高寻址效率5.内存分页机制,完成虚拟地址的映射6.分页机制究竟是如何实现的?7.MMU部件以及对内存权限的控制8.Linux下C语言程序的内存布局(内存模型)9.Windows下C语言程序的内存布局(内存模型)10.用户模式和内核模式11.栈(Stack)是什么?栈溢出又是怎么回事?12.一个函数在栈上到底是怎样的?13.函数调用惯例(CallingConvention)
2024/4/24 22:23:15 4.94MB 内存管理 C语言
1
Java开发
2023/12/3 16:58:34 455KB JMM 内存模型
1
技术面试必备基础知识,包括了网络、多线程、并发、内存模型等等
2023/11/18 22:11:09 16.6MB 面试 互联网
1
RailsDeCal2019秋季实验室和作业3该分配涉及修改并添加到现有的Rails应用中,以帮助您了解路线,控制器,视图和内存模型。
您可以在实验室中的描述和家庭作业
2023/11/1 3:16:39 37KB Ruby
1
共 13 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡