c# 基礎進階

 

一、序列化和反系列化

序列化:就是將對象轉換爲二進制
反序列化:就是將二進制轉換爲對象
作用:傳輸數據。

序列化又稱串行化,是.NET運行時環境用來支持用戶定義類型的流化的機制。其目的是以某種存儲形成使自定義對象持久化,或者將這種對象從一個地方傳輸到另一個地方。
.NET框架提供了兩種串行化的方式:

1、是使用BinaryFormatter進行串行化;2、使用SoapFormatter進行串行化;3、使用XmlSerializer進行串行化。

第一種方式提供了一個簡單的二進制數據流以及某些附加的類型信息,而第二種將數據流格式化爲XML存儲;第三種其實和第二種差不多也是XML的格式存儲,只不過比第二種的XML格式要簡化很多(去掉了SOAP特有的額外信息)。
可以使用[Serializable]屬性將類標誌爲可序列化的。如果某個類的元素不想被序列化,1、2可以使用[NonSerialized]屬性來標誌,2、可以使用[XmlIgnore]來標誌。
1、使用BinaryFormatter進行串行化
下面是一個可串行化的類:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
/// <summary>
/// ClassToSerialize 的摘要說明
/// </summary>
[Serializable]
public class ClassToSerialize
{
    public int id = 100;
    public string name = "Name";
    [NonSerialized]
    public string Sex = "男";
}

下面是串行化和反串行化的方法:

public void SerializeNow()
    {
        ClassToSerialize c = new ClassToSerialize();
        FileStream fileStream = new FileStream("c:\\temp.dat", FileMode.Create);
        //開始序列化對象
        BinaryFormatter b = new BinaryFormatter();
        b.Serialize(fileStream, c);
        fileStream.Close();
    }
    //反序列化成對象
    public void DeSerializeNow()
    {
        ClassToSerialize c = new ClassToSerialize();
        c.Sex = "kkkk";
        FileStream fileStream = new FileStream("c:\\temp.dat", FileMode.Open, FileAccess.Read, FileShare.Read);
        BinaryFormatter b = new BinaryFormatter();
        c = b.Deserialize(fileStream) as ClassToSerialize;
          Response.Write(c.name);
        Response.Write(c.Sex);
        fileStream.Close();
    }

調用上述兩個方法就可以看到串行化的結果:Sex屬性因爲被標誌爲[NonSerialized],故其值總是爲null。

轉載:https://blog.csdn.net/yunhaiC/article/details/8584292

二、自動屬性和普通屬性

//普通屬性
private string _name;

public string Name
{
    get { return _name; }
    set { _name = value; }
}

/// <summary>
/// 自動屬性
/// </summary>
public int Age
{
    get;
    set;
}

以上代碼,普通屬性和自動屬性結果都一樣,只是語法各異。自動屬性更簡便

  1. 自動實現的屬性必須同時聲明 get和 set 訪問器。創建 readonly自動實現屬性時,需要將set訪問器設置爲private 。
  2. 自動實現的屬性上可以使用特性,不能用在支持後備字段上。如果屬性的後備字段上使用特性,則應該只創建常規屬性。
  3. 自動實現屬性get,和set中不能包含特殊的邏輯處理。與字段類似,但不同於字段。與字段不同,屬性不作爲變量來分類,不能將屬性作爲 ref參數或 out參數傳遞。

三、Directory類

Directory 操作文件夾
CreateDirectory 創建文件夾

//創建文件夾
Directory.CreateDirectory(@"C:\a");

Delete  刪除文件夾

//刪除文件夾
Directory.Delete(@"C:\a",true);//有true表示無論是否爲空文件夾都刪除,無true則非空文件夾不能刪除

Move  剪切文件夾

//剪切文件夾
Directory.Move(@"c:\a", @"C:\Users\SpringRain\Desktop\new");


Exist  判斷是否存在

//判斷指定的文件夾是否存在
if (Directory.Exists(@"C:\a\b"))
{
    for (int i = 0; i < 100; i++)
    {
        Directory.CreateDirectory(@"C:\a\b\" + i);
    }   
}


GetFiles 獲得指定的目錄下所有文件的全路徑

//獲得指定文件夾下所有文件的全路徑
string[] path = Directory.GetFiles(@"C:\Users\SpringRain\Desktop\Picture","*.jpg");
for (int i = 0; i < path.Length; i++)
{
    Console.WriteLine(path[i]);
}


GetDirectory 獲得指定目錄下所有文件夾的全路徑

//獲得指定目錄下所有文件夾的全路徑
string[] path = Directory.GetDirectories(@"C:\Users\SpringRain\Desktop\new");
for (int i = 0; i < path.Length; i++)
{
    Console.WriteLine(path[i]);
}

四、進程和線程

1、進程

進程(Process)是Windows系統中的一個基本概念,它包含着一個運行程序所需要的資源。一個正在運行的應用程序在操作系統中被視爲一個進程,進程可以包括一個或多個線程。線程是操作系統分配處理器時間的基本單元,在進程中可以有多個線程同時執行代碼。進程之間是相對獨立的,一個進程無法訪問另一個進程的數據(除非利用分佈式計算方式),一個進程運行的失敗也不會影響其他進程的運行,Windows系統就是利用進程把工作劃分爲多個獨立的區域的。進程可以理解爲一個程序的基本邊界。是應用程序的一個運行例程,是應用程序的一次動態執行過程。

命名空間

using System.Threading.Tasks;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _15進程
{
    class Program
    {
        static void Main(string[] args)
        {
            //獲得當前程序中所有正在運行的進程
            //Process[] pros = Process.GetProcesses();
            //foreach (var item in pros)
            //{
            //    //不試的不是爺們
            //    //item.Kill();
            //    Console.WriteLine(item);
            //}

            //通過進程打開一些應用程序
            //Process.Start("calc");//打開計算器
            //Process.Start("mspaint");//打開畫圖工具
            //Process.Start("notepad");//打開記事本
            //Process.Start("iexplore", "http://www.baidu.com");//打開百度

            //通過一個進程打開指定的文件

            ProcessStartInfo psi = new ProcessStartInfo(@"C:\Users\SpringRain\Desktop\1.exe");
           
            //第一:創建進程對象
            Process p = new Process();
            p.StartInfo = psi;
            p.Start();
           // p.star


            Console.ReadKey();
        }
    }
}

2、線程

線程 被定義爲程序的執行路徑。每個線程都定義了一個獨特的控制流。如果您的應用程序涉及到複雜的和耗時的操作,那麼設置不同的線程執行路徑往往是有益的,每個線程執行特定的工作。

線程是輕量級進程。一個使用線程的常見實例是現代操作系統中並行編程的實現。使用線程節省了 CPU 週期的浪費,同時提高了應用程序的效率。

到目前爲止我們編寫的程序是一個單線程作爲應用程序的運行實例的單一的過程運行的。但是,這樣子應用程序同時只能執行一個任務。爲了同時執行多個任務,它可以被劃分爲更小的線程。

線程生命週期

線程生命週期開始於 System.Threading.Thread 類的對象被創建時,結束於線程被終止或完成執行時。

下面列出了線程生命週期中的各種狀態:

  • 未啓動狀態:當線程實例被創建但 Start 方法未被調用時的狀況。
  • 就緒狀態:當線程準備好運行並等待 CPU 週期時的狀況。
  • 不可運行狀態:下面的幾種情況下線程是不可運行的:

     

    • 已經調用 Sleep 方法
    • 已經調用 Wait 方法
    • 通過 I/O 操作阻塞
  • 死亡狀態:當線程已完成執行或已中止時的狀況。

主線程

在 C# 中,System.Threading.Thread 類用於線程的工作。它允許創建並訪問多線程應用程序中的單個線程。進程中第一個被執行的線程稱爲主線程

當 C# 程序開始執行時,主線程自動創建。使用 Thread 類創建的線程被主線程的子線程調用。您可以使用 Thread 類的 CurrentThread 屬性訪問線程。

下面的程序演示了主線程的執行:

using System;
using System.Threading;

namespace MultithreadingApplication
{
    class MainThreadProgram
    {
        static void Main(string[] args)
        {
            Thread th = Thread.CurrentThread;
            th.Name = "MainThread";
            Console.WriteLine("This is {0}", th.Name);
            Console.ReadKey();
        }
    }
}

當上面的代碼被編譯和執行時,它會產生下列結果:

This is MainThread

產生一個線程的4步驟:

編寫產生線程所要執行的方法

引用System.Threading命名空間

實例化Thread類,並傳入一個指向線程所要運行方法的委託。(這時候這個線程已經產生,但是還沒有運行)

調用Thread實例的Start方法,標記該線程可以被CPU執行了,但具體執行時間由CPU決定

前臺線程和後臺線程:

前臺線程:只有所有的前臺線程都關閉才能完成程序關閉。

後臺線程:只要所有的前臺線程結束,後臺線程自動結束。

線程舉例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _17_線程
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Thread th;
        private void button1_Click(object sender, EventArgs e)
        {
            //創建一個線程去執行這個方法
            th = new Thread(Test);
            //標記這個線程準備就緒了,可以隨時被執行。具體什麼時候執行這個線程,
            //由cpu決定
            //將線程設置爲後臺線程
            th.IsBackground = true;
            th.Start();
            th.Abort();
            th.Start();

        }

        private void Test()
        {
            for (int i = 0; i < 10000; i++)
            {
                //Console.WriteLine(i);
                textBox1.Text = i.ToString();
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //取消跨線程的訪問
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //當你點擊關閉窗體的時候,判斷新線程是否爲null
            if (th != null)
            {
                //結束這個線程
                th.Abort();
            }
        }

    }
}

注:在.Net下,是不允許跨線程的訪問。

轉載:https://www.runoob.com/csharp/csharp-multithreading.html

3、進程與線程的區別和關係

簡而言之,一個程序至少有一個進程,一個進程至少有一個線程. 
線程的劃分尺度小於進程,使得多線程程序的併發性高。
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以併發執行.

進程和線程的主要差別在於它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變量的併發操作,只能用線程,不能用進程。如果有興趣深入的話,我建議你們看看《現代操作系統》或者《操作系統的設計與實現》。對就個問題說得比較清楚。

轉載:https://www.cnblogs.com/GodZhe/p/4887096.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章