1. 程式人生 > >C#學習筆記-面向物件基礎-繼承

C#學習筆記-面向物件基礎-繼承

名稱空間

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();

字串的一些方法

  1. Length:獲得當前字串中字元的個數;
  2. ToUpper():將字串轉換成大寫型別;
  3. ToLower():將字串轉換成小寫型別;
  4. Equals():比較兩個字串;
  5. Split():分割字串,返貨字串型別的陣列;
  6. substring():擷取字串。在擷取的時候包含要擷取的那個位置;
  7. Indexof():判斷某個字串在字串中第一個出現的位置,如果沒有返回-1,
  8. LastIndexof():判斷某個字串在字串中最後一次出現的位置;
  9. startwith():判斷以……開始;
  10. endwith():判斷以……結束;
  11. Replace():將字串中某個字串替換成一個新的字串;
  12. contains():判斷某個字串是否包含指定的字串
  13. trim():去掉字串中前後的空格
  14. trimend():去掉字串中結尾的空格
  15. trimstart():去掉字串中前面的空格
  16. string.isNullorempty():判斷一個字串是否為空或者為Null
  17. string.join():將陣列按照指定的字串連線,返回一個字串
  18. 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