C#學習筆記-面向物件基礎-繼承
阿新 • • 發佈:2018-12-10
名稱空間
namespace
解決類的重名問題。可以看做的是類的“資料夾”。
如果名稱空間缺失,可以選中類,用快捷鍵 alt+shift+F10,可以匯入名稱空間。
在一個專案中引用另一個專案的類
- 新增引用
- 引用名稱空間
值型別與引用型別
區別
- 值型別與引用型別在記憶體上儲存的地方不一樣
- 傳遞方式不一樣。值型別我們稱之為值傳遞,引用型別我們稱之為引用傳遞。
值型別:int,double,bool,char,decimal,struct,enum
引用型別:string,自定義類,陣列 - 儲存:值型別的值是儲存在記憶體的棧中,引用型別是儲存在堆中。
字串
字串的不可變性
當程式結束的時候,GC掃描整個記憶體,只要發現某塊區域沒有任何指向,這塊區域會被釋放掉。我們可以將字串看做是char型別的一個只讀陣列。不能被重新賦值。
stringbuilder
相比於string,對stringbuilder操作的時候,並不會一直新建記憶體,所以涉及到字串改變的時候,可以用stringbuilder。
StringBuilder sb = new StringBuilder();
string str = null;
//建立了一個計時器,用來記錄
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100000; i++)
{
sb.Append(i);
}
sw.Stop();
Console.WriteLine(sw.Elapsed);
Console.ReadKey();
字串的一些方法
- Length:獲得當前字串中字元的個數;
- ToUpper():將字串轉換成大寫型別;
- ToLower():將字串轉換成小寫型別;
- Equals():比較兩個字串;
- Split():分割字串,返貨字串型別的陣列;
- substring():擷取字串。在擷取的時候包含要擷取的那個位置;
- Indexof():判斷某個字串在字串中第一個出現的位置,如果沒有返回-1,
- LastIndexof():判斷某個字串在字串中最後一次出現的位置;
- startwith():判斷以……開始;
- endwith():判斷以……結束;
- Replace():將字串中某個字串替換成一個新的字串;
- contains():判斷某個字串是否包含指定的字串
- trim():去掉字串中前後的空格
- trimend():去掉字串中結尾的空格
- trimstart():去掉字串中前面的空格
- string.isNullorempty():判斷一個字串是否為空或者為Null
- string.join():將陣列按照指定的字串連線,返回一個字串
- new string(char[] chs)
如何將字元陣列轉換成字串?
用string.join()的方法;
//接收使用者輸入的字串,將其中的字元以與其輸入相反的順序輸出。例如“abc"->"cba"
Console.WriteLine("請輸入字串:");
string str = Console.ReadLine();
char[] c = str.ToArray();
c = c.Reverse().ToArray();
str = string.Join("", c);
Console.WriteLine(str);
Console.ReadKey();·
如何讀取一行一行讀取文字文件?
//文字檔案中儲存了多個文章標題、作者,標題和作者之間,用若干空格(數量不定)隔開,每行一個,標題有的長,有的短
//輸出到控制檯的時候最多標題長度10,如果超過10,則擷取長度9的字串並且最後新增“……”,加一個豎線後輸出作者名字
int counter = 0;
string line;
//read the file and display it line by line
System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\lones\Desktop\C#Practise\第10天 繼承\書名與作者.txt", Encoding.Default);
string[] str = new string[2];
int index;
while ((line = file.ReadLine()) != null)
{
str = line.Split(' ');
str[0] = str[0].Replace('《', ' ').Trim();
str[0] = str[0].Replace('》', ' ').Trim();
str[0]=str[0].Length > 10 ? str[0].Substring(0, 8) + "……" : str[0];
Console.WriteLine(string.Join("|", str));
counter++;
}
file.Close();
Console.WriteLine("There are {0} lines.", counter);
//suspend the screen
Console.ReadLine();
繼承
我們可能會在一些類中,寫一些重複的成員,我們可以將這些重複的成員單獨地封裝到一個父類(基類),其他類作為這個類的子類(派生類)。
子類繼承了父類,子類從父類中繼承了什麼?
首先:繼承了父類的屬性和方法,但是沒有繼承父類的私有欄位;
子類並不繼承父類的建構函式。但是子類會預設呼叫父類無引數的建構函式,建立父類物件,讓子類可以使用父類中的成員。
如果在父類中重寫一個有引數的建構函式之後,無引數的建構函式就被幹掉了。子類調用不了。
解決辦法:
- 在父類中重寫一個無引數的建構函式
- 在子類中顯示的呼叫父類的建構函式,也是我們比較常用的。用關鍵詞base
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
public Person(string name,int age,char gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
public void CHLSS()
{
Console.WriteLine("我是人,我會吃喝拉撒睡");
}
}
//如何繼承建構函式?
public class Student : Person
{
private int _id;
public int ID
{
get { return _id; }
set { _id = value; }
}
public Student(string name,int age,char gender,int id):base(name,age,gender)
{
this.ID = id;
}
繼承的特性
- 繼承的單根性
- 繼承的傳遞性
new 關鍵字
- 建立物件
- 隱藏從父類那裡繼承過來的同名成員,隱藏的後果就是呼叫不到父類的成員
里氏轉換
- 子類可以賦值給父類
- 如果父類中裝的是子類物件,那麼父類可以強轉成子類
- is: 表示型別轉換,如果轉換成功,返回true,如果轉換失敗,返回false
Person p = new Student();
if(p is Teacher)
{
Student s = (Student)(p);
s.StudentSayHello();
}
else
{
Console.WriteLine("轉換不成功!");
}
Console.ReadKey();
- as:表示型別轉換,如果能轉換成功,則返回那個物件,如果不能轉換,則返回Null;
訪問修飾符protected
Arraylist 與 Hashtable
Var-推斷型別
C#:強型別語言,在程式碼中對每個變數的型別必須要有一個明確的定義;
var:根據值可以推斷型別。問題是:隱式變數必須初始化。用的時候必須賦值。
- 裝箱:
- 開箱:
Path 類
File類
File類的基本方法
編碼
將字串以怎樣的形式儲存在二進位制
亂碼產生的原因,儲存這個檔案所用的編碼與開啟這個檔案採用的編碼方式不一樣。
- ASC 128
- ASCII 256
- GB2312 簡體字
- Big5 繁體字
- UNICODE 解析起來慢
- UTF-8 web