程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 個人總結深入.NET平台和C#編程,

個人總結深入.NET平台和C#編程,

編輯:C#入門知識

個人總結深入.NET平台和C#編程,


  前言:學習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 中包含了一些基於泛型的集合類,使用泛型集合類可以提供更高的類型安全性,還有更高的性能,避免了非泛型集合的重復的裝箱和拆箱。 
    很多非泛型集合類都有對應的泛型集合類,下面是常用的非泛型集合類以及對應的泛型集合類: 非泛型集合類 泛型集合類 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

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

  

 

啟動後就是這樣可以讀出自己硬盤上的東西!

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved