为什么C#不提供内部帮助器来传递属性作为参考?
这是关于LANGUAGE DESIGN的问题.
在你阅读完整篇文章之前请不要回答这个问题!谢谢. 由于所有助手都存在于C#中(如lambdas或自动属性),因此我无法通过引用传递属性.让我们说我想这样做: foo(ref my_class.prop); 我收到错误所以我写了: { var tmp = my_class.prop; foo(tmp); my_class.prop = tmp; } 现在它有效.但请注意两件事: >它是通用模板,我没有放任何类型,只有“var”,所以它适用于我必须通过的所有类型和数量的属性 现有问题实际上杀死了Swap等有用的功能.交换通常为3行,但由于它需要2个引用,因此调用它需要5行.当然这是无稽之谈,每次我都想用它来手写“交换”.但是这表明C#阻止了可重复使用的代码,这很糟糕. 问题 那么 – 如果编译器自动创建临时变量(就像我手工做的那样)会发生什么不好,调用函数,并将值分配回属性?这有危险吗?我没有看到它所以我很好奇你觉得为什么这个问题的设计看起来像现在看起来. 干杯, 编辑由于280Z28提供了很好的例子来打败自动包装ref属性的想法,我仍然认为使用临时变量包装属性会很有用.也许是这样的: Swap(inout my_class.prop1,inout my_class.prop2); 否则没有真正的交换C#:-( 解决方法
关于ref参数的含义和行为,你可以做很多假设.例如,
情况1: int x; Interlocked.Increment(ref x); 如果你可以通过ref将属性传递给这个方法,那么调用将是相同的,但它会完全破坏方法的语义. 案例2: void WaitForCompletion(ref bool trigger) { while (!trigger) Thread.Sleep(1000); } 简介:by-ref参数将内存位置的地址传递给函数.创建临时变量以“通过引用传递属性”的实现在语义上等同于传递值,这正是您在将参数设置为ref时不允许的行为. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 用lazarus快速创建xml格式文件
- xml – 编辑.plist文件 – 是否允许作为字符串使用单引号?
- 写selector的xml文件时,需注意item的顺序,不带状态的item
- postgresql – pl / pgsql块上的Prepared语句调用失败(语法
- c# – ‘MongoDB.Bson.BsonElement’不是简单POCO上的属性类
- NOR FLASH与NAND FLASH
- 如何以编程方式使用dojox.grid.DataGrid创建dijit.Dialog
- ReactiveCocoa理解
- objective-c – UIColor CMYK和Lab值
- reactjs – React如何使用变量设置元素的ref值