C#属性,是否可以在没有定义set(没有后备变量)的情况下定义get?

And*_*rew 7 c# properties

假设您有一个具有300个属性且没有后备变量的类,每个属性都返回一个十进制/双精度.

例:

public decimal MathValue { get; set; }
Run Code Online (Sandbox Code Playgroud)

现在你决定将这些值中的每一个都舍入.

我正在寻找最简单的重构方法,而不必重写所有这些属性.

这个实际上有效的东西:D:

public decimal MathValue { get {return Math.Round(MathValue);} set; }
Run Code Online (Sandbox Code Playgroud)

Pav*_*aev 6

不可以.如果您在getter或setter中需要任何自定义逻辑,则无法使用自动属性.

  • 我不明白这如何回答他的问题。 (2认同)

And*_*ndy 5

您可以创建一个假装为小数的新值类型,但返回舍入值.像这样的东西:

struct RoundedDecimal
{
    public decimal Value { get; private set; }

    public RoundedDecimal(decimal value) : this()
    {
        this.Value = value;
    }

    public static implicit operator decimal(RoundedDecimal d)
    {
        return Math.Round(d.Value);
    }
}
Run Code Online (Sandbox Code Playgroud)

类中的每个属性都应该是类型RoundedDecimal而不是decimal.


Dr.*_*ice 5

重构代码的最简单方法?这是我会做的:

  1. 打开 Notepad++(如果没有就拿)
  2. 将类的所有属性复制/粘贴到空白文本区域。
  3. 将光标置于第一行的开头: public decimal MathValue1 { get; 放; }
  4. 开始录制宏(单击工具栏上的录制按钮)
  5. 按住 ctrl+右箭头(称为“word right”)3 次,将光标置于属性名称的开头。
  6. 执行 shift+ctrl+right arrow 1 次并执行 Copy 以将属性名称放入剪贴板
  7. word right 3 次将光标放在“get”之后
  8. 删除 get 后的分号并开始输入“ { return Math.Round(_”
  9. 做一个粘贴 10 类型 "); }"
  10. word right 2 次将光标放在“set”之后
  11. 删除设置后的分号并开始输入“{_”
  12. 做一个粘贴
  13. 输入“=值;}
  14. 按 End 键使光标移动到行尾
  15. 按向右箭头键将光标移至下一行的开头。
  16. 按停止按钮结束您的宏(工具栏上的方形按钮)
  17. 单击“多次运行宏”按钮(工具栏上的双箭头图标)并说“运行到文件末尾”
  18. 将生成的文本复制/粘贴回您的类以替换原始属性定义。

现在,您需要定义一组相应的私有变量,这些变量以下划线开头,但在其他方面与属性具有相同的名称。从您的类中的属性的新副本开始,并执行与上述类似的一组步骤。

我的假设是每行以 2 个选项卡开头,并且属性之间没有空行。

与其让每个属性都调用 Math.Round,不如考虑定义自己的效用函数,它们都调用该函数,这样如果需要再次更改它,只需在一处更改即可。