【问题标题】:Reference to the backing field of auto-implemented property引用自动实现属性的支持字段
【发布时间】:2015-03-28 07:19:57
【问题描述】:

在 C# 中,自动实现的属性非常方便。然而,尽管它们只是封装了它们的支持字段,但它们仍然不能作为 ref 或 out 参数传递。例如:

public int[] arr { get; private set; } /* Our auto-implemented property */
/* ... */
public void method(int N) { /* A non-static method, can write to this.arr */
    System.Array.Resize<int>(ref this.arr, N); /* Doesn't work! */
}

在这种特殊情况下,我们可以通过以下方式解决问题:

public void method(int N) { /* A non-static method, can write to this.arr */
    int[] temp = this.arr;
    System.Array.Resize<int>(ref temp, N);
    this.arr = temp;
}

有没有更优雅的方式在 C# 中使用对自动实现属性的支持字段的引用?

【问题讨论】:

    标签: c# properties reference backing-field


    【解决方案1】:

    有没有更优雅的方式来使用对支持字段的引用 C# 中自动实现的属性?

    据我所知,不是。属性是方法,这就是为什么当参数需要其支持字段的类型时不能以这种方式传递它们的原因。

    如果您想使用自动属性,您所描述的解决方案就是解决方案。否则,您将不得不自己定义一个支持字段并让一个属性使用它。

    注意:您可以通过反射获得自动属性的支持字段,但这是我不会使用的 hacky 解决方案。

    【讨论】:

    • 谢谢你的回答,真的很有帮助=)我会尽快接受
    • 虽然是的,属性是方法,但自动属性有一个属性和一个具有相同概念“名称”的字段,编译器应该足够聪明,可以确定您要引用该字段而不是该上下文中的属性。这类似于event 关键字的神奇之处——它既是一个委托字段,也是作用于该字段的添加/删除方法的集合。然而,遗憾的是,情况并非如此,如果您想要这种行为,则必须将自动属性转换为具有显式支持字段的常规属性。
    【解决方案2】:

    来自MSDN

    以下几种方法不能使用 ref 和 out 关键字:

    • 使用 async 修饰符定义的异步方法。
    • 迭代器方法,包括 yield return 或 yield break 语句。
    • 属性不是变量。它们是方法,不能传递给 ref 参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2012-02-07
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2017-02-11
      相关资源
      最近更新 更多