是否可以在 setter 中将属性作为 ref 参数传递?c#(避免“属性或索引器不能作为 out 或 ref 参数传递”。)

rus*_*Bay 1 c# properties

我有这个代码:

private int _someProperty;
public int SomeProperty
{
    get => _someProperty;
    set => SetProperty(ref _someProperty, value);
}

private void SetProperty<T>(ref T field, T value)
{
    if (!field.Equals(value))
    {
        field = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要它是SetProperty<T>因为我需要在一个具有大量属性的大类中设置逻辑,并且该逻辑适用于所有属性。_someProperty该代码适用于变量的情况。但就我而言,它不起作用,因为我引用了嵌套类的另一个属性,因此我收到编译错误:“属性或索引器可能无法作为 out 或 ref 参数传递”。

由于属性是底层的方法,我尝试了类似的方法:

private setProperty<T>(ref Action<T> property, T value) {
    //meaningful code
}
Run Code Online (Sandbox Code Playgroud)

但无论如何我都会收到编译错误。

有没有一种直接的方法通过引用传递属性来以某种方式直接解决这个问题?

Mar*_*ell 5

不,基本上。

可变引用返回仅获取属性存在潜在漏洞,但这可能对您没有帮助,因为

  1. 不能有任何设定的逻辑在可变引用返回仅获取属性中设置任何逻辑
  2. 这是一个荒谬的利基场景,大多数开发人员不知道存在,并且永远不需要使用:)

  • @TheGeneral,请注意:你无法视而不见。根据您的选择:https://gist.github.com/mgravell/c46a1de553abe325dea0c44ac7fa7766 - 请注意,这不是此语言功能的通常用法,因为在这种情况下,它与直接公开字段几乎相同。更典型的用法可能是用于享元,或者提供对数组等内的值的受控访问(通过引用);如果当时存在,则 `ArraySegment&lt;T&gt;` 可能有一个索引器 `public ref T this[int index] =&gt; ref Array[Offset + index];`,例如 (2认同)