Time of Update: 2018-12-07
.NET中特性的索取就是圍繞著ICustomAttributeProvider介面(System.Reflection命名空間內),而MethodInfo類的ReturnTypeCustomAttributes屬性直接返回方法傳回值的ICustomAttributeProvider介面對象。同時MethodBase的ReturnParameter屬性返回方法傳回值資訊(ParameterInfo),而ParameterInfo也是繼承ICustomAttributeProvider的,所以這兩個
Time of Update: 2018-12-07
在前一篇文章:.NET(C#):RSA的SignHash和VerifyHash,我講到使用RSA的SignHash和VerifyHash可以同樣做到SignData和VerifyData,事實上還有一種方法進行公開金鑰加密的簽名認證。就是.NET中的AsymmetricSignatureFormatter和AsymmetricSignatureDeformatter。直接翻譯就是“不對稱式加密簽名格式化器和反格式化器”。分明用來進行建立簽名和驗證簽名的。 他們都需要操作一個不對稱式加密類型(即公
Time of Update: 2018-12-07
程式示範:進入程式,首先得輸入最大容量,比如輸入10: 接下來生產線產生了,最初當然只有0個項目,我們現在開始生產5個項目,在“生產數量”中輸入5,如: 然後點擊“生產”,5個項目就被生產了: 接下來我們再生產12個項目,加上之前的5個項目,此時一共會生產17個項目,但是總容量是10,所以會有7個生產項目要等待(線程阻塞): 接著再去生產10個項目,此時已經有7個生產項目在等待狀態,後續的生產項目需求會疊加: 現在的情況是:有10個項目已經被生產,還有17個項目等待被生產,下面我們消費5個項目,
Time of Update: 2018-12-07
何為“流文本”?
Time of Update: 2018-12-07
關於參考型別,虛方法的調用比較直接簡單,直接看這個類:class a{ public virtual void doo() { }}class b : a{ public override void doo() { base.doo(); }} 非常簡單,b繼承a,改寫a的doo方法,並且又調用基類a的doo方法。看b的doo方法的IL:.method public hidebysig virtual instance void doo() cil
Time of Update: 2018-12-07
我們都知道用HashAlgorithm.ComputeHash方法可以計算資料的雜湊值。不過System.Security.Cryptography.HashAlgorithm類是繼承ICryptoTransform介面的,那麼,通過CryptoStream(或者直接操作ICryptoTransform)也是可以計算雜湊值的。 ICryptoTransform的輸入資料就是需要計算雜湊值的來源資料,不過ICryptoTransform的輸出資料和輸入資料是一樣的,真正的雜湊值存在HashAlgo
Time of Update: 2018-12-07
RSACryptoServiceProvider和DSACryptoServiceProvider的建構函式都可以指定一個CspParameters結構體。利用這個CspParameters結構體我們可以自訂不對稱式加密演算法的密鑰CSP本機存放區名稱(就是密鑰容器:KeyContainer),這個容器預設是儲存在Windows使用者設定檔中的。如果你想把金鑰儲存區在電腦範圍內(而不是使用者範圍),可以用RSACryptoServiceProvider(或者DSACryptoServicePro
Time of Update: 2018-12-07
跟電腦打交道難免經常需要輸出一個位元組數組。這篇文章就講講怎樣輸出一個位元組數組在.NET下的各種方法: 最快捷方法:string BitConverter.ToString(byte[])方法。(有重載支援位元組數組的部分輸出) 代碼:Console.WriteLine(BitConverter.ToString(new byte[] { 1, 3, 54, 123, 199, 200, 215, 255
Time of Update: 2018-12-07
AppDomain的Load方法有諸多重載,但是沒有一個等效於LoadFrom(這裡是指Assembly的LoadFrom)。其AssemblyName和string參數都是針對Load(string參數是指程式及名稱的全名而不是路徑)。而byte[]參數相當於LoadFile。 AppDomain.ExecuteAssembly可以傳入檔案路徑,但是從名字上可以看出來這裡只針對可執行檔程式集。(AppDomain還有ExecuteAssemblyByName可以傳入AssemblyName,即
Time of Update: 2018-12-07
以GetCursorPos做樣本,它返回當前滑鼠指標在螢幕的位置(以一個POINT結構體)。關於GetCursorPos和POINT的定義可以參考MSDN:http://msdn.microsoft.com/en-us/library/ms648390(v=vs.85).aspxhttp://msdn.microsoft.com/en-us/library/dd162805(v=vs.85).aspx 首先實現用自訂C#結構體來調用GetCursorPos,一切看著很簡單。定義一個記憶體分別連續
Time of Update: 2018-12-07
嘗試用3種.NET方法寫出下面的C/C++指標作業碼。注意所有.NET方法均不直接引用外部函數資源(DllImport),都是使用.NET中原生態提供的方法。注意:所有代碼輸出僅代表在32位和Little-Endian的CPU環境的運行結果。 來看這一段典型的C/C++指標作業碼:/***************************** C/C++ 代碼****************************/int i = 0xAA00FF;//i的記憶體儲存形式:FF 00 AA
Time of Update: 2018-12-07
其實.NET中的訊號量(Semaphore)是作業系統維持的一個整數。當整數位0時。其他線程無法進入。當整數大於0時,線程可以進入。每當一個線程進入,整數-1,線程退出後整數+1。整數不能超過訊號量的最大請求數。訊號量在初始化的時候可以指定這個整數的初始值。 System.Threading.Semaphore類的建構函式的兩個參數第一個就是訊號量的內部整數初始值,也就是初始請求數,第二個參數就是最大請求數。如果沒有額外操作訊號量的話,訊號量的運行限制就取決於這個初始請求數,比如下面代碼://+
Time of Update: 2018-12-07
一個動態對象竟然支援自己調用自己,根據MSDN的解釋,此項功能僅在C#中被支援,VB並不可以。具體過程則是改寫動態對象(DynamicObject類)的TryInvoke方法。和普通函數調用的TryInvokeMember方法類似。TryInvoke的第一個參數是Binder:InvokeBinder。但是和TryInvokeMember的InvokeMemberBinder不一樣,它沒有Name屬性,因為對象自己調用自己自然沒有方法名稱。其他屬性不需要多說明,CallInfo代表調用資訊。Re
Time of Update: 2018-12-07
PLINQ的運行結果是無序的,也就是不保持原來集合的順序來操作(當然除了一些專門的排序操作)。原因則是線程的並發執行本來就充滿了不確定性,把原來一個任務分割成好幾個部分同時進行返回的結果會打亂原來的順序,如果要強制保留順序,肯定要浪費一些效能,PLINQ是可以這樣的,但預設不這樣。 先看一個LINQ樣本:var arr = new int[] { 1, 2, 3, 4, 5 };var res = arr.Where(i => i != 3);結果是:1, 2, 4,
Time of Update: 2018-12-07
考慮這樣一個問題,一個類型執行一個介面的方法,這個方法沒有修飾virtual,那麼這個類型的子類還可以修改這個介面的執行方法嗎?答案是永遠可以,並且無論介面是顯示執行還是隱式執行,總是可以改寫的。 來看下面代碼,一個介面,一個父類,一個子類,子類繼續執行父類已經執行的介面方法定義。interface IA{ void doo();} class A : IA{ public void doo() { Console.WriteLine("A"); }} //
Time of Update: 2018-12-07
第一點需要提的就是第一個await發生異常後,後續的await不會進行,但是注意此時的Task仍然會進行的,當然後面的Task如果拋出異常的話,異常則屬於未覺察異常,這個未覺察異常在.NET 4.0會在記憶體回收時引發程式崩潰,但在.NET 4.5 beta後不會引發進程崩潰。更多相關資訊可以參(.NET
Time of Update: 2018-12-07
XmlReader預設是讀取XML檔案中的Whitespace和注釋的。 比如這個XML:<root> <!-- root中 --> <file> <file.attr>hidden</file.attr> a.txt </file></root> XmlReader讀取代碼://data.xml代表上面的XML檔案using (var xr =
Time of Update: 2018-12-07
非泛型類:Hashtable 從.NET Framework 1.0就有的方法1. 直接構建Hashtable類利用的建構函式:public Hashtable(IHashCodeProvider hcp, IComparer comparer); 構建方法:Hashtable hashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default,
Time of Update: 2018-12-07
這些應該算是.NET程式員的基本功吧,可是我今天用的時候卻有點猶豫,最後看筆記才又明白……罪過罪過 就是這三個函數的用法//Type類的函數class Type bool IsInstanceOfType(object); //判斷對象是否是指定類型 //類型可以是父類,介面 //用法:父類.IsInstanceOfType(子類對象) bool IsAssignableFrom(Type) //判斷兩個類型的關係 //類型可以是父類,介面 //
Time of Update: 2018-12-07
今天發現軟體中一個很奇怪Bug,究其原因是沒有正確理解“等號和異常”的問題,來看下面這段代碼:static void Main(string[] args){ int[] arr = new int[3]; int i = 0; try { arr[i++] = doo(); } catch { } Console.WriteLine(i);} static int doo(){ throw new