在属性中传递ref类型,C#是按值传递还是按ref传递

在属性中传递ref类型,C#是按值传递还是按ref传递,c#,pass-by-reference,C#,Pass By Reference,使用c#,vs2008,winforms 如果我通过属性将参数从父窗体传递给子窗体,或通过属性传递给任何类,并且在C#中传递的参数是在父窗体中创建的引用类型, 默认情况下,它是否作为引用或值传递 例如,如果我通过属性传递数据集。 如果它确实通过值传递,您可以通过属性通过ref传递它吗? 或者我应该通过方法参数传递它,这是更好的实践吗 基本上,我希望将填充的对象检索回父窗体,并且感觉通过ref传递在父窗体中创建的对象更好。对于引用类型,对变量的引用是通过值传递的。当然,除非您使用C#中的ref或o

使用c#,vs2008,winforms

如果我通过属性将参数从父窗体传递给子窗体,或通过属性传递给任何类,并且在C#中传递的参数是在父窗体中创建的引用类型, 默认情况下,它是否作为引用或值传递

例如,如果我通过属性传递数据集。 如果它确实通过值传递,您可以通过属性通过ref传递它吗? 或者我应该通过方法参数传递它,这是更好的实践吗


基本上,我希望将填充的对象检索回父窗体,并且感觉通过ref传递在父窗体中创建的对象更好。

对于引用类型,对变量的引用是通过值传递的。当然,除非您使用C#中的
ref
out
关键字来改变这种行为

这意味着数据集值属性实际上传递对数据集实例的引用,并按值传递


在这些问题上是一个很好的参考(没有双关语)。

对于引用类型,变量的引用是通过值传递的。当然,除非您使用C#中的
ref
out
关键字来改变这种行为

这意味着数据集值属性实际上传递对数据集实例的引用,并按值传递

是对这些问题的一个很好的参考(没有双关语)。

< P> C不以C++的方式通过引用。更准确的说法是它通过引用值传递(对于引用类型)

C,并没有按照C++的方式通过引用。更准确的说法是它通过引用值传递(对于引用类型)


需要注意的是,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
在以下情况下,将使用实际的按引用传递语义:

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#中的pass by reference具有特定的含义。在属性的情况下,属性最终指向与其设置的对象相同的地址。在将对象传递给函数的情况下,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
在以下情况下,将使用实际的按引用传递语义:

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

首先要了解的是,在.Net中,变量可以是值类型(例如int)或引用类型(类)。值类型变量直接指向内存中的值,而引用类型变量指向内存位置


默认情况下,参数按值传递。但是,请记住,引用类型的“值”实际上是它在内存中的位置。因此,即使它被称为按值传递,您实际上是在传递对特定类的引用。

首先要了解的是,在.Net中,变量可以是值类型(例如int)或引用类型(类)。值类型变量直接指向内存中的值,而引用类型变量指向内存位置


默认情况下,参数按值传递。但是,请记住,引用类型的“值”实际上是它在内存中的位置。因此,即使它被称为按值传递,您实际上是在传递对特定类的引用。

因此,如果我将数据集作为属性参数传递给子窗体,请更改数据集的内容,然后关闭子窗体,如果不检索属性返回值,那么我应该在父窗体中创建的dataset对象中找到更改。对吗?@Jon:哎呀!谢谢你的修复!但是请注意,如果更改被调用函数[datasetCopy=new dataset();]中dataset的“值”,则datasetCopy对象现在指向的对象与调用函数对象不同;因此,调用函数的原始对象不受被调用函数中datasetCopy引用的后续更改的影响。假设我有一个获取
ref
arg(值类型-int)的方法或ctor,我可以存储此arg以供以后参考,还是必须传入父ref?@Shimmy:谢谢您的编辑,但是“行为“是完美英语。因此,如果我将数据集作为属性参数传递给子窗体,更改数据集的内容,然后关闭子窗体,而不检索属性返回值,那么我应该在父窗体中创建的数据集对象中找到更改。对吗?@Jon:哎呀!谢谢你的修复!但是请注意,如果更改被调用函数[datasetCopy=new dataset();]中dataset的“值”,则datasetCopy对象现在指向的对象与调用函数对象不同;因此,调用函数的原始对象不受被调用函数中datasetCopy引用的后续更改的影响。假设我有一个获取
ref
arg(值类型-int)的方法或ctor,我可以存储此arg以供以后参考,还是必须传入父ref?@Shimmy:谢谢您的编辑,但是“行为”是完美的英语。你说得对