在属性中传递 ref 类型,C# 是按值传递还是按引用传递
使用 c#、vs2008、winforms
如果我通过属性从父窗体向子窗体传递参数,或者实际上通过属性向任何类传递参数,并且在 C# 中传递的参数是在父窗体中创建的引用类型, 默认情况下它是否作为引用或值传递?
例如,如果我通过属性传递数据集。 如果它确实按值传递,您可以通过属性将其通过 ref 传递吗? 或者我应该通过方法参数传递它,这是更好的做法吗?
基本上我想将填充的对象检索回父表单,并且感觉通过 ref 传递在父表单中创建的对象更好。
using c#, vs2008, winforms
If i am passing a parameter via a property to a child form from a parent form, or infact via a property to any class, and the the paramater im passing in C# is a reference type created in the parent form,
does it get passed as a ref or value by default ?
Eg if i pass a dataset via a property.
And if it does get passed by value, can you make it passed by ref via a property ?
Or should i just pass it via a method paramater, is that better practice ?
Basicaly i want to retrieve a populated object back to the parent form, and feel passing by ref an object that is created in the parent form is better.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

发布评论
评论(4)
需要注意的是,C# 中的引用传递具有特定的含义。对于属性,该属性最终指向与它所设置的对象相同的地址。在将对象传递给函数的情况下,C# 使用按值传递引用语义。这意味着引用本身被复制,因此新指针指向与传递的对象相同的地址。这可以防止函数通过将其参数设置为 null 来使任何原始指针无效。要实际传递原始引用,必须使用 'ref' 关键字:
class SomeClass
{
public object MyObjectProperty { get; set; }
}
var someClass = new SomeClass();
object someObject = new object();
someClass.MyObjectProperty = someObject; // Makes MyObjectProperty point to the same location as someObject
在以下情况下,使用按值引用语义:
void MyMethod(object someObject)
{
someObject = null;
}
object someObject = new object();
MyMethod(someObject);
Console.WriteLine(someObject == null); // Prints false
在以下情况下,使用实际按引用传递语义:
void MyMethod(ref object someObject)
{
someObject = null;
}
object someObject = new object();
MyMethod(ref someObject);
Console.WriteLine(someObject == null); // Prints true
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
对于引用类型,对变量的引用是按值传递的。当然,除非您在 C# 中使用
ref
或out
关键字来改变该行为。这意味着 DataSet 值属性实际上传递对 DataSet 实例的引用,并按值传递它。
Jon Skeet 的《C# 深度》 是一个很好的参考(没有双关语)在这些问题上。
For reference types, a reference to the variable is passed by value. Unless, of course, you use the
ref
orout
keywords in C# to alter that behaviour.That means that a DataSet-valued property passes, in actual fact, a reference to a DataSet instance, and passes it by value.
Jon Skeet's "C# in Depth" is a great reference (no pun intended) on these matters.