【问题标题】:c# properties, have a get with an auto-implemmented private setc# 属性,拥有一个自动实现的私有集
【发布时间】:2013-09-25 06:56:19
【问题描述】:

使用 c# 自动实现的属性,我可以拥有一个执行以下操作的类(伪 C# 代码,因为我收到错误 - 尝试编译时如下所示):

public class Foo {
    public String HouseName { get; private set; }
    public int HouseId { get; private set; }
    public int BedsTotal { 
        get { return (BedsTotal < 0) ? 0 : BedsTotal; }
        private set;
    }
}

错误 5 'House.BedsTotal.set' 必须声明一个主体,因为它没有标记为抽象、外部或部分 c:\src\House.cs

对我来说,似乎我应该能够为 getter 获取一个主体,并依赖自动生成的私有集,就像我执行 { get;私人套装; } 但这不起作用。

我是否需要全程设置成员变量,关闭私有 setter 并改用成员变量?

谢谢!

【问题讨论】:

    标签: c# properties field automatic-properties


    【解决方案1】:

    是的,您需要设置私有变量,因为此时您将进入一个循环尝试读取 get {} 部分,因为它引用了自己。

    像这样设置一个私有后备变量:

    private int _bedsTotal;
    public int BedsTotal { 
            get { return (_bedsTotal < 0) ? 0 : _bedsTotal; }
            private set { _bedsTotal = value; }
        }
    

    然后你可以通过私人设置器访问床

    【讨论】:

    • 他可以使用私有setter而不是方法,比如private set { _bedsTotal = value; }
    【解决方案2】:

    我会选择更简单的方法

    private int _bedsTotal;
    public int BedsTotal
    { 
        get
        {
            return (this._bedsTotal < 0) ? 0 : this._bedsTotal;
        }
        private set
        {
            this._bedsTotal = value;
        }
    }
    

    所以你可以像这样设置BedsTotal的值:this.BedsTotal = [integer];,不需要使用其他私有方法,因为你可以使用set

    【讨论】:

    • 这将允许其他类设置_bedsTotal 的值。 OP 想要将 setter 设为私有
    • 是的,我的错,忘了private这个词
    • 其他类既看不到 setter 也看不到 _bedsTotal 成员,因为它们都被声明为私有。他们只被允许使用 getter 编辑:我已经看到了更新的版本;)
    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 2012-06-30
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    相关资源
    最近更新 更多