操纵 C# Shorthand Getter-Setter

Manipulating C# Shorthand Getter-Setter

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

的问题

我身高属性如下

public int height {get; set;} = 200 

但是宽度属性最小为10px,所以写成原来的形式

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

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

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

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

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

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

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

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

不,您不能同时拥有 auto-implemented getter 和自定义 setter(或 vice-versa)。

当你写:

T Prop { get; set; }

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

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

如您所见,这很容易分解,因此实现 auto-generated 对应物的唯一可行方法是“如果有一个与 属性 同名的字段,但是小写字母(或小写字母前加下划线,这是标准的 .NET 命名约定)然后 auto-generate 使用该字段的对应项”。这是非常具体的,实现它的复杂性并不能保证它的可用性,因为两者之间的区别:

T _prop;

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

T _prop;

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

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