C#學習筆記(四)

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即可。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章