C#語言與面向對象技術

C#語言

  1. 數據類型
    列舉:
    分類一
  • 簡單數據類型:byte(無符號8位整型)、short(16)、int(32)、long(64)、float(32)、double(64)、char(16)、bool
  • 組合數據類型:struct(結構體),enum(枚舉類型),class。
    分類二:(作爲參數傳遞時,傳遞拷貝,還是傳遞地址)
  • 值類型:簡單數據類型,struct類型enum類型
  • 引用類型:class類型,數組(數組名)(包括字符串)。
    注意:
    只有引用型的變量的變量可以賦值爲null,值類型不可以,null是引用類型的默認值
    對於C#語言中的string類型,其實是引用傳遞,但是作爲函數的參數使用時,相當於是值傳遞。若在函數中進行更改的話實際上是生成了另一個字符串。
string a = "aaa"; //==> a----->new String("aaa") 
string b = a; //==> b----->a, 傳引用 
b = "bbb"; //==> b----->new String("bbb"), 傳引用,b指向了一個新的字符串,a並沒有變。

如果確實要傳地址,那就要加ref或out關鍵字,ref與out的區別在於被傳遞的變量是否存在物理地址,簡單理解是否需要初始化
如果是引用類型,那麼聲明一個實例應該是

string s=new string();

然後再給s賦值,而實際上並不需要這麼做。
參考:https://blog.csdn.net/lishimin1012/article/details/8687539
2. 常量
常量是固定值,程序執行期間不會改變。常量可以是任何基本數據類型,比如整數常量、浮點常量、字符常量或者字符串常量,還有枚舉常量,常量可以被當作常規的變量,只是它們的值在定義後不能被修改。
常量的定義:
const 數據類型 變量名=常量值
==readonly ==
const 在聲明的時候就要初始化。不用實例化,直接加點就可以使用
readonly 既可以在聲明中也可以在構造函數中初始化。必須要實例化之後纔可以使用,實例化後的類名加點使用。
(1)常量聲明之後不允許進行改變其值
(2)常量命名全部使用大寫字母/帕斯卡命名
3. 關於static
https://www.cnblogs.com/whzhouqun/p/4669837.html
在C#main函數裏調用的其他函數,必須都是靜態的,因爲main函數就是靜態的。
4. 運算符與表達式與C++相同。
5. 典型的語句
switch語句語法結構:
注意每一種情況都要跟一個break
foreach 語句
foreach(元素類型 元素 in 元素集合)
{
語句序列//通常用於遍歷每個元素。
}

foreach (System.Windows.Forms.Control control in this.Controls)
            {
                if (control is System.Windows.Forms.TextBox)
                {
                    if (String.IsNullOrEmpty(control.Text.Trim()))
                    {
                        MessageBox.Show("請補全學生信息!", "系統提示", MessageBoxButtons.OK);
                        return;
                    }
                }
            }

try……catch……finally語句
try
{
語句序列;
}
catch(Exception)
{
語句序列;
}
finally
{
語句序列;//不管有沒有發生異常,都會執行。
}

            Console.WriteLine("請輸入一個整數!");
            string temp = Console.ReadLine();
            try
            {
                int i = int.Parse(temp);//強制轉換
                for (int j = 0; j < i; j++)
                {
                    Console.WriteLine("*");
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("錯誤原因爲:" + e.Message);
            }
            finally
            {
                Console.WriteLine("結束!");
            }

在這裏插入圖片描述break、continue語句
break語句:跳出最近的一層循環或者switch語句
continue語句:將控制權傳遞給所在封閉循環的下一次迭代(會執行i++)。
單行註釋://;
多行註釋:/*,*/

面向對象技術

對象,類,封裝,繼承,多態,屬性,索引器,泛型,接口。

對象

通過類聲明的變量,實例化的例子稱之爲一個對象。
對於非靜態類,實例化是爲對象分配存儲空間的過程。Class 子類名=new Class()

封裝

定義:把類的內部隱藏起來,防止外部看到內部的實現過程。
方法:限制修飾符(private,protected,public,internal)
對類中的數據和操作的限制修飾符

  • private:只允許類的內部訪問
  • protected:只允許類的內部和子類訪問
  • public:類的內部和外部都能訪問
  • internal:在同一程序集內可以訪問,相當於public。internal關鍵字總結
    對類的限制修飾符
  • public:都可以使用
  • internal:在同一程序集下可以使用。
    在類圖中,-:private,+:public,#:protected。

繼承

  • 定義:子類擁有父類的某些數據和操作的過程。
  • 方法:
    public class Child(子類名) : Parent(父類名) {……}
    :表示繼承。
  • C#只支持單繼承。
  • 利用sealed關鍵字可以防止所聲明的類被繼承。public sealed class Name
  • 對於父類中的某些數據和操作:
    在這裏插入圖片描述
    表格語句的上一行必須是空行,否則表格不生效
在父類中 public protected private internal
在子類中 public protected 無法繼承 internal
  • 子類訪問父類的成員
    利用base關鍵字。
    子類訪問父類,且父類構造函數不帶參數
  • 通過類圖顯示
    用指向父類的箭頭。
  • 實例化問題
    子類可以實例化父類,但是父類不能實例化子類。所以對象的類型一定是子類,當子類實例化父類時,若子類和父類有重名方法,執行執行的是父類中的方法,若要執行子類的方法,必須要把這個對象強制轉換爲子類類型。轉換方法:
    在這裏插入圖片描述

多態

  1. 定義:相同的操作,對於不同的對象,可以有不同的解釋,產生不同的執行效果。
  2. 分類:
  • 運行時多態:在運行時決定執行哪個類的哪個方法(override複寫)
  • 編譯時多態:在編譯時決定執行類中的哪個方法(overload重載)
  1. 實現:
    運行時多態:
    (1)在父類中定義並實現虛方法(virtual關鍵字)
    (2)在子類中覆寫(override)該虛方法
    (3)虛方法必須有方法體
    (4)覆寫虛方法,要求方法名,形參,返回值類型必須相同
    在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述
    編譯,生成,調試,運行的概念

編譯時多態(在編譯時根據參數列表決定執行哪個方法):

  • 操作符的重載:operator關鍵字 public static 返回值類型 operator 運算符(形參列表){}
  • 方法的重載(常用於構造函數):必須有相同的方法名,不同的參數列表,可以有相同的返回值類型。
  1. 抽象類和抽象方法
    抽象方法:可以看作是沒有實現體的虛方法(abstract),即只有方法的聲明,需要在子類中覆寫(override)該方法。必須覆寫
    抽象類:含有抽象方法的類。抽象類不可以直接實例化對象
    在這裏插入圖片描述
    public abstract class Animal
    {
        public int Age;
        public double Wetght;
        public abstract void Eat();
        public abstract void Sleep();
    }
    public class Bird : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("Bird Eat!");
        }

        public override void Sleep()
        {
            Console.WriteLine("Bird Sleep!");
        }
        public void Fly()
        {
            Console.WriteLine("Bird Fly!");
        }
    }
    public class Dog : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("Dog Eat!");
        }

        public override void Sleep()
        {
            Console.WriteLine("Dog Sleep!");
        }
        public void Run()
        {
            Console.WriteLine("Dog Run!");
        }
    }
    public class Fish : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("Fish Eat!");
        }

        public override void Sleep()
        {
            Console.WriteLine("Fish Sleep!");
        }
        public void Swim()
        {
            Console.WriteLine("Fish Swim!");
        }
    }
    public class Raiser
    {
        public void Raise(Animal al)
        {
            al.Eat();
            al.Sleep();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Raiser rsr = new Raiser();
            rsr.Raise(new Dog());
            rsr.Raise(new Bird());
            rsr.Raise(new Fish());
        }   
    }    

屬性

C#在聲明data時就可以定義set、get方法

  • get:定義讀取操作
  • set:定義賦值操作,value表示傳入的值。

索引器

定義:是集合類中的一種特殊屬性,可使得集合類中的元素像數組元素一樣訪問。
在這裏插入圖片描述

接口

  1. 定義:
  • 接口是類設計的藍圖,只提供聲明而沒有實現。
  • 接口不可以直接實例化對象。
  • C#允許一個類實現多個接口(C#只允許單繼承)
  • 接口就是包含一系列不被實現的方法,而把這些方法的實現交給繼承它的類。
  1. 表示:
    Interface表示接口,一般接口以大寫字母I開頭。
    在這裏插入圖片描述
  2. 接口與抽象類(作用效果上常常可以相互代替)
    相同點:接口和抽象類都不可以直接實例化對象。
    不同點:
  • 抽象類中的數據和操作(方法)必須有限制修飾符,而接口中的數據和操作不可以有限制修飾符
  • 抽象類中可以有帶實現體的方法(非abstract方法),而接口只能有方法的聲明。
  • 抽象類在子類中通過override關鍵字覆寫抽象方法,而接口被子類直接實現。
    方法一:
    public interface IHighWayWorker
    {
        void Build();
        void HighWayOperation();
    }
    public interface IRailWayWorker
    {
        void Build();
        void RailWayOperation();
    }
    public class Worker : IHighWayWorker, IRailWayWorker
    {
        public void Build()
        {
            Console.WriteLine("HighWay,RailWay Build!");
        }

        public void HighWayOperation()
        {
            Console.WriteLine("HighWayOperation");
        }

        public void RailWayOperation()
        {
            Console.WriteLine("RailWayOperation");
        }
    }
        static void Main(string[] args)
        {
            Worker wr = new Worker();
            wr.Build();
            IRailWayWorker rwr = new Worker();
            rwr.Build();
            rwr.RailWayOperation();
            IHighWayWorker hwr = new Worker();
            hwr.Build();
            hwr.HighWayOperation();
        }   
HighWay,RailWay Build!
HighWay,RailWay Build!
RailWayOperation
HighWay,RailWay Build!
HighWayOperation        

方法二:

    public class Worker : IHighWayWorker, IRailWayWorker
    {
        void IHighWayWorker.Build()//此時不能加限制修飾符
        {
            Console.WriteLine("HighWay Build!");
        }
        void IRailWayWorker.Build()//此時不能加限制修飾符
        {
            Console.WriteLine("RailWay Build!");
        }

        public void HighWayOperation()
        {
            Console.WriteLine("HighWayOperation");
        }

        public void RailWayOperation()
        {
            Console.WriteLine("RailWayOperation");
        }
    }

泛型

在使用Object類(可包含任意數據類型)來代替一個具體的數據類型(int,string等)時,有可能因爲用戶的輸入不當發生類型安全問題,對於這類類型安全問題,編譯時可以通過,但是運行時就會發生問題。
定義:參數化類型。在編譯時用一個具體的類型代替該參數類型,可定義類型安全的類而不影響工作效率。
注意:在使用泛型T時,要注意接口IComparable<T>的實現。
例如:

    public interface IQueque<T>where T:IComparable<T>
    {
        int Length { get; }//不寫限制修飾符
        T QuequeFront { get; }
        void Clear();
        void DeQueque();
        void EnQueque(T data);
        bool IsEmpty();
    }

類與類之間的關係

  1. 依賴關係:類中方法的實現需要以另一個類作爲參數。
    表示:在類圖中用虛線表示。
  2. 繼承關係
    表示:空心三角形加實線表示。
  3. 關聯關係:一個類以另一個類作爲數據(Data)
    表示:用實線箭頭表示。
  4. 實現關係:接口的實現
    表示:空心三角形+虛線。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章