在c#String类中,它们隐藏了字符串类中所有方法的详细信息。例如," ToLower"方法实现如下。
/// <summary>
/// Returns a copy of this string converted to lowercase.
/// </summary>
///
/// <returns>
/// A string in lowercase.
/// </returns>
/// <filterpriority>1</filterpriority><PermissionSet><IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode"/></PermissionSet>
[__DynamicallyInvokable]
public string ToLower();
我怎么能这样做到我自己的班级?并从班级用户隐藏我的实施细节。
答案 0 :(得分:6)
您对情况的评估不正确。
我假设您在选择String.ToLower()
时在Visual Studio中按 F12 (“转到定义”)。这 not 总是显示所选符号的源代码 - 它只显示您系统上可用的源代码 - 否则它会根据可用元数据显示包含类型的大纲(即.NET程序集文件中声明的公共类型信息:非本机.NET .dll
和.exe
文件。
令人困惑的是,如果你使用RedGate Reflector或其他CIL反汇编工具查看其他一些String
方法,那么你会看到这个,没有任何源代码反汇编:
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
private extern String ReplaceInternal(Char oldChar, Char newChar);
这一部分:MethodImplOptions.InternalCall
意味着没有CIL实现,而是在CLR内部实现(可能是在一些高性能C ++或x86汇编代码中)。但是,这不适用于ToLower()
,它实际上具有CIL实现(但它最终会调用TextInfo.InternalChangeCaseString
,这也是InternalCall
)。
关于你自己的意见:
这称为封装。
不,这不是封装。对{OOP}消费者Encapsulation in OOP refers to how a class has been designed to hide implementation details(例如System.Collections.Generic.List<T>
如何不显示其内部T[]
缓冲区)。这无关with obfuscating program source code。
现在我的问题是我怎样才能对自己的班级做到这一点?
你不能。
当然,如果您不分发程序的源代码,那么Visual Studio中同时按 F12 的其他用户同样会看到与您相同的结果:只是课程大纲 - 但没有什么可以阻止某人使用像Reflector这样的工具来拆解它,而CIL混淆(使用像Dotfuscator这样的工具)只是为了保护你的代码。