【.NET版月经问题】之二【引用类型参数就是按引用传递吗?】

本文详细解析了C#中参数传递的方式,强调了即使对于引用类型,默认也是按值传递,并通过具体示例对比了按值传递与按引用传递的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题其实算不得月经帖问题,已经成周经甚至日经了...隔几天就有人问,然后总是大部分人站在自以为正确的角度大谈引用与指针的相似性,假如不幸这参数是string类型无一例外会被人扯到string的“不可变性”上去,而且每次都有扛着红星星的高人大撒烟雾弹,让提问者一头雾水...

 

这问题产生的来源是可恶的C/C++指针...很多人指点新手(包括很多培训机构的讲师)讲到“引用”这一.NET的特殊数据类型时,都直接一句:相当于(甚至说“就是”)C/C++的指针——其实我也说过,惭愧...不幸的是两者看似相似,本质却不同...事实上这个引用和Java的引用才是非常相似的东西,几乎一样...

 

这就带来一个问题...凡是学过C/C++指针的,总有很多人想当然地认为传递一个引用类型的参数就是传递这个引用类型实例的引用——我还没说指针呢——看起来似乎是这样...大错特错!

 

在.NET中,除非显式以ref或out声明传递参数,否则所有类型的参数都是按值传递的!引用类型也不会例外!

 

这句话我不知道回答过多少遍,不过看起来没什么效果...每次一出此类问题,照旧大堆人往按引用传递和string不可变上引...

 

那么先来看看实例吧...值类型一般不会有疑义,就不提了...

这段代码就是广泛会被误认为按引用传递实际上是按值传递的参数传递方式...它的执行结果非常明显,参数引用类型test的实例instance的成员s和i一定会被更改,所以看起来它似乎确实是按引用传递的...但是,错的!这个参数传递的是该参数实例的一个副本!

 

引用类型实例的副本是什么呢?就是这个instance的引用的副本...也就是说,这个时候在栈上,原来的instance的引用还在,传递给callByValue方法的参数t是栈上instance的引用的copy...这个copy引用指向托管堆上instance值的地址,所以一改俱改...所以表象似乎一样,但和C/C++传递指针的方式本质是差别巨大的...

 

我们把callByValue方法稍作修改,如下...

结果很显然,不会变...instance和instance的成员都不会变,原因呢?最常见的解释是作用域不同,tmp只在callByValue方法体中存活,所以呢,出了这个方法体就不起作用了...胡说八道!出了方法体tmp废弃了,那instance应该是null才对啊?!什么思维逻辑...其实很简单,上面说了,这个传递进来的引用只是个副本,修改这个副本不会对在栈上的instance引用有丝毫影响,新构造的实例也跟托管堆上instance的值毫不相干...当退出方法体时,这个副本随即被当作垃圾废弃,instance和它的成员自然不会变...

 

看看另一个方法...

这就改变了...tmp被废弃了,但是instance却改变了...因为这时传递进去的是instance的引用本身,自然在t=tmp;时instance的引用被修改指向tmp在托管堆上的值...

 

最后来看看“特殊”的string...在被当做参数传递时,string一点也不特殊...

callByValue方法一定不会更改instance的值,而callByReference方法一定会更改instance的值...原因和上面一样,前者传递的是instance的引用的副本,后者传递的是instance的引用本身...跟什么“不可变性”、“字符串驻留”毫不相干...

 

其实这个问题实在是太简单,看两眼MSDN就清清楚楚了...我都不好意思写这篇文章,有凑篇数的嫌疑,但是你要经常看看.NET版那些回答就知道这种问题实在是太普遍了...

<think>好的,用户问失血400ml对身体有没有害。首先我得确认这个量在医学上的定义。记得成年人总血量大约是体重的7%-8%,比如60公斤的人大概有4200-4800ml的血。所以400ml的话大概是总血量的8-10%左右。 接下来需要考虑不同人群的情况。健康成年人通常可以耐受10%以下的失血,可能只会出现轻微症状,比如头晕或心跳加快,但不会有大问题。不过如果是儿童、老年人或者有贫血、心脏病的人,可能反应会更严重些。 还要看失血的速度。如果是短时间内大量失血,比如外伤导致的,即使400ml也可能引起明显症状,需要及时处理。但如果是缓慢失血,比如月经量过多,身体可能逐渐适应,影响较小。 另外,用户可能担心献血的情况。通常献血200-400ml,健康人不会有长期影响,身体会自行补充。但如果有潜在健康问题,可能需要更谨慎。 还要考虑是否有其他症状伴随,比如持续出血、意识模糊等,这时候必须立即就医。 总结的话,400ml失血对健康成年人来说通常不会有严重危害,但具体情况需结合个体差异和失血原因来判断。如果用户有特殊情况或者症状,建议咨询医生。</think>**失血400ml对身体的影响需要分情况看待:** 1. **健康成年人的耐受性** 总血量约占体重7-8%(60kg成年人约4200-4800ml)。失血400ml(约占总血量8-10%)时,健康人群通常表现为: - 短暂心悸、轻微头晕 - 休息后可自行恢复 - **无需输血**(WHO建议<15%失血量一般不需输血) 2. **高风险人群需警惕** 以下群体可能出现代偿不足: $$ 代偿能力 = \frac{基础健康状况}{失血速度} \times 年龄系数 $$ - 贫血患者(Hb<110g/L时风险倍增) - 心血管疾病患者(可能诱发心绞痛) - 老年人(血管弹性下降导致调节能力减弱) 3. **失血速度决定危害性** - 急性失血(如创伤):400ml在1小时内流失需密切观察 - 慢性失血(如月经):超过80ml/周期即属月经过多,长期400ml失血会导致缺铁性贫血 4. **关键代偿机制** 人体通过以下方式维持循环稳定: ``` 血管收缩 → 组织液回流(可达1500ml/h) → 骨髓造血加速(需2-3天) ``` 但会伴随血液稀释(Hb下降约10g/L/100ml失血) **建议处理方案:** - 立即压迫止血(如有外伤) - 补充等渗溶液(按1:3比例) - 监测生命体征: $$ MAP = \frac{SBP + 2DBP}{3} \quad (维持>65mmHg) $$ - 血红蛋白<70g/L时应考虑输血 (注:具体情况需结合凝血功能、基础疾病等综合评估,建议失血后24小时内进行血常规复查)
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值