Time of Update: 2018-12-08
深入理解實值型別和參考型別,這是.NET開發人員取得長期成功的關鍵,下面從記憶體布局角度詳細給大家說明一下實值型別和參考型別: 實值型別的記憶體結構: 參考型別的記憶體結構: 參考型別的執行個體比實值型別的執行個體多了兩個附加的欄位,SyncBlockIndex和RTTI(運行時類型資訊)指標,指向一個方法表結構,所以描述為 MethodTablePtr和TypeObjectPtr都是可以的,〈CLR Via
Time of Update: 2018-12-08
看到這個標題大家可能又會說了,這個異常“地球人”都知道,你試圖除以0的時候就會產生這個異常,實在沒有討論的必要啊!實際上這個異常,還是有很多值得注意的地方的,下面用幾個例子來說明問題!1, int i = 5; int j = i/ 0;
Time of Update: 2018-12-08
由於最近比較忙,好久沒有來這裡寫東西了,以後會常常來這裡記錄一些自己的心得和體會的。看到標題可能很多人也會比較疑惑,認為這個根本沒有必要討論,而且認為這個問題也比較無聊。實際上我也是今天才注意到這個問題的,不知道大家想過這個問題沒有?我一開始遇到這個問題是一個初學編程的同行提出的,他的想法是借口類型似乎應該繼承於System.Object,畢竟System.Object是所有.NET中所有類型的根類型。實際上仔細考慮一下以上看法就占不住腳
Time of Update: 2018-12-08
擷取中文字串的Unicode值的方法實際上比較簡單,中文字元最多佔兩個位元組,知道了這個就好辦了,只要用GetBytes方法取出位元組序列,分兩個位元組分別處理就可以了! public string CharacterToCoding(string input){ string coding = ""; for (int i = 0; i<character.Length; i++ ) { byte[] bytes =
Time of Update: 2018-12-08
ASP.NET.2.0 調試時總是出現第一次調試的頁面,不顯示修改後的頁面一般這類問題是由於IE的緩衝功能引起的,可以檢查是否關閉了IE的緩衝功能(如果你使用IE瀏覽器調試的話)。開啟一個IE,然後選擇工具-->Internet選項-->"瀏覽歷程記錄"-->"檢查所存網頁的較新版本",選中“每次訪問網頁時”。然後關閉IE,從新啟用調試。這樣應該就可以解決,如果不行,重新整理一下應該就可以了。
Time of Update: 2018-12-08
什麼是循環參考呢?舉個例子更容易說明這個問題: class Program { static void Main(string[] args) { B b = new B(); } } public class A { public B b=new B(); } public class B { public A a=new A();
Time of Update: 2018-12-08
有時我們可以需要拼接數組,下面介紹拼接數組的幾種方法:1,使用數組的CopyTo方法:int[] array1 = new int[2];int[] array2 = new int[5];int[] result = new int[array1.Length + array2.Length];array1.CopyTo(result, 0);array2.CopyTo(result, array1.Length);2,和上面的方法類似,可以使用Array類的靜態Copy方法:int[]
Time of Update: 2018-12-08
我在使用Visual_Studio_2005_Professional編程語句時字型太小了;我想改一下字型;可是當我打看工具_選項_顏色字型時;報了一個錯;我點了“是”;過後我修改字型時不管我怎樣修改,編程的字型都沒有變化。附:我剛安裝的Visual_Studio_2005_Professional軟體!!工具-》選項-》選擇“文字編輯器”-》使用預設值-》確定-》然後重新關閉再啟動Visual Studio-》再修改字型看看能不能生效。 如果以上操作不好使,可以嘗試重設Visual
Time of Update: 2018-12-08
大家可能經常會遇到在表單間傳遞某些資料的功能要求,這裡介紹給大家一種方法:在子表單中自訂一個建構函式,參數類型是主表單,當要顯示子表單的時候,就用這個建構函式來執行個體化子表單,然後把this指標傳進去,說起來太抽象了,我大概一寫大家應該就明白了: public class frmMain:Form { ... frmControl controlForm=new frmControl(this); controlForm.Show();
Time of Update: 2018-12-08
在用Reflector載入mscorlib.dll後,看到System.Object類中的Finalize方法是用override修飾的.Object是根類,顯然不可能重寫其他方法,這裡應該是反編譯工具產生的結果不正確,我們來驗證這一點:大家都知道,為了減輕開發人員的負擔,C#中為Finalize方法的定義提供了特殊的文法,用這個文法來定義Finalize方法,編譯器可以自動產生合適的異常處理的代碼,並調用基類的Finalize方法!
Time of Update: 2018-12-08
有時大家在儲存圖象的時候會發生這樣的錯誤:“GDI+發生一般性錯誤”,這樣的錯誤一般可以這樣重現:Image image = new Bitmap(openFileDialog1 .FileName );image.Save(openFileDialog1 .FileName ,System .Drawing .Imaging .ImageFormat .Jpeg );發生這個錯誤的原因是:從一個檔案構造的Bitmap 對象或一個 Image 對象, 在該對象的生存期內該檔案處於鎖定狀態。
Time of Update: 2018-12-08
類的靜態建構函式也叫類型構造器,靜態構造器,他調用的時刻由CLR來控制:CLR會選擇如下時間之一來調用靜態建構函式: 1,在類型的第一個執行個體建立之前,或類型的非繼承欄位或成員第一次訪問之前。這裡的“之前”,代表前後銜接的意思。這裡的時刻是精確的! 2,在非繼承的靜態欄位或成員第一次訪問之前的某個時刻,具體時刻不定! 由於調用的時刻不確定,所以我們最好不要編寫依賴於特定的靜態建構函式的執行順序的代碼,這樣很容易產生不可預料的後果!
Time of Update: 2018-12-08
重寫GetHashCode()方法必須遵循如下三條規則: 1,如果兩個對象相等,它們必須產生相同的散列碼 2,對於任意對象o,o.GetHashCode()必須是一個執行個體不變式,也就是說無論在o上調用什麼方法,o.GetHashCode()必須返回同樣的值。 3,散列函數應該在所有整數中產生一個隨機的分布,這樣才能獲得效率的提升 下面我說說GetHashCode()方法的預設實現: 對於參考型別來說,他們的GetHashCode實現是直接繼承了Object.GetHashCode()的實
Time of Update: 2018-12-08
大家都知道用lock關鍵字指定的鎖定對象必須是參考型別,如果我們這樣寫: class Program { static void Main(string[] args) { B b = new B(); lock (b) //error { } } } struct B { }
Time of Update: 2018-12-08
一般定義常數欄位使用const關鍵字,但是從某種意義上,readonly欄位也屬於常數欄位,但是他的要求比const要“寬鬆”些。下面分別說說這兩種關鍵字定義的常數欄位:1,const關鍵字定義的常數欄位: const定義的常數欄位只能在聲明欄位的地方進行初始化,初始化後就不能修改了: 而且,如果是const欄位的類型是參考型別,那麼只能用null對參考型別的常量進行初始化 public class Test { public const
Time of Update: 2018-12-08
如果一個實值型別沒有重載==運算子,是無法直接使用==來進行實值型別的執行個體和null的判等比較的,這個是顯而易見的,預設情況下實值型別都沒有重載==運算子:A a;if(a==null) //struct A{ public int x;}但是,是否重載了==就可以把實值型別的執行個體和null做判等比較了呢?現在,我們來看一個更加能說明問題的Demo: using System;namespace StructOperatorDemo{ class Program
Time of Update: 2018-12-08
可能有很多人感覺ListView預設的列頭的背景太單調,缺乏個性,想變的列頭的背景色!實際上可以使用ListViewDrawColumnHeader事件自己畫背景色,注意僅當 OwnerDraw 屬性設定為 true 且 View 屬性設定為 View. Details 時才引發此事件!不多說了,大家看代碼,過程很簡單:private void listView1_DrawColumnHeader(object sender,
Time of Update: 2018-12-08
這個問題是我在MSDN中文技術論壇中遇到的,現象十分詭異,仔細的研究了一下原始碼,現在分享給大家,大家先看一段Demo: FileStream fs = new FileStream(@"D:\aa.jpg", FileMode.Open, FileAccess.Read); Image image = Image.FromStream(fs); image.Tag = "txtbmp";
Time of Update: 2018-12-08
一些初學者常常會對Console.Read()方法產生一些誤解!具體是什麼誤解呢?我們先看一段代碼: static void Main(string[] args) { int i1 = 123; Console.WriteLine(d1); Console.Read(); int i2 = 456; Console.WriteLine(_i2); Console.Read(); //這裡並沒有阻塞程式的運行 Console.WriteLine("abc"); Console.
Time of Update: 2018-12-08
1,Assembly.Load() 這個方法通過程式集的長名稱(包括程式集名,版本資訊,語言文化,公開金鑰標記)來載入程式集的,會載入此程式集引用的其他程式集,一般情況下都應該優先使用 這個方法,他的執行效率比LoadFrom要高很多,而且不會造成重複載入的問題(原因在第2點上說明) 使用這個方法的時候, CLR會應用一定的策略來尋找程式集,實際上CLR按如下的順序來定位程式集: ⑴如果程式集有強式名稱,在首先在全域程式集緩(GAC)中尋找程式集。