只读字段和私有 getter 属性之间的区别

Posted

技术标签:

【中文标题】只读字段和私有 getter 属性之间的区别【英文标题】:Difference Between readonly field and private getter property 【发布时间】:2021-04-18 01:12:06 【问题描述】:

您好,我对感到非常困惑。我见过人们在他们的代码中同时使用这两种方法,但我就是不明白是什么让它们与众不同。

private readonly int num = 0;

// or //

private int Num

    get  return num; 

那么使用其中任何一种有区别吗,还是根据某人的喜好? 我仍然是 C# 的初学者,并且我对 python 有一些经验,所以如果这是一个愚蠢的问题,我深表歉意。 :-)

【问题讨论】:

跨站欺骗:softwareengineering.stackexchange.com/questions/372462/… 这能回答你的问题吗? Are there any reasons to use private properties in C#? 两者都帮了我很大的忙,谢谢 【参考方案1】:

Getter 通常用于封装对字段的访问,以便对用户隐藏实现逻辑,使类更像是一个黑盒子。

私有 getter 只能被实现类的人(或使用反射来访问此字段的人)访问,因此它对于封装的用处不如以更方便的方式实现逻辑。

只读字段只能在构造函数或字段初始化器中设置(两者都在底层IL的构造函数中执行),而私有getter后面的变量可以随时设置。

只读值类型是不可变的,这意味着它在内存中保存的数据在构造函数执行后永远不会改变。

作为区别的例子:

private readonly immutableNum = 0; // this value will be always 0 (unless asigned something else in the constructor

private int num = 0; // this value can be changed anytime by internal logic in the class

private int Num

    get  Console.WriteLine("Accessed num"); return num;  // additional logic implemented in the getter that can't be done in a readonly field, 
    //num can be set/reset anytime, so its value can change


private immutableGetterNum => 6; //this value will never change

那么,你想封装访问逻辑吗?然后你需要使用吸气剂。您是否需要确保分配给字段的值不会更改?然后使用只读字段(或没有基础字段的 getter)。

【讨论】:

非常感谢您的回答!这绝对有助于消除很多困惑。

以上是关于只读字段和私有 getter 属性之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

何时应将属性设为私有并设为只读属性? [关闭]

私有字段和私有属性的区别

只读和私有方法的问题

Python中的setter和getter

为啥我不能为 CDTVC 中的私有 UIRefreshControl 属性创建 Getter?

Java Profiling:私有属性 Getter 具有较大的基准时间