为什么在C#中属性不可作为 ref 或 out 参数传递?

崔鹏飞 2011-01-04 11:16:11
msdn上只给出了规则(http://msdn.microsoft.com/zh-cn/library/4xd8bbw5(v=VS.90).aspx)

但是,为什么呢?
...全文
2240 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
无趣 2012-02-14
  • 打赏
  • 举报
回复
用着不爽,支持多好!
崔鹏飞 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sp1234 的回复:]
我见过有人拿着国外作者靠收集微软十年前发布的各种.net1.0的JIT编译机制的文章而编撰的书,来理解现在的.net4.0的机制
[/Quote]
您指的是?
崔鹏飞 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 cuipengfei1 的回复:]

引用 14 楼 sp1234 的回复:
编译器不能预先测试属性能不能写值吗?我们如果对只读属性去赋值,编译器可以给出异常。

其实这个是我要问的问题的愿意。您估计是为什么呢?
谢谢
[/Quote]
==
Valefish 2011-01-05
  • 打赏
  • 举报
回复
基础很重要
崔鹏飞 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sp1234 的回复:]
编译器不能预先测试属性能不能写值吗?我们如果对只读属性去赋值,编译器可以给出异常。
[/Quote]
其实这个是我要问的问题的愿意。您估计是为什么呢?
谢谢
崔鹏飞 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sp1234 的回复:]

引用 7 楼 cuipengfei1 的回复:

引用 2 楼 wuyq11 的回复:

ref和out参数值在内部实现时,需要将内存地址传给目标方法。由于属性可能是没有支持字段的虚字段,也有可能是只读/只写的,因此不可能传递其基础存储的地址。所以,不能将属性作为ref或out参数值来传递。同样的道理也适用于方法调用
http://book.51cto.com/art/200910/1……
[/Quote]
请问您指的是哪本书?
csproj 2011-01-05
  • 打赏
  • 举报
回复
这种情况可以直接把对象做为参数传进去。
在方法内给 对象的属性赋值。
足球中国 2011-01-05
  • 打赏
  • 举报
回复
ref 和out 传值时,其时是传递的指针。当把函数作为参数传递时,返回值改变了。
函数的指针改变了。相当于改变了调用的函数。
卧云 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 microtry 的回复:]
最简单的例子:

C# code
private int m_Qty;
private int m_Price;
public int TotalPrice{
get{return m_Price * m_Qty;}
}
[/Quote]

这个垃圾,就喜欢答非所问,我看你连ref和out是什么都不知道

方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数传递。

方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。
传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。
属性不是变量,不能作为 ref 参数传递。

rel是有进有出,out是只出不进。。。。
兔子-顾问 2011-01-05
  • 打赏
  • 举报
回复
ref和out是针对变量的,属性在编译后是2个独立的方法。如果ref和out理解为传递地址,那属性是没有办法返回一个地址并设置的,因为属性是通过set和get方法操作的,甚至属性本身不一定存在某个对应的变量,例如
public bool Visuable
{
get{GetWindowVisable(this.Handle);}
get{ShowWindow(value?SW_SHOW:SW_HIDE);}
}
雨师88 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyq11 的回复:]

ref和out参数值在内部实现时,需要将内存地址传给目标方法。由于属性可能是没有支持字段的虚字段,也有可能是只读/只写的,因此不可能传递其基础存储的地址。所以,不能将属性作为ref或out参数值来传递。同样的道理也适用于方法调用
http://book.51cto.com/art/200910/158498.htm
[/Quote]

很有道理~
烈火蜓蜻 2011-01-05
  • 打赏
  • 举报
回复
属性其实就是方法,方法怎么能被 Out或是Ref
  • 打赏
  • 举报
回复
如果楼主看一下生成的IL汇编内容,就知道Get/Set属性在编译后变成了get()/set()方法了
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cuipengfei1 的回复:]

引用 2 楼 wuyq11 的回复:

ref和out参数值在内部实现时,需要将内存地址传给目标方法。由于属性可能是没有支持字段的虚字段,也有可能是只读/只写的,因此不可能传递其基础存储的地址。所以,不能将属性作为ref或out参数值来传递。同样的道理也适用于方法调用
http://book.51cto.com/art/200910/158498.htm

谢谢,看来essential……
[/Quote]

几乎每一个版本的.net在实际的JIT编译机制上都有差别,特别是早期的。我见过有人拿着国外作者靠收集微软十年前发布的各种.net1.0的JIT编译机制的文章而编撰的书,来理解现在的.net4.0的机制,这有时会非常尴尬。实际上,当一本书主要是弄一些非公开的文档内容时,也就意味着它的描述仅仅是帮你猎奇和侧面理解一些东西,而不是稳定的、已公开文档。

编译器不能预先测试属性能不能写值吗?我们如果对只读属性去赋值,编译器可以给出异常。因此用某本“揭秘”的书来解释高层次为什么做那种规定,其实往往产生误会,似乎人家根本不会在底层进行改进和重构似地。
  • 打赏
  • 举报
回复
这可以看作c#编译器的规定,是编译器设计者根据个人经验,确定这种形式可以避免许多编程错误吧。如果换作其它语言的编译器,则完全可以不支持此规定。
w5588660 2011-01-05
  • 打赏
  • 举报
回复
支持2楼
Awbeci 2011-01-05
  • 打赏
  • 举报
回复
我觉得在属性中是只读/只写,而没有像方法那样有方法的签名,因此从表面上讲就是没有必要做传递值,只是对字段的一种封装,而不需要进行引用,然而在方法中有这种你所说的这种方法,因此属性就是有别与方法的特殊方法!
缪军 2011-01-05
  • 打赏
  • 举报
回复
最简单的例子:
private int m_Qty;
private int m_Price;
public int TotalPrice{
get{return m_Price * m_Qty;}
}
崔鹏飞 2011-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyq11 的回复:]

ref和out参数值在内部实现时,需要将内存地址传给目标方法。由于属性可能是没有支持字段的虚字段,也有可能是只读/只写的,因此不可能传递其基础存储的地址。所以,不能将属性作为ref或out参数值来传递。同样的道理也适用于方法调用
http://book.51cto.com/art/200910/158498.htm
[/Quote]
谢谢,看来essential C#是本好书。
但是为什么作者在说“可能”呢.....
足球中国 2011-01-04
  • 打赏
  • 举报
回复

参考一下c++,利用指针返回多个值。
加载更多回复(5)

111,085

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧