C#基礎筆記(第十三天)

来源:http://www.cnblogs.com/VSMinos/archive/2017/10/16/7677085.html
-Advertisement-
Play Games

1.複習泛型集合List<T>Dictionary<Tkey,Tvalue>裝箱和拆箱裝箱:把值類型轉換為引用類型拆箱:把引用類型轉換為值類型 我們應該儘量避免在代碼中發生裝箱或者拆箱文件流FileStream StreamReader和StreamWriter多態:虛方法、抽象類、介面虛方法:抽象 ...


1.複習
泛型集合
List<T>
Dictionary<Tkey,Tvalue>
裝箱和拆箱
裝箱:把值類型轉換為引用類型
拆箱:把引用類型轉換為值類型
我們應該儘量避免在代碼中發生裝箱或者拆箱
文件流
FileStream StreamReader和StreamWriter
多態:虛方法、抽象類、介面
虛方法:
抽象類:

集合:空間名Collections.Generic
List<int> list=new List<int>();
和ArrayList集合的區別:確定了元素的類型,在使用集合的時候不會放生裝箱和拆箱
Dictionary<int,string> dic=new Dictionary<int,string>(); 鍵值對集合
dic.Add(1,"張三"); 添加相同的鍵用這種方式會拋異常
dic[2]="李四" 添加相同的鍵用這種方式會覆蓋原來鍵的值
辨定鍵值對集合用foreach迴圈
foreach(var item in collection)
{

}
foreach(KeyValuePair<int,string> kv in dic)
{
console.writeline("{0}------{1}",kv.key,kv.value);
}
console.readkey();

文件流
File FileStream 操作位元組的 StreamReader StreamWriter 操作字元的
文本和數據最好放在相對路徑下(debug內)
代碼要寫在using()裡面,因為它的資源不會自動的釋放,必須我們自己手動釋放,寫在using裡面可以幫我們自動的回收資源。
using (FileStream fsRead = new FileStream("zucema.txt", FileMode.OpenOrCreate, FileAccess.Read))
{
byte[] buffer = new byte[1024 * 1024 * 5];
//本次讀取實際讀取到的位元組數
int r=fsRead.Read(buffer, 0, buffer.Length);
//將位元組數組中的每個元素按照我們制定的編碼格式解析成字元串
string s=Encoding.Default.GetString(buffer, 0, r);
Console.WriteLine(s);
}
Console.ReadKey();
如果是大數據的話,必須迴圈的去讀

寫入
using (FileStream fsWrite = new FileStream(@"C:\Users\SJD\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
string s = "ABC";
byte[] buffer = Encoding.UTF8.GetBytes(s);
fsWrite.Write(buffer, 0, buffer.Length);
}
Console.WriteLine("寫入成功");
Console.ReadKey();
覆蓋時是按位元組去覆蓋
要用追加的話,把FileMode.OpenOrCreate改成FileMode.Append就是追加了。

多態
讓一個對象表現出多種狀態,類型
寫多態的好處
1、減少代碼
2、屏蔽各個子類之間的差異,寫出通用的代碼,適用於每個子類的代碼

虛方法和抽象類

聲明父類去指定子類對象
虛方法經典例子:木鴨子會叫,橡皮鴨子會叫,真鴨子會叫,只不過他們叫的方式不一樣,真鴨子是父類,有意義,需要實例化
後面用的比較多的就是抽象類

2.C#中的訪問修飾符
public: 公開的公共的
private: 私有的,只能在當前類的內部訪問
protected: 受保護的,只能在當前類的內部以及該類的子類中訪問
internal: 只能在當前項目中訪問,在同一個項目中,internal和public的許可權是一樣的。
同一個項目中,Internal的許可權要大於protected。但是一旦跨了項目,protected的許可權要大於internal
protected internal:protected+internal的許可權

1)、能夠修飾類的訪問修飾符只有兩個:public internal
預設不手動加Public修飾符的類,那它預設就是Internal修飾

2)、可訪問性不一致。
子類的訪問許可權不能高於父類的訪問許可權,會暴露父類的成員。
因為繼承的傳遞性,子類能使用父類的成員,但父類許可權寫低就是為了不被別的項目訪問到成員。

3.設計模式
設計是這個項目的一種方式
23種設計模式
設計模式是幫我們解決在日常開發中的問題。

4.簡單工廠設計模式

5.值類型和引用類型
值類型:int、double、char、decimal、bool、enum、struct 存棧
引用類型:string 、數組、自定義類、集合、object、介面 存堆

值傳遞和引用傳遞
值類型在複製的時候,傳遞的是這個值的本身
引用類型在複製的時候,傳遞的是堆這個對象的引用

6.序列化和反序列化
序列化:就是將對象轉換為二進位
反序列化:就是將二進位轉換為對象
作用:傳輸數據。
在網路中傳輸數據,只有二進位這個形態是可以被傳輸的
序列化:
1)、將這個類標記為可以被序列化的。
在類上方標記一個[Serializable],只有被它標記的對象才能序列化

例:序列化
//要將p這個對象傳輸給對方電腦
Person p = new Person();
p.Name = "張三";
p.Age = 19;
p.Gender = '男';
using (FileStream fsWrite = new FileStream(@"C:\Users\SJD\Desktop\p.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
//序列化對象
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fsWrite, p);
}
Console.WriteLine("序列化成功");
Console.ReadKey();

反序列化
//接收對方發送過來的二進位 反序列化成對象
Person p;
using (FileStream fsRead=new FileStream(@"C:\Users\SJD\Desktop\p.txt",FileMode.Open,FileAccess.Read))
{
BinaryFormatter bf = new BinaryFormatter();
//object強制轉換為person
p=(Person)bf.Deserialize(fsRead);
}
Console.WriteLine(p.Name);
Console.WriteLine(p.Age);
Console.WriteLine(p.Gender);
Console.ReadKey();

7.partial部分類
三個人一起同時做一個項目,每個人都要開發一個person類。不能你寫我就不能寫
在每個類前面加個partial,表示部分類
public partial class Person
{
}
public partial class Person
{
}
表示這兩個類共同組成person類,可以同時寫。
還有個好處,不論公有還是私有,都可以相互讀取
部分類裡面不能有同樣的方法,但可以用重載,相當一個類寫在不同的地方

8.sealed密封類
sealed用來標記一個類是密封類
public sealed class Person
特征:密封類是不能夠被其他類繼承的,但是可以繼承於其它類

9.重寫ToString方法
Person p=new Person();
console.writeline(p.tostring());
console.readkey();
印表機出來的會是這個對象的命名空間。

****為什麼所有類型都可以ToString?
因為所有的類型的父類都是Object
object裡面提供的一些方法,子類都可以調用
tostring 都可以調用
ToString是object的虛方法
所以所有的對象所有的變數都可以調用ToString

10.介面
繼承的特性是單根性,一個子類只允許有一個父類
一個子類想要繼承2個父類,可以寫成介面
聲明介面的關鍵字是interface
英語中I開頭 able結尾都是表示有能力

介面就是一個規範、能力
只有符合這個規範才能生存
能力:能夠實在某一個功能。

介面的語法和特征
格式:
[public] interface I..able
{
成員;
}

Public interface IFlayable
{
void Fly();
String Test();
}
1.可以有返回值,使用string等。
2.介面中的成員不允許添加訪問修飾符,預設就是Public
3.介面成員不能有定義,不允許寫具有方法體的函數
4.介面不能存數據(欄位),存數據用類去存
5.可以寫沒有方法體的方法(自動屬性)
6.方法、自動屬性

為什麼叫自動屬性
雖然我們不寫欄位,但是在進行編譯的時候會自動給我們生成一個私有的欄位
要限定它只能有構造函數
public int Age
{
get;
set;
}

自動屬性本質上還是兩個函數,一個叫get一個叫set

介面中一般就放方法和屬性(本質上只有方法)

介面中不添加訪問修飾符,預設就是public
類中不添加訪問修飾符,預設就是private
例:
生產筆記本的廠商,不管你是什麼廠家。最後都要做出USB介面。可以插滑鼠鍵盤。都要符合USB的規範。各個廠家都要按照規範來。也有特殊的,比如蘋果,沒有網線口。手機也在趨向一個規範。
***什麼時候會用到介面?
1、類需要多繼承的時候

****介面是一種規範。
只要一個類繼承了一個介面,這個類就必須實現這個介面中所有的成員

為了多態。
介面不能被實例化。
也就是說,介面不能new(不能創建對象)

 

 

介面中的成員不能加“訪問修飾符”,介面中的成員訪問修飾符為public,不能修改。


(預設為public)
介面中的成員不能有任何實現(“光說不做”,只是定義了一組未實現的成員,和抽象類一樣,只是繼承他們的子類去做)。

 

介面中只能有方法、屬性、索引器、事件,不能有“欄位”和構造函數。

介面與介面之間可以繼承,並且可以多繼承。

介面並不能去繼承一個類,而類可以繼承介面 (介面只能繼承於介面,而類既可以繼承介面,也可以繼承類)


實現介面的子類必須實現該介面的全部成員。


一個類可以同時繼承一個類並實現多個介面,如果一個子類同時繼承了父類A,並實現了介面IA,那麼語法上A必須寫在IA的前面。


class MyClass:A,IA{},因為類是單繼承的。


顯示實現介面的目的:解決方法的重名問題
什麼時候顯示的去實現介面:
當繼承的介面中的方法和參數一摸一樣的時候,要是用顯示的實現介面

 

當一個抽象類實現介面的時候,需要子類去實現介面。


面向對象(介面)編程

11.顯示實現介面
顯示實現介面就是為瞭解決方法的重名問題

例:
public class Bird:IFlyable
{
public void Fly()
{
Console.WriteLine("鳥會飛");
}
void IFlyable.Fly()
{
Console.WriteLine("我是介面的飛");
}
}

IFlyable fly=new Bird();
fly.Fly();//調用的是介面的Fly

Bird bird=new Bird();
bird.Fly();//這樣才是調用自己的Fly

12.總結
//什麼時候用虛方法來實現多態?
//什麼時候用抽象類來實現多態?
//什麼時候用介面來實現多態?

在我提供給你的幾個類當中,如果說你能抽象出來一個父類,並且這個父類必須寫上這幾個子類共有的方法,然後你還不知道怎麼去寫這個方法,就用抽象類來寫這個多態。
反之,抽象出來的父類,方法可以寫,並且我還要創建這個父類的對象,就用虛方法。
這幾個類裡面根本就找不出來父類,但它們都有一個共同的行為,共同的能力。這個時候就用介面來實現多態(比喻:鳥類和飛機沒有什麼父類,但是都會飛,沒辦法寫個父類讓它去繼承)

真的鴨子會游泳,木頭鴨子不會游泳,橡皮鴨子會游泳
沒辦法提取一個父類 會游泳,因為木頭鴨子不會游泳,沒辦法用虛方法
沒辦法寫抽象方法,因為真的鴨子需要被創建對象,真鴨子是有意義的。
所以介面是最合適的


13.超市收銀系統
Guid能幫我們產生一個全世界獨一無二的編號。//不會重覆
Guid.NewGuid() 可以ToString()


//用父類來做集合,屏蔽差異,但是不好找,所有的貨物都混合到一起了。
//List<ProductFather> list = new List<ProductFather>();
//存儲貨物、集合去存(因為會增加貨物)
//List<SumSung> listSum = new List<SumSung>();
//List<Acer> listAcer = new List<Acer>();
//List<JiangYou> listJiangYou = new List<JiangYou>();
//List<Banana> listBanana = new List<Banana>();
List<List<ProductFather>> list = new List<List<ProductFather>>();
我在一個集合裡面又放一個集合
list<>裡面的內容應該是這個集合的類型
List<ProductFather> list2 = new List<ProductFather>();
兩者區別:
給list2添加數據的時候,可以直接把貨物對象添加進來,比如三星,手機,筆記本,醬油,可以直接扔在這個集合裡面。
缺點就是取的時候很麻煩。存進去了,不知道哪個下標是誰,得通過調試去看。看這個下標對應的數據是哪個對象,很麻煩

於是我們用2個集合,2個集合什麼意思
給list添加數據的時候
list.Add() 添加一個集合進去。其實這個集合就是貨架
給他添加數據,添加的並不是商品,而是貨架
不管list還是List2都代表整個倉庫

用list2添加倉庫就是把這個數據拿回來直接扔進去倉庫了。
list是添加一個數組的集合進來,給這倉庫添加一個數據的集合,而倉庫的貨物都集中到貨架
貨架就是一個貨物的集合(貨架都是放貨物的),添加貨架,有四個貨架,所以添加四個元素進來。

List<List<父類>>list=new List<List<父類>>();
list[0]=貨架
商品的父類什麼類型都可以往裡放
給倉庫添加貨物,其實是給list[0],list[1],list[2]....
通過這個方式可以直接拿到這個貨物所在的貨架

在倉庫中,除了商品還有貨架也是集合
以上只創建出了倉庫,還沒有貨架

什麼時候創建貨架?
在創建CangKu對象的時候,向倉庫添加貨架

例:
//用父類來做集合,屏蔽差異,但是不好找,所有的貨物都混合到一起了。
//List<ProductFather> list = new List<ProductFather>();
//存儲貨物、集合去存(因為會增加貨物)
//List<SumSung> listSum = new List<SumSung>();
//List<Acer> listAcer = new List<Acer>();
//List<JiangYou> listJiangYou = new List<JiangYou>();
//List<Banana> listBanana = new List<Banana>();
List<List<ProductFather>> list = new List<List<ProductFather>>();
//list[0]存儲Acer電腦
//list[1]存儲三星手機
//list[2]存儲醬油
//list[3]存儲香蕉
/// <summary>
/// 在倉庫中創建對象的時候,向倉庫中添加貨架
/// </summary>
public CangKu()
{
//list.Add(new List<ProductFather>());
//list.Add(new List<ProductFather>());
//list.Add(new List<ProductFather>());
//list.Add(new List<ProductFather>());
//使用父類就可以屏蔽各個貨架的差異
//貨架很多就用for迴圈
for (int i = 0; i < 4; i++)
{
list.Add(new List<ProductFather>());
}
}
/// <summary>
/// 進貨
/// </summary>
/// <param name="strType">貨物的類型</param>
/// <param name="count">貨物的數量</param>
public void GetPros(string strType,int count)
{
//貨物很多,一次加不完,通過for迴圈去加
for (int i = 0; i < count; i++)
{
//strType貨物類型有四種可能,所以對它做一個多條件的判斷
switch(strType)
{
case "Acer":list[0].Add(new Acer(Guid.NewGuid().ToString(), 1000, "巨集基筆記本"));
break;
case "SumSung":list[1].Add(new SumSung(Guid.NewGuid().ToString(), 2000, "棒子手機"));
break;
case "JiangYou":list[2].Add(new JiangYou(Guid.NewGuid().ToString(), 10, "老抽醬油"));
break;
case "Banana":list[3].Add(new Banana(Guid.NewGuid().ToString(), 50, "大香蕉"));
break;
}


}


提取貨物的方法
/// <summary>
/// 從倉庫中提取貨物
/// </summary>
/// <param name="strType"></param>
/// <param name="count"></param>
/// <returns></returns>
//返回一個父類集合或數組
public ProductFather[] QuPros(string strType, int count)
{
//提貨物放到數組裡面去返回
ProductFather[] pros = new ProductFather[count];
//進貨是一個一個往裡放,取貨也是一個一個往外取
for (int i = 0; i < count; i++)
{
switch(strType)
{
//貨架上那第一個[0],拿走後,第二個就頂上來變成第一個[0]
//這隻是一個賦值操作,貨架上的數目並沒有發生改變
//list[0]是巨集基筆記本的那個貨架,list[0][0]是貨架上第一個筆記本,拿完之後放在pros數組裡
case "Acer":
//判斷貨架是不是空的
if(list[0].Count == 0)
{
break;
}
pros[i] = list[0][0];
//移除第一個,拿一個刪一個
list[0].RemoveAt(0);
break;
case "SumSung":
if(list[1].Count==0)
{
break;
}
pros[i] = list[1][0];
list[1].RemoveAt(0);
break;
case "JiangYou":
if(list[2].Count==0)
{
break;
}
pros[i] = list[2][0];
list[2].RemoveAt(0);
break;
case "Banana":
if(list[3].Count==0)
{
break;
}
pros[i] = list[3][0];
list[3].RemoveAt(0);
break;
}
//把集合返回

}
return pros;
}

還需要一個展示貨物的方法


13.總結
值傳遞和引用傳遞 值傳遞傳遞的是值的本身
引用傳遞傳遞的是對對象的引用
ref:將值傳遞改變為引用傳遞(不一定對)
介面 介面的語法特點
顯示實現介面
什麼時候使用介面?
部分類(partial)
密封類(sealed)
序列化和反序列化 目的:傳輸數據
簡單工廠設計模式
訪問修飾符 5個訪問修飾符


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們可能經常會用到 Thread.Sleep 函數來使線程掛起一段時間。那麼你有沒有正確的理解這個函數的用法呢?思考下麵這兩個問題: 假設現在是 2017-4-7 12:00:00.000,如果我調用一下 Thread.Sleep(1000) ,在 2017-4-7 12:00:01.000 的時候 ...
  • richtextbox插入回車,開始是這樣寫的,在win7下運行時沒有問題: MyMessageBox.CaretPosition.InsertLineBreak(); MyMessageBox.CaretPosition = MyMessageBox.CaretPosition.GetNextIn ...
  • 一、前言 C# 簡潔、類型安全的面向對象的語言。 .NET是一種在windows平臺上編程的架構——一種API。 C#是一種從頭開始設計的用於.NET的語言,他可以利用.NET Framework及其開發環境中的所有新增功能,面向對象的編程方法。 組件對象模型 COM Component Objec ...
  • 使用郵箱驗證修改密碼,在這裡我是使用163免費郵進行測試 前臺代碼 後臺代碼 ...
  • 前面我們針對 SVG 的解析和繪製做了介紹,SVG 是圖片的一種形式,而另一種很重要的圖片是:點陣圖,包括 png、jpeg、bmp 等格式。點陣圖的基本規則是,組成的基本元素是像素點,由寬度 * 高度個像素組成,每個像素存儲了一個點的顏色和位置信息,顏色信息可以是 ARGB、RGBA、BGR 或 YU ...
  • http://www.cnblogs.com/fengxuehuanlin/p/5631664.html 關於xml是屬於一個比較重要的東西,在平時開發的過程中,這塊內容最主要的是要掌握XML內容的讀取和寫入操作。 xml可作為小型資料庫用來存儲數據。 html主要用來顯示數據,XAML前臺設計。 ...
  • 方法過濾器 使用 和註解屬性 實現 使用方式 1. 自定義方法過濾器 可分別定義方法 執行前過濾器 , 方法 執行結束過濾器 , 方法 異常過濾器 執行前過濾器繼承 抽象類, 實現 抽象方法, 參數 為運行時攔截方法的參數列表 /// /// 自定義執行前過濾器 /// public class C ...
  • 一些文章: 反射插件插件 http://bbs.csdn.net/topics/391950257?page=1 反射窗體 http://www.sufeinet.com/thread-2984-1-1.html http://www.cnblogs.com/mumupudding/p/460740 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...