C# 基礎知識系列- 13 常見類庫介紹(一)

月影西下發表於2020-04-25

0. 前言

每篇一個前言,介紹一下這一篇的內容。之前的內容都是針對某些知識點進行的介紹,這篇內容介紹一下實際開發中常用的一些類和名稱空間。這一篇是個連續劇,大概有個三四集。嗯,就是這樣。

1. System 名稱空間

System空間,是C#的基礎名稱空間,裡面定義了常用值和資料型別以及各種型別的基類,當然也包括了很多C#程式執行中用到類,具體可以訪問微軟的官方API說明。這裡簡單介紹一下 我們在開發中最常用到的幾個類。

1.1 Console

Console 控制檯類,表示一個控制檯應用程式的標準輸入流、輸出流和錯誤流。這是微軟官方文件給的內容。實際上,Console類在一些其他型別的專案中也可以使用。因為Console類是程式與終端的互動,所以當程式持有一個終端的時候,該類就可以正確輸出內容。

照例,我們先看一下它的宣告:public static class Console 。可知這是一個靜態類,需要明確一個概念:

  • 在C#甚至大多數程式語言(支援靜態類)中,靜態類不可被繼承,而且靜態類的方法都是工具方法;
  • 靜態類沒有構造方法,也不能構造物件;
  • 靜態類裡的方法都是靜態方法
  • 訪問一個類的靜態方法需要通過類名.方法名來訪問

那麼我們可以使用:Console.方法名來呼叫Console的方法。

我們來看看Console在開發中常用的方法有哪些:

  1. 輸出:

    public static void Write (<T> value); //T 表示型別
    public static void Write (string format, params object[] arg);
    

    Write方法一共有17個過載版本,其中有常用的有以上兩鍾(不是兩個版本)。其中第一中寫法,T 代表C#的基礎資料型別中的10種,再加一個Object。

    作用是將引數轉成字串列印到控制檯中,所以效果與先將物件轉成字串然後再列印一樣,所以第二種呼叫方式引數型別與 String.Format是一致的。

    示例程式碼:

    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("列印測試...");
        }
    }
    

    效果如下:

    image-20200424164707972

    如上圖所示,會出現一個黑色背景的圖框,然後顯示列印的內容。

    C# 關於控制檯的輸出還有一個方法:WriteLine,從名字來看是寫一行的意思,實際表現也是如此,該方法每次輸出都會產生新的一行內容,而Write只會在上一次輸出的結尾繼續輸出。

    示例:

    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("列印測試...");
            Console.Write("Write輸出測試");
            Console.WriteLine();
            Console.WriteLine("這行是呼叫WriteLine");
            Console.WriteLine("這行也是呼叫WriteLine輸出的");
        }
    }
    

    執行結果:

    image-20200424165458931

    Write不同的地方是,WriteLine允許無參呼叫,表示輸出一個空行。

  2. 獲取使用者輸入:

    public static int Read ();
    public static string ReadLine ();
    

    Console在讀這方面就沒有寫那麼花裡胡哨了,只有兩個是我們常用的讀。第一個是,從輸入流中讀取一個字元,如果沒有輸入則返回-1;第二個是讀取輸入的一行字元。

    關於輸入流以及流沒有內容時返回-1這個問題就不在這裡做介紹了。有追更的小夥伴可以等待《IO篇》的更新。

    第二個,就很有意思了,獲取輸入的一行內容,而不是一個字元,也就是說當使用者決定這行內容輸入完成點選換行後程式就能讀取到輸入的結果。

    來,看一下示例:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Read 測試");
            Console.WriteLine("請輸入一個任意內容並按回車:");
            var key = Console.Read();
            Console.WriteLine($"輸入的是:{key}");
            Console.WriteLine();
            Console.ReadLine();
            key = Console.Read();
            Console.WriteLine($"輸入的是:{key}");
            Console.ReadLine();
            Console.WriteLine("ReadLine 測試");
            Console.WriteLine("請輸入任意內容,並換行:");
            var line = Console.ReadLine();
            Console.WriteLine($"輸入的是:{line}");
            Console.WriteLine("示例結束");
    
        }
    }
    

    結果如下:

    image-20200424210005278

    示例中,我在每次呼叫Read前,都呼叫了一個ReadLine,這是因為在控制檯中一次輸入字元,然後按下回車並換行,這是有兩個輸入,所以在第二次Read時會將上次未讀取的繼續讀取出來,所以我利用ReadLine的特性將未讀取的內容一次性讀取出來,保證下次呼叫都必須從控制檯讀取使用者輸入。

當然,Console類並不是只有這些內容,只是這些是我們最常接觸的方法。

1.2 Math

C#中的數學工具類,為三角函式、對數函式和其他通用數學函式提供常數和靜態方法。這個類也是一個靜態類,當然這不會影響我們對它的好奇。

來,讓我們一起看看裡面有些什麼方法吧。

public static T Abs (<T> value);//T 代表 decimal, int,double,flout,long,sbyte,short,返回絕對值
public static double Acos (double d);//返回餘弦值為指定數字的角度。
public static double Acosh (double d);//返回雙曲餘弦值為指定數字的角度。
public static double Asin (double d);// 返回正弦值為指定數字的角度。
public static double Asinh (double d);// 返回雙曲正弦值為指定數字的角度。
public static double Atan (double d);// 返回正切值為指定數字的角度。
public static double Atan2 (double y, double x);// 返回正切值為兩個指定數字的商的角度。
public static long BigMul (int a, int b);// 生成兩個 32 位數字的完整乘積。
public static double BitDecrement (double x);// 返回小於 x 的下一個最小值。
public static double BitIncrement (double x);// 返回大於 x 的下一個最大值。
public static double Cbrt (double d);// 返回指定數字的立方根。
public static T Ceiling (<T> d); //T 代表 decimal、double,返回大於或等於指定數字的最小整數值。
public static double Cos (double d);// 返回指定角度的餘弦值。
public static int DivRem (int a, int b, out int result);// 計算兩個數字的商,並在輸出引數中返回餘數。result為餘數
public static double Exp (double d);//返回 e 的指定次冪,e 指自然對數的底
public static T Floor (<T> d); //T 代表 decimal、double,返回小於或等於指定雙精度浮點數的最大整數值。
public static int ILogB (double x);// 返回指定數字以 2 為底的整數對數。
public static double Log (double d);//返回指定數字的自然對數(底為 e)。
public static double Log (double a, double newBase);// 返回指定數字在使用指定底時的對數。newBase為底
public static double Log10 (double d);//返回指定數字以 10 為底的對數
public static double Log2 (double x);//返回指定數字以 2 為底的對數。
public static T Max(<T> t1,<T> t2);// T 代表 decimal, int,double,flout,long,sbyte,short,返回兩者中較大的那個
public static T Min(<T> t1,<T> t2);// T 代表 decimal, int,double,flout,long,sbyte,short,返回兩者中較小的那個
public static double Pow (double x, double y);// 返回指定數字的指定次冪。
public static double Round (double a);// 將雙精度浮點值舍入到最接近的整數值,並將中點值舍入到最接近的偶數。
public static double ScaleB (double x, int n);//返回有效計算的 x * 2^n。
public static int Sign (<T> value); // T 代表 decimal,double,flout,int,long,sbyte,short,返回指示數字符號的整數。
public static double Sin (double a);// 返回指定角度的正弦值。
public static double Sinh (double value);//返回指定角度的雙曲正弦值。
public static double Sqrt (double d);//返回指定數字的平方根。
public static double Tan (double a);//返回指定角度的正切值。
public static double Tanh (double value);//返回指定角度的雙曲正切值。
public static T Truncate (<T> d);//T 代表 decimal、double,計算一個數字的整數部分。

嗯,密密麻麻的一大堆,方法雖多,但值得注意的方法只有以下幾個:

public static T Ceiling (<T> d); //T 代表 decimal、double,返回大於或等於指定數字的最小整數值。
public static T Floor (<T> d); //T 代表 decimal、double,返回小於或等於指定雙精度浮點數的最大整數值。
public static T Truncate (<T> d);//T 代表 decimal、double,計算一個數字的整數部分。

雖然這三個方法計算的結果都是整數,但返回型別並不是整數,所以在使用的時候需要我們進行一次型別轉換。Math類還有兩個值得注意的欄位:

public const double E = 2.7182818284590451;// 表示自然對數的底,它由常數 e 指定。
public const double PI = 3.1415926535897931;// 表示圓的周長與其直徑的比值,由常數 π 指定。

這兩個也是Math裡唯一的兩個欄位,這是數學中著名的兩個無理數,這裡只擷取了一部分有效值。

1.3 Random

C# 中Random表示偽隨機數生成器,這是一種能夠產生滿足某些隨機性統計要求的數字序列的演算法。這裡大概講解一下Random的使用,具體的原理等我研究一下哈。

Random是一個類,所以與之前的兩個類不同地方就是使用Random生成隨機數需要事先構造一個Random物件。Random常用的方法有以下幾組:

public virtual int Next ();// 返回一個整型的隨機數
public virtual int Next (int maxValue);//返回一個小於所指定最大值的非負隨機整數
public virtual int Next (int minValue, int maxValue);//返回在指定範圍內的任意整數。
public virtual double NextDouble ();//返回一個大於或等於 0.0 且小於 1.0 的隨機浮點數。

我們先演示一下Random的基本應用:

class Program
{
    static void Main(string[] args)
    {
        Random rand = new Random();
        for(int i = 0;i< 10; i++)
        {
            Console.WriteLine($"第{i + 1}次生成:{rand.Next()}");
        }
        Console.ReadLine();
    }
}

列印結果:

image-20200424225811906

可以看出直接Next返回的結果數字都比較大,所以在使用的時候,一般會使用Next (int minValue, int maxValue) 限定返回值。

回到開頭,Random是一個類,每次初始化的時候系統會自動計算一個種子給它,如果快速重複構建Random物件,可能會生成一個重複序列,即每次呼叫的結果一致。(當然,官方說可以,實際我在net core 3.1的環境裡沒測出來)

class Program
{
    static void Main(string[] args)
    {
        for(int i = 0;i< 5; i++)
        {
            Random rand = new Random();
            for(int j = 0; j < 10; j++)
            {
                Console.WriteLine($"第{i}個Random 第{j}次生成:{rand.Next()}");
            }
        }
        Console.ReadLine();
    }
}

這是測試程式碼,有興趣的小夥伴可以自己試試。

更多內容煩請關注我的部落格

file

相關文章