在C#中将变量声明为“private”是否可以保护Windows内存不被内存扫描器访问?

5

我的同事经常告诉我,如果我们将任何东西声明为“public”,那么它是危险的,因为任何程序都可以访问该内存,解决方案是使用“private”访问修饰符。

我想知道这是否真的正确。


2
似乎你的工作伙伴对面向对象编程有较差的理解,你可能想为他获取一些基础阅读材料,以便他开始了解编程的本质。 - thaBadDawg
3个回答

9

事实上,那并不是真的。

访问修饰符只是为了帮助组织您的代码。它们只保护代码,就像您将玻璃杯放在猫够不到的地方以防止被打翻一样。


1
+1 给 Joviee - 公有/私有是类/成员访问限定符。不过,你的同事可能想要表达的是,如果你的类/成员被声明为公有的,它们实际上可以被任何其他类直接访问,这可能不是期望的结果。 - Jagmag
3
+1 表示赞同,但为了那些不明白“为什么”的人,我加入了一些实际的解释。 - Rex M
谢谢Rex M。很棒的比喻! - Matthew King

2
publicprivate 访问修饰符只与这些结构(类、方法或变量)对同一应用程序中的其他类的可见性有关。进程和用户之间的内存保护由操作系统强制执行。在 Windows 的情况下,它确保非管理员级别(和系统环)的进程/线程无法访问未明确共享(如共享内存)的内存,并具有开放权限。实际上,Windows 允许进程向特定区域的内存授予非常特定的权限,但这不是 C# 语言定义中提供的。您需要访问系统 API 来控制授予对特定内存块的访问权限;默认情况下,所有内存块都受操作系统保护。

现在,如果内存扫描器在 ring-0 中运行或具有特定的提升权限,则您的进程中无法阻止该访问。


实际上,普通用户进程通常也可以访问具有相同用户/完整性级别的其他进程的内存。 - SamB

-1

C#修饰符对内存可寻址性没有影响-处理器和操作系统架构控制其。


1
如果是这样的话,那会相当有趣。如果不是这样的话,那就非常令人屈辱和粗鲁了。 - Rex M
有趣的是,你的Gravatar没有展示出你那长满胡须的优越感。事实上,看起来你根本就没有胡子!这让我怀疑你的自夸中是否隐藏了什么... - user1228

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接