加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 我应该在类中使用Field或Property来设置值

发布时间:2020-12-15 04:16:59 所属栏目:百科 来源:网络整理
导读:所以我和一位同事就一段代码进行了友好的争论: public sealed class NewObject{ private string _stuff = string.Empty; public string Stuff { get { return GetAllStuff(); } } private string GetAllStuff() { //Heavy string manipulation of _stuff }
所以我和一位同事就一段代码进行了友好的争论:
public sealed class NewObject
{
    private string _stuff = string.Empty;

    public string Stuff
    {
        get { return GetAllStuff(); }
    }

    private string GetAllStuff()
    {
        //Heavy string manipulation of _stuff
    }

    public NewObject(string stuffToStartWith)
    {
        _stuff = stuffToStartWith;
    }

    public static NewObject operator +(NewObject obj1,NewObject obj2)
    {
        if (obj1 == null)
            throw new ArgumentNullException();

        if (obj2 == null)
            throw new ArgumentNullException();

        NewObject result = new NewObject(string.Empty);
        result._stuff = String.Concat(obj1._stuff,obj2._stuff);

        return result;
    }
}

争论在于运算符覆盖.我的同事认为,除了构造函数之外,设置私有字段的值不是最好的编程习惯.我的同事提出的解决方案是将Stuff属性的名称重构为AllStuff,并添加一个属性Stuff,它具有get AND set访问器并在运算符覆盖中使用新的Stuff属性.看起来像这样:

public static NewObject operator +(NewObject obj1,NewObject obj2)
    {
        if (obj1 == null)
            throw new ArgumentNullException();

        if (obj2 == null)
            throw new ArgumentNullException();

        NewObject result = new NewObject(string.Empty);
        result.Stuff = String.Concat(obj1.Stuff,obj2.Stuff);

        return result;
    }

我不同意.我觉得第一种方式更好,因为它使属性在类外保持只读.我的问题是,哪种方式是面向对象设计的最佳实践?

解决方法

您可以在属性上给自己一个私有集(在允许您使用属性语法的同时保留可见性或缺少可见性),但这并没有真正解决这一点.

在课堂上,我说变量是公平的游戏.外部的任何地方,包括继承的类,都应该获取和设置属性,但在声明的类中,我说可以分配私有成员.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读