属性是否通过C#引用传递?

时间:2016-09-30 19:00:13

标签: c#

如果我有一些接受布尔值的方法,并且我传递了一个布尔属性,那么该方法是否会引用该属性?或者只是我当时传递的价值?

3 个答案:

答案 0 :(得分:1)

您需要使用ref关键字在C#中通过引用传递。在C#中,传递值是默认值。传递非不可变类实例时,这有点令人困惑,因为您传递的是引用的值。当您将类引用传递给方法而不使用 ref关键字时,该方法可以更改实例的属性,但它们无法更改调用方的引用到那个实例。他们无法更改调用者的引用以引用新实例。但是使用ref(或out),他们可以。

C#中的ref关键字不能与属性一起使用。 See fiddle for the code below

  

编译错误(第8行,第15行):属性,索引器或动态成员访问权限不能作为out或ref参数传递

C#

using System;

public class Program
{
    public static void Main()
    {
        var c = new C();
        F(ref c.P);
    }

    public static void F(ref int n) { }

    public class C
    {
        public int P { get; set; }
    }
}

这是因为ref int是对int的引用,而具有getter和setter的属性不是整数。它的代码返回一个整数,或者可以为其分配一个整数。 C#做了一些魔法,但没有多少魔法。而“魔术”只是编译器生成的代码。他们可以做到了。但他们没有。

我想猜测为了运行时效率,他们希望将它作为简单的语法糖保存在指针(或任何与它非常相似的东西)上。但这种猜测可能是错误的。

答案 1 :(得分:0)

您当时传递的值

答案 2 :(得分:0)

它将传递价值。

默认情况下,C#中的所有参数都会复制该值。例外情况是使用outref注释属性时,在这种情况下,参数实际上是对值的引用,而不是值本身。

虽然通常可以通过引用方法传递参数,但是不能通过引用传递属性的值,它在C#中是不受支持的。如果的方法使用ref进行注释,那么您的代码将无法编译。