1、命名空間
主要用來解決類重名問題。
如何在一個項目中引用另一個項目中的類
1)、在VS解決方案欄中項目下的引用右鍵添加引用;
2)、在要引用其他類的CS文件中使用using引用其命名空間;
2、值類型和引用類型
區別:
1)、值類型和引用類型在內存上存儲的地方不一樣;
2)、在傳遞值類型和傳遞引用類型的時候,傳遞的方式不一樣,值類型的傳遞稱爲值傳遞,引用類型的傳遞稱爲引用傳遞。
值類型:int、double、bool、char、decimal、struct、enum。
引用類型:string、數組、自定義類。
值類型存儲在內存的棧中。
引用類型存儲在內存的堆中。
3、字符串的不可變性
1)、當給一個字符串重新賦值之後,老值並沒有銷燬,而是重新再內存中開闢一塊空間用來存儲新的值。因此每次對字符串進行操作都會產生一塊垃圾內存,爲了解決這個問題就可以利用StringBuilder,當對字符串進行重複操作時,StringBuilder不會開闢新的內存,而只是操作同一塊內存。
StringBuilder sb=new StringBuilder();
string str=null;
for(int i=0;i<1000000;i++)
{
//str+=i; //直接對str進行操作效率很低
sb.Append(i);//利用StringBuilder會快很多
}
//最終還是要把StringBuilder轉換成string
str=sb.ToString();
2)、可以將string看做char類型的只讀數組,因此可以通過下標訪問字符串中的某一個元素。
string s="abcdefg";
//s[0]就表示的a,只能讀取,不能對s[0]=b進行賦值
//ToCharArray將string轉換成char[]
char[] chs=s.ToCharArray();
chs[0]=b;
//再將字符數組轉換成string
s=new string(chs);
3)、字符串的方法
- Length:屬性,得到字符串的長度
- ToUpper():將字符串轉換爲大寫
- ToLower();將字符串轉換爲小寫
- Equals();比較兩個字符串,通過參數可以選擇不區分大小寫
- split():分割字符串
string s="a b c - - , , . . * e + g =f";
char[] chs={' ','-',',','.','*','+','='};
string[] str=s.split(chs,StringSplitOptions.RemoveEmptyEntries);
把字符串中chs[]中的字符全部去掉
- Replace():字符轉換
string s="你是中國人";
if(s.Contains("中國"))
{
s=s.Replace("中國","**");
}
把字符串中的中國用**替換
- SubString():截取字符串
string s="abcdefg";
string s1=s.SubString(1);
string s2=s.SubString(1,2);
- Startwith():判斷字符串是以什麼開頭,返回的是布爾值
string s="abcdefg";
bool b=s.Startwith("ab");
//此時的b是TRUE
- Endwith():同上相反的意思
- Indexof():返回int,字符串中字符出現的位置
- LastIndexof();字符串中字符最後出現的位置
- Trim();移除字符串前後的空字符
- TrimEnd()和TrimStart():只移除前面或後面的空字符
- IsNullOrEmpty():判斷字符串是否爲Null或爲空
- Join();用特定符號分割數組或元素
string[] names={"張三","李四","王五","趙六"};
string str=string.Join("|",names);
//或者
string str=string.Join("|","張三","李四","王五","趙六");
和上面一樣的效果,因爲Join的第二個參數是params可變參數
4、C#中計算程序運行時間
StopWatch sw=new StopWatch();
sw.Start();//開始計時
.....
sw.Stop();//停止計時
console.writeline(sw.Elapsed);//輸出總時間
5、類的繼承
類的繼承兩個特性
1)、單根性:C#只支持單繼承,不支持多繼承,一次只能繼承一個類
2)、傳遞性:父類的父類的成員會一直傳遞到子類,並且會沿着繼承的路線一直傳遞下去。
任何類都可以從另一個類那裏繼承,自定義的類沒有寫繼承,默認的都是繼承自Object類,Object類是所有類的基類。
繼承的時候,父類的public以及protected成員可以被子類訪問,但是父類的private成員不能被子類訪問。
父類的成員可以是虛擬的,成員由派生類重寫,父類本身也可以是抽象類,抽象類不能直接實例化,而必須由派生類來實例化。
注:子類沒有繼承父類的構造函數,但是子類會默認調用父類的無參構造函數用來創建父類的對此昂,所以如果在父類中重新寫了一個有參數的構造函數,這個時候無參構造函數就會去覆蓋,解決辦法:
1)、在父類中重新寫一個無參數的構造函數;
2)、在子類中顯示地調用父類的構造函數,用關鍵字——:base(父類有參構造函數的參數);
6、關鍵字的new隱藏父類成員
如果在子類中有和父類命名一樣的方法,則子類會覆蓋父類的方法,有時候我們需要顯示地表示要把父類的某個方法隱藏,這個時候可以使用關鍵字new,直接在父類方法的返回值前面加上關鍵字new即可。