前言:學習C#編程應該有幾個月了,作為一個菜鳥,沒有資格來評論什麼。只有對自己所學進行一個總結,可能有不嚴謹的地方,萬望諒解。
一·深入.NET框架
.NET框架(.NET Framework),他是開發.NET應用程序的核心基礎。
.NET框架的體系結構
支持C#、VB、.NET、c++、等語言的開發,也就是我們所說的跨語言開發。
.NET框架具有兩個主要組件:CLR和FCL。(CLR是Common Language Runtime即公共語言進行時;FCL是Framework Class Library即框架類庫)
.NET框架核心類庫及其功能
類和對象
類定義了一組概念模型,而對象是真實的實體。
set訪問器只寫;get訪問器只讀。
在vs中自動屬性prop+雙擊Tab鍵
封裝
1.保證數據的安全性。
2.提供清晰的對外接口
3.類內部可以任意修改,不影響其他類。
類圖
二.深入C#數據類型
值類型應用類型
值類型包括基本數據類型,和枚舉類型,結構體等。
引用類型包括string 數組,類和接口。
結構體:
可以有字段,可以有方法。
定義時字段不能被賦初值。
不用new。聲明結構對象後必須給結構成員賦初值。
拆箱和裝箱
示例:
int a=1;
object o=i;//裝箱
int j=(int)o;//拆箱
值傳遞和引用傳遞
引用類型作為參數時:
1、在修改變量本身時,結果類似於值傳遞,即不會改變傳遞前的變量的值
2、在修改變量的屬性或字段時,才是引用傳遞,會影響到傳遞前的變量的值
3、參數使用了ref後,才是真正的引用傳遞,不管修改變量本身還是修改變量的屬性或字段,都會影響到傳遞前的變量的值
值傳遞:傳的是對象的值拷貝。(即函數內參數對象是調用時傳遞的對象的棧中對象的拷貝。)
引用傳遞:傳的是棧中對象的地址。(即函數內參數對象與調用時傳遞的對象完全是同一棧中對象。)
三.使用集合組織相關數據
System.Collections 命名空間包含接口和類,這些接口和類定義各種對象(如列表、隊列、位數組、哈希表和字典)的集合。
System.Collections.Generic 命名空間包含定義泛型集合的接口和類,泛型集合允許用戶創建強類型集合,它能提供比非泛型強類型集合更好的類型安全性和性能。
System.Collections.Specialized 命名空間包含專用的和強類型的集合,例如,鏈接的列表詞典、位向量以及只包含字符串的集合。
using System; using System.Collections.Generic; using System.Text; using System.Collections; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ArrayList list = new ArrayList(); Console.WriteLine("遍歷方法一:"); foreach (int item in list)//不要強制轉換 { Console.WriteLine(item);//遍歷方法一 } Console.WriteLine("遍歷方法二:"); for (int i = 0; i < list.Count; i++)//數組是length { int number = (int)list[i];//一定要強制轉換 Console.WriteLine(number);//遍歷方法二 } } } }
1、哈希表(Hashtable)簡述
在.NET Framework中,Hashtable是System.Collections命名空間提供的一個容器,用於處理和表現類似key/value的鍵值對,其中key通常可用來快速查找,同時key是區分大小寫;value用於存儲對應於key的值。Hashtable中key/value鍵值對均為object類型,所以Hashtable可以支持任何類型的key/value鍵值對.
2、哈希表的簡單操作
在哈希表中添加一個key/value鍵值對:HashtableObject.Add(key,value);
在哈希表中去除某個key/value鍵值對:HashtableObject.Remove(key);
從哈希表中移除所有元素: HashtableObject.Clear();
判斷哈希表是否包含特定鍵key: HashtableObject.Contains(key);
遍歷
foreach(DictionaryEntry item in Hashtable)
{
item.Key;
item.Values;
}
泛型最常見的用途是泛型集合,命名空間System.Collections.Generic 中包含了一些基於泛型的集合類,使用泛型集合類可以提供更高的類型安全性,還有更高的性能,避免了非泛型集合的重復的裝箱和拆箱。public class Person { protected string ssn = "111-222-333-444" ; protected string name = "張三" ; public virtual void GetInfo() { Console.WriteLine("姓名: {0}", name) ; Console.WriteLine("編號: {0}", ssn) ; } } class Employee: Person { public string id = "ABC567EFG23267" ; public override void GetInfo() { // 調用基類的GetInfo方法: base.GetInfo(); Console.WriteLine("成員ID: {0}", id) ; } }
3.子類構造函數 (1)隱式調用父類構造函數 (2)顯示調用父類構造函數 繼承的使用 繼承、封裝和多態是面向對象編程的重要特性。
如果基類中是沒有參數的構造函數
如果基類中是沒有參數的構造函數,在派生類中可以自定義有參數的構造函數 如果基類定義了帶有參數的構造函數,那麼此構造函數必須被執行,且在派生類中實現該構造函數,此時我們可以使用base關鍵字 如果派生類的基類也是派生類,則每個派生類只需負責其直接基類的構造,不負責間接基類的構造,裡氏替換原則
在一個軟件系統中,子類可以替換父類出現的位置,而對軟件的功能沒有任何影響,就稱為裡氏替換原則。
子類可以擴展父類的功能,但不能改變父類原有的功能。 子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法。 子類中可以增加自己特有的方法。
當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬松。
當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更嚴格。
看上去很不可思議,因為我們會發現在自己編程中常常會違反裡氏替換原則,程序照樣跑的好好的。所以大家都會產生這樣的疑問,假如我非要不遵循裡氏替換原則會有什麼後果?
後果就是:你寫的代碼出問題的幾率將會大大增加。
例如: Father son=new Son();
C#中有兩個關鍵字可以提現裡氏替換原則:is和as操作符 is操作符用於檢查對象和指定的類型是否兼容。 as操作符主要用於兩個對象之間的類型轉換。
父類類型做參數
示例: 先給幾個類: 1.父類,交通工具類。有一堆屬性。 2.汽車類,繼承父類。 3.地鐵類,繼承父類。 4.員工類。員工乘坐交通工具回家!員工回家的方法,參數是父類對象!
然後建一個員工的集合,初始化員工. 扔到集合裡。就和=可以用集合的項點出員工回家的方法傳一個子類! 總結這就是子類指向父類!也就是所謂的裡氏替換原則!
抽象類和抽象方法
如果一個類不與具體的事物相聯系,而只是表達一種抽象的概念,僅僅是作為其派生類的一個基類,這樣的類就是抽象類,在抽象類中聲明方法時,如果加上abstract時就是抽象方法
抽象類與非抽象類的主要區別:
·抽象類不能直接被實例化
·抽象類中可以包含抽象成員,但非抽象類中不可以
·抽象類不能是密封的或者靜態的
抽象方法是一個沒有實現的方法,通過在定義方法時增加關鍵字abstract可以聲明抽象方法。
抽象方法語法
訪問修飾符 abstract 返回值類型 方法名();
注意:抽象方法沒有閉合的大括號,而是直接跟了個“;”也就是說,它沒有包括方法執行邏輯的方法體!
抽象類的定義
語法: 訪問修飾符 abstract class 類名{}
注意: 抽象類提供的抽象方法,這些方法只有定義,如何實現都由抽象類的非抽象子類完成。
抽象類和抽象方法的應用
如何實現一個抽象父類派生的子類 當從一個抽象父類派生一個抽象子類時,子類將繼承父類的所有特征,包括它未實現的抽象方法。抽象方法必須在子類中實現,除非他的子類也是抽象類。
抽象類和抽象方法的應用
如何實現一個抽象父類派生的子類 當從一個抽象父類派生一個抽象子類時,子類將繼承父類的所有特征,包括它未實現的抽象方法。抽象方法必須在子類中實現,除非他的子類也是抽象類。
面對對象的三大特性
封裝:保證對象自身數據的完整性和安全性
繼承:建立類之間的關系上,實現代碼復用,方便系統的擴展。
多態:相同的方法調用可實現不同的實現方式。
八.可擴展標記性語言XML
一、XML是什麼?作用是什麼?
l XML ( eXtensible Markup Language )語言是一種可擴展的標記語言。其中的可擴展是相對HTML來說的。因為XML標簽沒有被預定義,需要用戶自行定義標簽。
l XML 被設計的宗旨是:是表示數據,而非顯示數據。
操作XML的方法
解析XMl文件
public static void Main(string[] args)
{
XmlDocument doc=new XmlDocument():
doc.Load("Engineer.xml");
XmlNode root=new XmlNode();
foreach(XmlNode item in doc.ChildNodes)
{
switch(node.Name)
{
case "id":
Console.WriteLine(node.InnerText);
break;
}
}
}
用TreeView顯示數據XmlDocument doc = new XmlDocument(); doc.Load("北京電視台.xml"); XmlNode root = doc.DocumentElement; //找根節點 foreach (XmlNode item in root.ChildNodes)//遍歷子節點 { if(item.Name.Equals("tvProgramTable"))//判斷條件是節點的Name是否是"tvProgramTable" { foreach (XmlNode items in item.ChildNodes)//遍歷子節點的子節點 { TvProgram Tp = new TvProgram(); Tp.PlayTime = Convert.ToDateTime(items["playTime"].InnerText); Tp.Meridien = items["meridien"].InnerText; Tp.Path = items["path"].InnerText; Tp.ProgramName = items["programName"].InnerText; ProgramList1.Add(Tp);//綁定到集合 } } } TreeNode minenode = new TreeNode(); minenode.Text = "我的電視台"; //bind tvList.Nodes.Add(minenode); //根節點 TreeNode root = new TreeNode(); root.Text = "所有電視台"; //bind tvList.Nodes.Add(root); ChannelManager manager = new ChannelManager(); manager.ResolveChannels(); List<ChannelBase> list = manager.List; foreach (ChannelBase item in list) { TreeNode tn = new TreeNode(); tn.Text = item.ChannelName; tn.Tag = item; root.Nodes.Add(tn); }
九.文件操作
如何讀寫文件
引入using.System.IO;
string path=txtFilePath.Text;
string content=txtContent.Text;
if(path.Equals(null)||path.Equals(""))
{
MessageBox.Show("文件的路徑不為空");
return;
}
try
{
FileStream nyfs=new FileStream(path,FileMode.Create)
streamWriter mysw=new StreamWriter(myfs);
mysw.Write(content);
mysw.Close();
myfs.Close();
MessageBox.Show("寫入成功");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
文件流
語法
FileStream 文件流對象=new FileStream(string filePath,FileMode fileMode);
文件讀寫器
StreamWriter 寫入器
StreamWriter mysw=new StreamWriter();
解決亂碼問題
FileStream myfs=new FileStream(path,FileMode.Open)
StreamReader mySr=new StreamReader(myfs,Encoding.Default);
content=mySr.ReadToEnd();
txtContent.Text=content;
文件和目錄操作
File類和Directory類
File類常用的方法
Exites(string path) 用於檢查指定文件是否存在
copy()復制文件
Move()移動文件
Delete()刪除文件
示例 小型資源管理器
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Chap09_資源管理器 { class MyFile { public string FileName { get; set; } public long FileLength { get; set; } public string FileType { get; set; } public string FilePath { get; set; } } } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Diagnostics; namespace Chap09_資源管理器 { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } private void FrmMain_Load(object sender, EventArgs e) { DriveInfo[] di = DriveInfo.GetDrives(); foreach (DriveInfo item in di) { TreeNode tn = new TreeNode(item.Name); tn.Tag = item.Name; tvList.Nodes.Add(tn); } } public void BindInfo(TreeNode node) { try { lvList.Items.Clear(); DirectoryInfo dir = new DirectoryInfo(node.Tag.ToString()); DirectoryInfo[] dirs = dir.GetDirectories(); foreach (DirectoryInfo item in dirs) { TreeNode tn = new TreeNode(); tn.Text = item.Name; tn.Tag = item.FullName; node.Nodes.Add(tn); } FileInfo[] fi = dir.GetFiles(); List<MyFile> files = new List<MyFile>(); foreach (FileInfo item in fi) { MyFile mf = new MyFile(); mf.FileName = item.Name; mf.FileLength = item.Length; mf.FileType = item.Extension; mf.FilePath = item.FullName; files.Add(mf); } foreach (MyFile item in files) { ListViewItem items = new ListViewItem(item.FileName); items.SubItems.Add(item.FileLength.ToString()); items.SubItems.Add(item.FileType); items.SubItems.Add(item.FilePath); lvList.Items.Add(items); } } catch (Exception ex) { MessageBox.Show(""+ex.Message); } } private void tvList_AfterSelect(object sender, TreeViewEventArgs e) { TreeNode node = this.tvList.SelectedNode; this.BindInfo(node); } private void lvList_DoubleClick(object sender, EventArgs e) { Process.Start(lvList.SelectedItems[0].SubItems[3].Text); } private void 復制ToolStripMenuItem_Click(object sender, EventArgs e) { FolderBrowserDialog fbd = new FolderBrowserDialog(); DialogResult result = fbd.ShowDialog(); string sourcePath = lvList.SelectedItems[0].SubItems[3].Text; string desPath = null; if(result==DialogResult.OK) { desPath = fbd.SelectedPath; desPath += "\\" + lvList.SelectedItems[0].SubItems[0].Text; File.Copy(sourcePath,desPath); MessageBox.Show("復制成功"); } } private void 刪除ToolStripMenuItem_Click(object sender, EventArgs e) { lvList.Items.Clear(); string deletePath=lvList.SelectedItems[0].SubItems[3].Text; File.Delete(deletePath); MessageBox.Show("刪除成功"); } } }
啟動後就是這樣可以讀出自己硬盤上的東西!
好了就寫到這了。總結到這裡了。