我记得我最近与一位开发人员就私人与公共财产的记忆足迹进行的讨论.我说私人的足迹少于公共足迹.他声称这没什么区别.顺便说一下,我们在讨论C#.
谁是对的,为什么?
显然,语言存在差异.我很好奇它们是什么.
在什么语言的背景下?
在大多数语言中,从改变方法的辅助public
来private
,反之亦然不会在所有影响其内存占用.这是因为方法的实际实现和实际调用不会改变,只会强制执行对它的访问(在编译时或在运行时,基于所讨论的编程语言).
什么将有内存占用的效果是其他限定符,诸如final
在Java中,virtual
在C++,static
等. 这些限定符可以或者直接影响存储器足迹(在类中的对应条目的存在或不存在vtable
),或间接地影响存储器占用因为某些优化假设可以由编译器或由运行时进行的(例如非virtual
,static
和/或final
方法可以被内联,从而可以说是提高性能-和最肯定增加内存占用量.)
比内存占用更重要的是,在讨论方法应该如何被限定时,你可以做什么(1)让编译器(或运行时,取决于语言)验证你的一些假设和意图,以及( 2)将这些假设和意图传达给程序员,他们将在您之后对代码进行检查,反向工程,更改,重新考虑等因素:
private
:其他类或此类的后代需要直接访问此方法吗?如果没有,那就去吧private
.
protected
:做这个类的后代(或者这个类本身),但是没有其他类(除了friend
类),需要直接访问这个方法吗?如果是这样,那就去吧protected
.
static
:该方法是否需要访问成员变量或this
?如果不是,它应该是static
(例如,仅依赖于其论点的实用方法)
const
:该方法是否更改成员变量或调用非const
成员方法this
或成员变量?如果没有,它应该是const
(例如一个吸气剂)
virtual
:这个方法需要被覆盖吗?如果没有,它不应该virtual
abstract
(或纯虚拟):如果此类的后代将覆盖它,该方法是否需要在此类中具有实现?如果没有,请abstract
(或pure virtual
)
等等
有关于上述最佳实践的杂项文章,讲座和帖子,超越了许多编程语言的界限:
访问权限和封装
封装
私人与受保护
等等