我的總結深刻.NET平臺和C#編程

  前言:學習C#編程應該有幾個月了,做爲一個菜鳥,沒有資格來評論什麼。只有對本身所學進行一個總結,可能有不嚴謹的地方,萬望諒解。node

         一·深刻.NET框架c++

      .NET框架(.NET Framework),他是開發.NET應用程序的核心基礎。編程

.NET框架的體系結構數組

  支持C#、VB、.NET、c++、等語言的開發,也就是咱們所說的跨語言開發。安全

.NET框架具備兩個主要組件:CLR和FCL。(CLR是Common Language Runtime即公共語言進行時;FCL是Framework Class Library即框架類庫)框架

.NET框架核心類庫及其功能ide

 

類和對象函數

類定義了一組概念模型,而對象是真實的實體。工具

set訪問器只寫;get訪問器只讀。oop

在vs中自動屬性prop+雙擊Tab鍵

封裝

 1.保證數據的安全性。

2.提供清晰的對外接口

3.類內部能夠任意修改,不影響其餘類。

類圖

 

二.深刻C#數據類型

值類型應用類型

值類型包括基本數據類型,和枚舉類型,結構體等。

引用類型包括string 數組,類和接口。

結構體:

能夠有字段,能夠有方法。

定義時字段不能被賦初值。

不用new。聲明結構對象後必須給結構成員賦初值。

拆箱和裝箱

示例:

int a=1;

object o=i;//裝箱

int j=(int)o;//拆箱

值傳遞和引用傳遞

引用類型做爲參數時:
一、在修改變量自己時,結果相似於值傳遞,即不會改變傳遞前的變量的值
二、在修改變量的屬性或字段時,纔是引用傳遞,會影響到傳遞前的變量的值
三、參數使用了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);//遍歷方法二

            }
        }
    }
}

  一、哈希表(Hashtable)簡述
     在.NET Framework中,Hashtable是System.Collections命名空間提供的一個容器,用於處理和表現相似key/value的鍵值對,其中key一般可用來快速查找,同時key是區分大小寫;value用於存儲對應於key的值。Hashtable中key/value鍵值對均爲object類型,因此Hashtable能夠支持任何類型的key/value鍵值對.

二、哈希表的簡單操做
在哈希表中添加一個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 中包含了一些基於泛型的集合類,使用泛型集合類能夠提供更高的類型安全性,還有更高的性能,避免了非泛型集合的重複的裝箱和拆箱。 
    不少非泛型集合類都有對應的泛型集合類,下面是經常使用的非泛型集合類以及對應的泛型集合類:
非泛型集合類 泛型集合類
ArrayList List<T>
HashTable DIctionary<T>
Queue Queue<T>
Stack Stack<T>
SortedList SortedList<T>
 單列泛型集合:
List<Object> list=new List<Oibject>();
遍歷
for(int i=0;i<list.Count;i++)
{
  Console.WriteLine(list[i]);
}
foreach(Object item in list)
{
  Console.WriteLine(item);
}
雙列泛型集合
Dictionary<object,object> dic=new Dictionary<object,object>();
遍歷
foreach(KeyValuePair<object,object> item in dic)
{
Console.WriteLine(dic.Key);
Console.WriteLine(dic.Value);
}
foreach(Object item in dic.Keys)
{
 Console.WriteLine(item);
  Console.WriteLine(dic[item].Value);
}
foreach(Object item in dic.Values)
{
 Console.WriteLine(item);
}
四.深刻類的方法
1.構造函數
(1.)方法名與類名相同
(2.)沒有返回值
(3.)主要完成對象初始化工做
2.無參構造函數的
語法
訪問修飾符 類名()
{
 //方法體
3.帶參構造函數
語法
訪問修飾符 類名(參數列表)
{
 //方法體
隱式構造函數
系統自動給類分配一個無參構造函數。
構造函數的重載
無參構造和帶參構造能夠當作是方法重載。
方法重載
(1.)方法名相同
(2.)方法參數類型不一樣或者參數個數不一樣
(3.)在同一個類中
對象交互
每一個類都有本身的特性和功能,咱們把它們封裝爲屬性和方法。對象之間經過屬性和方法進行交互。能夠認爲方法的參數及方法的返回值都是對象間相互傳遞消息。
我的理解,他爲何叫對象間交互呢。由於是對象間進行的屬性方法交互。而類之間進行的繼承多態接口。
 六.初識繼承和多態
繼承概述
1.什麼是繼承
(1)移除類的冗餘代碼
(2)集成的概念
2.base關鍵字和protected修飾符
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)顯示調用父類構造函數
 繼承的使用
繼承、封裝和多態是面向對象編程的重要特性。
其成員被繼承的類叫基類也稱父類,繼承其成員的類叫派生類也稱子類。
派生類隱式得到基類的除構造函數和析構函數之外的全部成員。
派生類只能有一個直接基類,因此C#並不支持多重繼承,但一個基類能夠有多個直接派生類。
繼承是能夠傳遞的
私有成員其實已經被繼承了, 可是它們卻不能夠被訪問,由於私有成員只能被聲明它們的類或結構體中才可訪問,因此看上去像是沒有被繼承。

 若是基類中是沒有參數的構造函數

若是基類中是沒有參數的構造函數,在派生類中能夠自定義有參數的構造函數
若是基類定義了帶有參數的構造函數,那麼此構造函數必須被執行,且在派生類中實現該構造函數,此時咱們可使用base關鍵字
 
若是派生類的基類也是派生類,則每一個派生類只需負責其直接基類的構造,不負責間接基類的構造
而且其執行構造函數的順序是從最上面的基類開始的,直到最後一個派生類結束。
is a的應用
因爲SE和PM都繼承Employee,即SE is a Employee,PM is a Employee.
繼承的價值:
(1.)集成模擬了現實世界關係,oop中強調一切皆對象,這符合咱們面向對象編程的思考方式
(2.)繼承實現了代碼複用
(3.)集成使程序結構更清晰
多態
解決集成帶來的問題
虛方法
使用virtual關鍵字修飾的方法,稱爲虛方法。虛方法有方法體
語法
訪問修飾符 virtual 返回類型 方法名()
 {
    //方法體
 }
重寫虛方法
訪問修飾符 override 返回值類型 方法名()
{
//方法體
}
什麼是多態
多態按字面的意思就是「多種形態」,指同一操做做用不一樣的對象時,能夠有不一樣的解釋,產生不一樣的結果。
實現多態
(1.)實現方法重寫
(2.)定義父類變量
七.深刻理解多態

里氏替換原則

在一個軟件系統中,子類能夠替換父類出現的位置,而對軟件的功能沒有任何影響,就稱爲里氏替換原則。

子類能夠擴展父類的功能,但不能改變父類原有的功能。 子類能夠實現父類的抽象方法,但不能覆蓋父類的非抽象方法。 子類中能夠增長本身特有的方法。

當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬鬆。

當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更嚴格。

看上去很難以想象,由於咱們會發如今本身編程中經常會違反里氏替換原則,程序照樣跑的好好的。因此你們都會產生這樣的疑問,假如我非要不遵循里氏替換原則會有什麼後果?

後果就是:你寫的代碼出問題的概率將會大大增長。

例如: Father son=new Son();

C#中有兩個關鍵字能夠提現里氏替換原則:is和as操做符 is操做符用於檢查對象和指定的類型是否兼容。 as操做符主要用於兩個對象之間的類型轉換。

父類類型作參數

示例: 先給幾個類: 1.父類,交通工具類。有一堆屬性。 2.汽車類,繼承父類。 3.地鐵類,繼承父類。 4.員工類。員工乘坐交通工具回家!員工回家的方法,參數是父類對象!

而後建一個員工的集合,初始化員工. 扔到集合裏。就和=能夠用集合的項點出員工回家的方法傳一個子類! 總結這就是子類指向父類!也就是所謂的里氏替換原則!

抽象類和抽象方法

若是一個類不與具體的事物相聯繫,而只是表達一種抽象的概念,僅僅是做爲其派生類的一個基類,這樣的類就是抽象類,在抽象類中聲明方法時,若是加上abstract時就是抽象方法

抽象類與非抽象類的主要區別:

·抽象類不能直接被實例化

·抽象類中能夠包含抽象成員,但非抽象類中不能夠

·抽象類不能是密封的或者靜態的

抽象方法是一個沒有實現的方法,經過在定義方法時增長關鍵字abstract能夠聲明抽象方法。

抽象方法語法

訪問修飾符 abstract 返回值類型 方法名();

注意:抽象方法沒有閉合的大括號,而是直接跟了個「;」也就是說,它沒有包括方法執行邏輯的方法體!

抽象類的定義

語法: 訪問修飾符 abstract class 類名{}

注意: 抽象類提供的抽象方法,這些方法只有定義,如何實現都由抽象類的非抽象子類完成。

抽象類和抽象方法的應用

如何實現一個抽象父類派生的子類 當從一個抽象父類派生一個抽象子類時,子類將繼承父類的全部特徵,包括它未實現的抽象方法。抽象方法必須在子類中實現,除非他的子類也是抽象類。

抽象類和抽象方法的應用

如何實現一個抽象父類派生的子類 當從一個抽象父類派生一個抽象子類時,子類將繼承父類的全部特徵,包括它未實現的抽象方法。抽象方法必須在子類中實現,除非他的子類也是抽象類。

面對對象的三大特性

封裝:保證對象自身數據的完整性和安全性

繼承:創建類之間的關係上,實現代碼複用,方便系統的擴展。

多態:相同的方法調用可實現不一樣的實現方式。

八.可擴展標記性語言XML

1、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("刪除成功");
        }
    }
}

  

 

啓動後就是這樣能夠讀出本身硬盤上的東西!

好了就寫到這了。總結到這裏了。

相關文章
相關標籤/搜索