在C#中按引用或值传递对象

在C#中,我一直认为非原始变量是通过引用传递的,原始值是通过值传递的。

因此,当将任何非原始对象传递给方法时,对该方法中的对象执行的任何操作都会影响要传递的对象。(C#101的东西)

但是,我注意到当我传递System.Drawing.Image对象时,似乎不是这样吗?如果我将system.drawing.image对象传递给另一个方法,然后将图像加载到该对象上,然后让该方法超出范围并返回到调用方法,则该图像未加载到原始对象上吗?

为什么是这样?

回答:

__根本不传递 对象 。默认情况下,对参数进行求值,并按 将其

作为您所调用方法的参数的初始值传递。现在重要的一点是,该值是引用类型的引用-

一种访问对象(或null)的方法。从调用者可以看到对该对象的更改。但是,当您使用按值传递时,更改参数的值以引用另一个对象将 可见,这是 所有

类型的默认值。

如果要使用按引用传递,则无论参数类型是值类型还是引用类型,都 必须

使用outref。在那种情况下,变量本身实际上是通过引用传递的,因此参数使用与参数相同的存储位置-并且调用者可以看到对参数本身的更改。

所以:

public void Foo(Image image)

{

// This change won't be seen by the caller: it's changing the value

// of the parameter.

image = Image.FromStream(...);

}

public void Foo(ref Image image)

{

// This change *will* be seen by the caller: it's changing the value

// of the parameter, but we're using pass by reference

image = Image.FromStream(...);

}

public void Foo(Image image)

{

// This change *will* be seen by the caller: it's changing the data

// within the object that the parameter value refers to.

image.RotateFlip(...);

}

我有一篇文章将对此进行详细介绍。基本上,“通过引用”并不意味着您认为它意味着什么。

以上是 在C#中按引用或值传递对象 的全部内容, 来源链接: utcz.com/qa/418523.html

回到顶部