【问题标题】:Cleaner ways of accessing data from types从类型访问数据的更简洁的方法
【发布时间】:2019-07-15 16:19:57
【问题描述】:

所以,这是同一个主题的两个问题。

我一直在寻找方法让我对来自类型的数据的访问更加干净。例如,假设我正在创建某种 Health 类,并为它编写一些字段。

public class Character {
    public Health Health;
}
public class Health {
    public short Current;
    public short Maximum;
}

现在这可行,但我正在寻找一种方法,当我想获得当前的健康值时,我可以避免使用Health.Current。像这样的:

public class Health {
    private short Current;
    public short Maximum;

    public short this {
        get { return Current; }
        set { Current= value; } 
    }
}

我原以为这会奏效,但不幸的是它没有。有没有办法做到这一点?

如果没有,那么有没有办法做到这一点:

public class Character {
    public short Health;
    public short Health.Maximum;
}

它会产生类似的预期效果。

编辑:另外,我知道这是不必要的,但它仍然是我想要的。 (问题有小错误,已修复)

【问题讨论】:

  • 如果你使用属性而不是公共字段(共识是you should),那么你的字符类可以包含public short MaximumHealth => Health.Maximum; - 这就是你所追求的吗?
  • 不完全是,我所追求的是一种方法,以便仅调用Health 将返回Health.Value,而不会丢失Health.Maximum 字段,第三个代码块演示了我的最终目标是最好的。 (我更喜欢属性,我只是为了举例而使用了字段)对不起,我在代码中犯了一个错误,我现在已经修复了,问题应该更清楚了。
  • 好吧,您可以将健康类中的隐式运算符添加到返回当前值的short - public static implicit operator short(Health health) { return health.Current ; }
  • 这正是我正在寻找的功能,您可以将其发布为答案。虽然“可以”用斜体字有什么原因,但除了能够直接访问Health 类本身的实例之外,还有什么损失吗?
  • 可以这样做,但是这会让你的代码的大多数读者感到困惑。如果character.Health 应该返回当前运行状况,则将其设为返回当前运行状况的属性,并将MaximumHealth 设为另一个属性。当您不更改某些内容的含义时,转换运算符是为了方便。例如不会丢失精度的数字转换。

标签: c# naming


【解决方案1】:

您可以将健康类中的隐式运算符添加到返回当前值的 short 中:

public class Health
{
    public static implicit operator short(Health health)
    { 
        return health.Current;
    }

    public short Current;
    public short Maximum;
}

这样使用它:

Health h = new Health { Current = 20, Maximum = 100};
short current = h;
Console.WriteLine(current); // 20

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多