简介:
在.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
PBDOM遍历一个节点下的所有节点name及text的函数例:1>trades_sold_get_response!2>trades!3>trade!4>adjust_fee:0.004>buyer_nick:hwangyanhong4>buyer_obtain_point_fee:04>buyer_rate:false4>cod_fee:0.004>cod_status:NEW_CREATED4>consign_time:2011-04-1821:32:404>created:2011-04-1712:25:234>discount_fee:0.004>modified:2011-04-1821:32:404>num:14>num_iid:100502052764>orders!5>order!6>adjust_fee:0.006>buyer_rate:false6>discount_fee:0.006>num:16>num_iid:100502052766>oid:723705613488006>payment:1.006>pic_path:http://img04.taobaocdn.com/bao/uploaded/i4/T1Ny8OXaXKXXaOBDQT_013227.jpg6>price:1.006>refund_status:NO_REFUND6>seller_rate:false6>seller_type:C6>status:WAIT_BUYER_CONFIRM_GOODS6>title:测试商品,请勿购买6>total_fee:1.004>pay_time:2011-04-1712:27:434>payment:1.004>pic_path:http://img04.taobaocdn.com/bao/uploaded/i4/T1Ny8OXaXKXXaOBDQT_013227.jpg4>point_fee:04>post_fee:0.004>price:1.004>real_point_fee:04>received_payment:0.004>receiver_address:所属地区:手机/小灵通号码:13764963675备注:4>receiver_name:不需收货人4>receiver_zip:0000004>seller_nick:xianzai894>seller_rate:false4>shipping_type:free4>sid:723705613488004>status:WAIT_BUYER_CONFIRM_GOODS4>tid:723705613488004>title:现在店4>total_fee:1.004>type:fixed2>total_results:1
1
第1章课程导学对课程整体进行介绍,并且说明HTTP协议的重要性,以及学习的必要性。
1-1导学1-2内容介绍第2章HTTP协议基础及发展历史本章主要介绍什么是HTTP协议,HTTP协议的发展历史,以及HTTP协议的底层--网络分层协议。
在本章中你将学习到HTTP协议的基础内容,并理解为什么会产生HTTP协议,以及他的优劣势。
2-15层网络模型介绍2-2HTTP协议的发展历史2-3HTTP的三次握手2-4URI-URL和URN2-5HTTP报文格式2-6创建一个最简单的web服务第3章HTTP各种特性总览本章主要讲解HTTP协议中各种头信息的作用,包括但不限于最重要的几个部分:缓存、cookie、CORS跨域、长连接等,课程中会配合实际的例子展示这些HTTP头是如何发挥作用的,并且解决了什么问题。
3-1认识HTTP客户端3-2CORS跨域请求的限制与解决3-3CORS跨域限制以及预请求验证3-4缓存头Cache-Control的含义和使用3-5缓存验证Last-Modified和Etag的使用3-6cookie和session3-7HTTP长连接3-8数据协商3-9Redirect3-10CSP第4章Nginx代理以及面向未来的HTTP本章主要实战Nginx配置各种面向未来的HTTP服务,首先会介绍Nginx的安装和基本配置,其次是配置Nginx的缓存功能来展示给大家看代理缓存相较于客户端缓存的好处。
最后这章中我们还讲解来HTTPS协议以及HTTP2,他们各是什么,有什么优点。
...4-1Nginx安装和基础代理配置4-2Nginx代理配置和代理缓存的用处4-3HTTPS解析4-4使用Nginx部署HTTPS服务4-5HTTP2的优势和Nginx配置HTTP2的简单使用第5章课程总结对课程整体再进行一个回顾5-1课程总结
2024/12/5 10:16:16 54B HTTP 计算机网络 UDP TCP/IP
1
软件程序按照发射端所掌握的各用户信道状态信息的程度共分为两部分:即完整信道状态信息(CSIT)和部分信道状态信息(CSIP)。
其中,每一部分都包括预编码(precoding)和用户调度(scheduling)。
在CSIT中,precoding又按照各用户的数据流数分为单数据流和多数据流两种情况。
在每种情况下,首先考察了不同预编码算法的性能表现,包括两种ZF、MMSE、SINR、SLNR。
之后又考察了功率分配算法的性能表现(文件名中含有PD表明其含有功率分配的过程)。
按照不同指标进行功率分配的,在文件名中进行了区分,如PD_CN代表以信道范数为参考指标进行功率分配。
Scheduling部分首先观察了RoundRobin、MaxH和MMSLNR三种算法的性能对比。
之后在Kc和Round部分分别观察了不同预选用户数和不同最大替换轮数下MMSLNR算法的表现。
在CSIP中,只对各用户单数据流的情况进行了仿真。
采用的预编码算法主要有DSLNR(即直接运用CSIT下的预编码算法)、ESLNR(即对SLNR进行均值计算的,在CSIP中,引入均值计算的与SLNR有关的算法,其文件名中都有modified以示区别)、EMMSE(即陈明老师那边的那篇文章中的预编码算法)。
Scheduling中也只是简单的观察了RoundRobin、MaxH、DMMSLNR和EMMSLNR(前者没有均值计算,后者有)的性能对比。
在各部分程序中,main以及mainX(X代表某一数字)是最终的主程序,且各种参数均在主程序的开头部分进行了说明。
主程序中,都是按照信号生成,信道生成,调度与预编码,信号接收这样的过程进行的。
2024/8/23 10:26:02 351KB 大规模MIMO Massive MIMO
1
Understandprovidesyouwithpertinentinformationregardingyourcode.Quicklyseeallinformationonfunctions,classes,variables,etc.,howtheyareused,called,modified,andinteractedwith.Easilyseecalltrees,metrics,referencesandanyotherinformationyouwouldwanttoknowaboutyourcode.
2024/7/24 2:21:42 82.86MB IDE Understand scitools 最新版本
1
orbslam2文件夹下的ORBSLAM2_with_pointcloud_map-master/ORB_SLAM2_modified/Vocabulary/ORBvoc.txt.tar.gz,github有的人下载不下来
2023/12/28 4:33:44 40.56MB orbsla
1
[2.2.3]E2EE2.0命名【勇者】!E2EE2.2.3将迎来E2EE历史上最稳定最可靠版本。
修复了核心服务器连接定时器回收对象失败,可能导致程序奔溃的问题(感谢小蜗牛的逼迫)。
加入了线程异常终止时的环境恢复机制。
在COM内部或者超时终止等E2EE内部环境导致线程奔溃的环境下,线程能够自动恢复为工作状态。
[网站服务器]修复了静态文件时间检测缓存(304If-Modified-Since)未起效的问题。
修复了静态文件浏览器缓存检测周期无效的问题。
修复了免费版启动时模板数量统计不准确导致启动失败的问题(感谢KKO)。
优化了远程服务功能。
修复了多值模式下接收日期类型错误的问题。
加入了远程服务编辑器程序。
优化了远程服务助手程序。
[网站请求/网站响应]修复了获取SessionID无效的问题(感谢六十五公斤)。
修复了中文名称表单可能无法获取数据的问题。
[模板编辑器]加入了【自动换行】设置。
默认为【启用】状态。
加入了【生成易语言表单接收代码】功能。
可将页面表单直接生成易语言视图函数中的变量定义和取参数相关代码。
优化了编辑器加载速度。
[存取键值表]加入了子列表删除方法。
[2.2.2]加入了关闭数据执行保护函数。
用来关闭当前进程的数据执行保护功能(感谢小蜗牛)。
[网站服务器]优化了无法从反向代理请求头获取真实客户IP时的处理机制。
当获取远程请求地址失败时,则跳过请求头而直接获取客户端的远程地址。
修复了在无网站配置等环境下,关闭服务器重新启动失败错误原因为“stringtoolong”的问题(感谢Grapes)。
[WebSocket客户端]修复了停止可能会不断阻塞的问题(感谢欲)。
2022/10/4 21:44:15 36.83MB 易语言支持库
1
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡