本文將介紹以下內容:
1. 引言
上回[第八回:品味型別---值型別與引用型別(上)-記憶體有理
]的發布,受到大家的不少關注,我們從記憶體的角度了解了值型別和引用型別的所以然,留下的任務當然是如何應用型別的不同特點在系統設計、效能優化等方面發揮其作用。因此,本回是對上回有力的補充,同時應朋友的希望,我們盡力從記憶體除錯的角度來著眼一些設計的分析,這樣就有助於對這一主題進行透徹和全面的理解,當然這也是下一回的重點。
2. 通用規則與比較
通用有規則:
簡單的說是由於string的immutable特性,因此每次對string的改變都會在託管堆中產生乙個新的string變數,上述string作為引數傳遞時,實際上執行了s=s操作,在託管堆中會產生乙個新的空間,並執行資料拷貝,所以才有了類似於按值傳遞的結果。但是根據我們的記憶體分析可知,string在本質上還是乙個引用型別,在引數傳遞時發生的還是按址傳遞,不過由於其特殊的恆定特性,在函式內部新建了乙個string物件並完成初始化,但是函式外部取不到這個變化的結果,因此對外表現的特性就類似於按值傳遞。至於string型別的特殊性解釋,我推薦artech
的大作《深入理解string和如何高效地使用string
》。另外,string型別過載了==操作符,在型別比較是比較的是實際的字串,而不是引用位址,因此有以下的執行結果:
string astring = "123";
string bstring = "123";
console.writeline((astring == bstring));
//顯示為true,等價於astring.equals(bstring);
string cstring = bstring;
cstring = "456";
console.writeline((bstring == cstring));
//顯示為false,等價於bstring.equals(cstring);
public
struct mystructtester
public
class isvaluetype_test
belongs to value type.", astruct.tostring()); }
} }
mystruct atest;
console.writeline(atest.x);
char a = 'c';
char b = 'c';
console.writeline((a.equals(b)));
//會返回true;
比較出真知:
3. 對症下藥-應用場合與注意事項
現在,在記憶體機制了解和通用規則熟悉的基礎上,我們就可以很好的總結出值型別和引用型別在系統設計時,如何作出選擇?當然我們的重點是告訴你,如何去選擇使用值型別,因為引用型別才是.net的主體,不必花太多的關照就可以贏得市場。
3.1 值型別的應用場合
3.2 引用型別的應用場合
4. 再論型別判等
型別的比較通常有equals()、referenceequals()和==/!=三種常見的方法,其中核心的方法是equals。我們知道equals是system.object提供的虛方法,用於比較兩個物件是否指向相同的引用位址,.net framework的很多態別都實現了對equals方法的重寫,例如值型別的「始祖」system.valuetype就過載了equal方法,以實現對例項資料的判等。因此,型別的判等也要從重寫或者過載equals等不同的情況具體分析,對值型別和引用型別判等,這三個方法各有區別,應多加注意。
4.1 值型別判等
4.2 引用型別判等
public
virtual
bool equals(
object obj);
public
static
bool equals(
object obja,
object objb);
一種是虛方法,預設為引用位址比較;而靜態方法,如果obja是與objb相同的例項,或者如果兩者均為空引用,或者如果obja.equals(objb)返回true,則為true;否則為false。.net的大部分類都重寫了equals方法,因此判等的返回值要根據具體的重寫情況決定。
有必要在自定義的型別中,實現對equals和==的重寫或者過載,以提高效能和針對性分析。
5. 再論型別轉換
型別轉換是引起系統異常乙個重要的因素之一,因此在有必要在這個主題裡做以簡單的總結,我們不力求照顧全面,但是追去提綱挈領。常見的型別轉換包括:
(type)(變數、表示式)
static 訪問修飾操作符 轉換修飾操作符
operator 型別(引數列表);
public student
//其中,所有的轉換都必須是static的。
6.結論
現在,我們從幾個角度延伸了上回對值型別和引用型別的分析,正如本文開頭所言,對型別的把握還有很多可以挖掘的要點,但是以偏求全的辦法我認為還是可取的,尤其是在技術探求的過程中,力求面面俱到的做法並不是好事。以上的幾個角度,我認為是對值型別和引用型別把握的必經之路,否則在實際的系統開發中常常會在細小的地方栽跟頭,摸不著頭腦。
品味型別,我們以應用為要點撬開值型別和引用型別的規矩與方圓。
演算法題 水杯倒水的問題
之前好像在看到這樣的題目 1.有3個容器,各是20公升,13公升,7公升,形狀不同也不透明。一開始20公升的容器裡面裝了20公升水,反正倒來倒去最後要讓20公升和13公升容器各裝了10公升水 2.2個外形不同的瓶子,各裝800毫公升水,另外還有1個300毫公升的杯子 現在有4個人,不限制喝的次數,想...
3水杯倒水問題
問題 給出三個杯子的容量abc 其中剛開始時c杯是滿的,ab是空的。現在在保證不會有漏水的情況下進行如下操作 將乙個杯子x的水倒到另乙個杯子y中,如果x空了或者y滿了就停止 滿足其中乙個條件才停下 現問c中水量有多少種可能性 a,b,c為非負整數 解法1 數論,擴充套件歐幾里得 待補充解法2 模擬倒...
廣度優先搜尋 水杯倒水問題
三個水杯 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入 第...