2017-04-23 119 views
-3

在c#的String類中,它們隱藏了字符串類中所有方法的細節。例如,「ToLower」方法實現如下所示。C#隱藏方法實現代碼

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

這就是所謂的封裝。 現在我的問題是我怎麼能這樣做也爲我自己的類?

預先感謝您。

+8

「這叫做封裝」---它不是。 – zerkms

回答

6

您對情況的評估不正確。

我假設您在選擇了String.ToLower()的情況下,在Visual Studio中按了F12(「轉到定義」)。 而不是總是顯示所選符號的源代碼 - 如果源代碼在您的系統上可用,它將只顯示源代碼 - 否則顯示基於可用元數據的包含類型的大綱(即公共類型信息在.NET程序集文件中聲明:非本地.NET .dll.exe文件)。

麻將:混雜的東西,如果你看一下使用展鵬反射器或其他CIL反彙編工具,那麼你會看到這樣一些其他String方法,沒有任何來源拆解:

[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical] 
private extern String ReplaceInternal(Char oldChar, Char newChar); 

這一部分:MethodImplOptions.InternalCall意味着有沒有CIL實現,而是在CLR內部實現(大概是在一些高性能的C++或x86彙編代碼中)。但是,這不適用於實際上具有CIL實現的ToLower()(但它最終調用到TextInfo.InternalChangeCaseString也是InternalCall)。

關於自己的評論:

這就是所謂的封裝。

不,這不是封裝。 Encapsulation in OOP refers to how a class has been designed to hide implementation details到OOP消費者(例如System.Collections.Generic.List<T>如何不顯示其內部T[]緩衝區)。這是無關的with obfuscating program source code

現在我的問題是,我怎麼能這樣做,也爲我自己的班?

你不行。

當然,如果您不分發程序的源代碼,然後在Visual Studio中的其他用戶誰也按F12同樣會看到相同的結果你:剛纔類輪廓 - 但沒有什麼可以阻止有人使用Reflector等工具對其進行反彙編,並使用CIL混淆處理(使用Dotfuscator之類的工具)只能保護您的代碼。

+0

這甚至不是混淆。它只是寫一個頭文件,只顯示沒有定義的聲明。 (除了這不是C#中的東西。) –

+0

謝謝你,謝謝大家。我知道明白答案,我想我已經以令人困惑的方式提出了這個問題。 再次感謝您 –