【问题标题】:Manipulating C# Shorthand Getter-Setter操作 C# 速记 Getter-Setter
【发布时间】:2021-02-03 09:51:02
【问题描述】:

最近开始在 C# 中工作,我正在充分利用速记属性(Getters-Setters),并且有一个关于如何约束 setter 的问题

我有一个高度属性如下

public int height {get; set;} = 200 

width 属性至少为 10px,因此以原始形式编写

private int width = 100
public int Width 
{
  get
  {
    return this.width;
  }
  set
  {
    this.width = value > 10 ? value : 10;
  }
}

我的问题是...有什么方法可以保留速记样式的属性并对其进行操作以使用我的三元运算符?几乎所有其他属性都有简写语法,我喜欢保持一致。 (我知道这是错误的,但这样的事情可能吗?)

public int width {get; set => value > 10 ? value : 10;} = 100

【问题讨论】:

  • 如果你的 setter 有一个 lambda 表达式,编译器也会让你使用一个作为 getter
  • 我从未见过这怎么可能,但我很想知道是否有办法。我不得不承认,在某些情况下,让这种语法成为可能会非常方便。在编译时找出隐藏的自动生成的私有字段并不复杂。
  • 感谢阅读威克。 @Jonesopolis 请问为什么?在我的脑海中,它们是 2 个独立的代码块,当我使用 Java 时,它们被完全隔离。

标签: c# getter-setter conditional-operator


【解决方案1】:

不,您不能拥有自动实现的 getter 和自定义 setter(反之亦然)。

当你写作时:

T Prop { get; set; }

编译器会为属性生成一个特殊的支持字段,其名称无法从实际 C# 代码中访问(反汇编上述代码的 .NET Core 3.1 编译会产生名称 <Prop>k__BackingField)并创建一个简单的 getter,返回其value 和一个将 value 分配给它的 setter。

现在,如果您的 setget 是自定义的,则没有通用的方法可以自动生成合理的对应项。在您的情况下,支持字段 width 与属性本身的类型相同,并且具有相同的名称,只是小写。但是可以很容易地拥有一个具有不同类型和不同命名约定的支持字段。或者该属性可能是许多不同字段的复杂组合。

正如您所看到的,这很容易崩溃,因此可以实现自动生成对应项的唯一可行方法是“如果有一个与属性同名但小写的字段(或小写前面有下划线) ,就像标准的 .NET 命名约定一样)然后使用该字段自动生成对应项”。这是非常具体的,实现它的复杂性并不能保证它的可用性,因为:

T _prop;

T Prop
{
  get => _prop;
  set
  {
      ... // custom code
  }
}

T _prop;

T Prop
{
  get;
  set
  {
      ... // custom code
  }
}

可以忽略不计。我什至认为第一个更具可读性,因为它专门向我展示了正在使用的字段,而我不必寻找它。

【讨论】:

  • 老兄!非常感谢!这是一个布局合理的荒谬解释。我感谢您的帮助,现在对我来说确实很有意义。度过美好的一天!
【解决方案2】:

考虑到 C# 的语言设计,这是最接近的:

private int width = 100;
public int Width
{
    get => width;
    set => width = value > 10 ? value : 10;
}

我建议在代码中添加换行符,使其更具可读性和易于调试;将断点添加到新行比添加到单个行的部分更容易。

【讨论】:

  • 感谢您提供的建议和解决方案!非常感谢
【解决方案3】:

不是这样,但你绝对可以缩短上面的 12 行怪物:

int width = 100;
public int Width { get => width; set => width = Math.Max(10, value); }

【讨论】:

    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    相关资源
    最近更新 更多