我的同事经常告诉我,如果我们将任何东西声明为“public”,那么它是危险的,因为任何程序都可以访问该内存,解决方案是使用“private”访问修饰符。
我想知道这是否真的正确。
我的同事经常告诉我,如果我们将任何东西声明为“public”,那么它是危险的,因为任何程序都可以访问该内存,解决方案是使用“private”访问修饰符。
我想知道这是否真的正确。
事实上,那并不是真的。
访问修饰符只是为了帮助组织您的代码。它们只保护代码,就像您将玻璃杯放在猫够不到的地方以防止被打翻一样。
public
和 private
访问修饰符只与这些结构(类、方法或变量)对同一应用程序中的其他类的可见性有关。进程和用户之间的内存保护由操作系统强制执行。在 Windows 的情况下,它确保非管理员级别(和系统环)的进程/线程无法访问未明确共享(如共享内存)的内存,并具有开放权限。实际上,Windows 允许进程向特定区域的内存授予非常特定的权限,但这不是 C# 语言定义中提供的。您需要访问系统 API 来控制授予对特定内存块的访问权限;默认情况下,所有内存块都受操作系统保护。
现在,如果内存扫描器在 ring-0 中运行或具有特定的提升权限,则您的进程中无法阻止该访问。
C#修饰符对内存可寻址性没有影响-处理器和操作系统架构控制其。