【问题标题】:Multiple values in an expression-bodied set method of a property属性的表达式体 set 方法中的多个值
【发布时间】:2017-12-11 12:21:42
【问题描述】:

是否可以在一个 set 方法中设置多个值?

我想做如下的事情:

public int ID { get; set => {Property = value, ID=value}; }

【问题讨论】:

  • 当然你可以这样做,但是你不应该这样做,或者至少适当地记录它。基本上,副作用是一件坏事。属性实际上只是通常的 get 和 set 方法。你可以做一切你可以用正常方法做的事情。
  • 是的,你可以。你试过了吗?发生了什么?阅读How to Ask
  • 给出语法错误。我知道不推荐或好的程序样式(只是想知道是否可能)

标签: c# expression-body


【解决方案1】:

Expression-bodied setters 不具备执行多个操作的表达能力,因此您需要使用完整的方法体语法:

private Foo foo;
public Foo Foo
{
    get { return foo; }
    set
    {
        foo = value;
        OtherProperty = value.SomethingElse;
    }
}

在某些情况下这样做是合理的,因为某些操作本身就有副作用。例如,如果您正在设置对象的时区属性,则更改底层DateTime 以确保其DateTimeKindDateTimeKind.Local 是有意义的。否则,对象的 DateTime 属性不完整或错误。

也就是说,如果您发现自己到处都在这样做,您可能需要重新考虑您的设计,因为过度使用是一种代码味道。

【讨论】:

    【解决方案2】:

    set 之后不需要=>,您可以改用{..}。我认为您正在寻找这样的课程:

    class Sample
    {
        private int _Property;
        private int _ID;
        public int Property
        {
            get { return _Property; }          
        }
        public int ID
        {
            get { return _ID; }
            set
            {
                _ID = value;
                _Property = value;
            }
        }
    }
    

    这是一个Example,它显示了工作原理,

    这里的Property 是一个只读属性,你不能设置它的值, 当您设置ID的值时,它将自动分配

    【讨论】:

    • 没有人应该寻找这样的课程。 foo.Poperty = 1; foo.ID = 2; 现在foo.Property 是 2。头痛的秘诀。
    • @oerkelens:谢谢你的意思,Property 应该是只读的,我已经更新了答案
    猜你喜欢
    • 2017-11-12
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多