如何隐藏方法实现细节

时间:2017-04-23 09:19:19

标签: c# oop

在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();

我怎么能这样做到我自己的班级?并从班级用户隐藏我的实施细节。

1 个答案:

答案 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这样的工具)只是为了保护你的代码。