C#語言簡介
C#是微軟旗下寫的一種類JAVA的編程語言(面向對象),它是專門爲與Microsoft的.NET Framework 一起使用而設計的,它是一種基於現代面向對象設計方法的語言
C#各類應用程序簡介
Windows Forms(Old):
用於創建Windows桌面應用程序,Windows Forms窗體包含的只是封裝了原生的Windows控件,所以是基於像素圖形的。
WPF(Windows Presentation Foundation):
WPF與Windows Forms一樣用於創建Windows桌面應用程序,但是它是一種基於矢量圖的新技術
ASP.NET Web Forms(Old):
這是ASP.NET的最初形式,僅僅提供web窗體,其目標是按照Windows應用程序開發人員編寫應用程序的方式輕鬆地創建Web應用程序,是不必編寫HTML和JavaScript的。
ASP.NET MVC(Model-View-Controller):
前端頁面HTML和JavaScript的重要性變強,相應地,ASP.NET中出現了新的框架,不只方便編寫了HTML和JavaScript,還基於流行的MVC模式提供了代碼的分離,從而更便於進行單元測試,這個框架就是ASP,NET MVC。
WCF(Windows Communication Foundation):
WCF是一種功能豐富的技術,是一種連接各種系統的強大的新方式,提供了多種通信選項,既可以使用基於REST的通信,也可以使用基於SOAP的通信。
Windows Store Application:
Windows Store應用程序將重點放在內容上,只提供用戶與內容交互所需的任務,而不是提供他們可以使用的不同選項。Windows8的設計就是基於這樣的思路。
C#的類與名稱空間
名稱空間是.NET避免類名衝突的一種方式,相當於java中的packedge一樣,比如在多個packedge中都有bag這個類,此時因爲有不同包名的存在,所以這個bag類就不會存在衝突,C#中的namespace也是這個意思。
類、對象、類成員簡介
類的三大成員:屬性(Property)、方法(Method)、事件(Event)
面向對象的C#
C#默認訪問權限
- 在namespace中的類、接口默認是internal類型的,也可以顯示的定義爲public類型,不允許是其他訪問類型
- 在一個類中,屬性和方法默認是private的,也可以顯示的定義爲public、private、protected、internal、protected internal
- 接口中不能定義成員變量,接口中的方法默認爲public的訪問權限
- 抽象類中必須有一個以上的抽象方法,抽象方法可以是public、internal、protected。不能是private的訪問類型。
public可以被任意存取
protected只可以被本類和其繼承子類存取
internal只可以被本組合體內所有的類存取
protected internal 只可以被本組合體內所有的類和這些類的繼承子類所存取
private只可以被本類所存取。
繼承:子類可以繼承父類的屬性和方法
重寫:(virtual - override)
多態:當我們用一個父類的變量引用一個子類的實例時,調用一個被重寫的成員時,我們總是能夠調用到被繼承類鏈上的最新的版本
一個結合抽象類和接口以及繼承關係的例子:
using System;
using System.Collections.Generic;
using System.Text;
namespace Helloworld
{
interface VehicleBase
{
void Stop();
void run();
}
abstract class Vehicle : VehicleBase
{
public void Stop()
{
Console.WriteLine("stopped");
}
abstract public void run();
}
class Car : Vehicle
{
public override void run()
{
Console.WriteLine("car is running");
}
}
class Truck : Vehicle
{
public override void run()
{
Console.WriteLine("Truck is running");
}
}
}
抽象類接口總結:
具體類->抽象類->接口:越來越抽象,內部實現的東西越來越少;
抽象類是未完全實現邏輯的類,抽象類爲複用而生,專門作爲基類來使用,也具有解耦功能
接口是完全未實現邏輯的“類“(”純虛類“,只有函數成員,且成員全部public(隱藏)),接口爲解耦而生,方便單元測試
接口和抽象類都不能實例化,只能用來聲明變量,引用具體類的實例。
接口(解耦依賴原則):
接口的解耦特性體現在,當我們構建一個類並且調用它時,如果這個類被調用時內部發生錯誤,那麼此時我們需要去修改這個類,但是根據面向對象的封裝原則,即當我們寫好一個類以後,這個類就要儘可能的避免修改,所以這裏引入接口這個概念,在接口中定義好抽象的類,我們寫好實際的類去實現這個接口,當調用這個類出現錯誤時,我們就不用再去找到這個錯誤類的內部去修改,此時便完成了解耦。
接口隔離原則,接口單一職責原則:接口不可以有太多無關的方法,換句話說,接口必須有功能性,指定職責的功能。需要分離大接口,把本質不同的功能給隔離開。
小例子:
using System;
namespace interfaceExample
{
class Program
{
static void Main(string[] args)
{
var driver = new Driver(new lightTank());
driver.drive();
}
}
class Driver
{
private Ivehicle _ivehicle;
public Driver(Ivehicle ivehicle)
{
_ivehicle = ivehicle;
}
public void drive()
{
_ivehicle.run();
}
}
interface Ivehicle {
void run();
}
class car : Ivehicle
{
public void run()
{
Console.WriteLine("car is running");
}
}
class Truck : Ivehicle
{
public void run()
{
Console.WriteLine("Truck is running");
}
}
interface Iweapon
{
void fire();
}
interface itank : Ivehicle, Iweapon
{
}
class lightTank : itank
{
public void fire()
{
Console.WriteLine("fire...");
}
public void run()
{
Console.WriteLine("tank is running");
}
}
}
上述例子在構建坦克時,因爲坦克擁有fire和run兩個功能,如下兩圖所示,第一張圖是違反了接口單一原則的,而第二張則對其進行了優化,上述代碼爲第二張圖的陳述。
此外當類實現接口時,有一種顯示實現接口的方式,
一般情況下創建warmkiller時,這時是看不到kill方法的,需要自己構建ikiller對象,
IKiller killer = new WarmKiller();
Killer.kill();
如上所示,否則這個kill方法是無法被查看到的