首頁 > 軟體

C#基本語法簡介

2022-04-10 22:00:48

一.基礎語法

1.C#區分大小寫,所以myVar和MyVar是兩個不同的變數。
2.每個C#可執行檔案(如控制檯應用程式,Windows應用程式和Windows服務)都必須有一個入口點————Main()(M大寫)

  public static void Main()
  {
  //do something
  }

在程式啟動時呼叫這個方法。該方法要麼沒有返回值(void),要麼返回一個整數(int)

二.變數

1.編譯器不允許在表示式中使用未初始化的變數。如果變數是類或結構中的欄位,如果沒有初始化,建立這些變數時,其預設值就是0。
2.型別推斷
型別推斷(type inference)使用var關鍵字。編譯器可以根據變數的初始化值“推斷”變數的型別。var somenum = 0;即使somenum從來沒有宣告為int,編譯器也可以確定,只要somenum在其作用域內,就是一個int.宣告了變數,推斷出了型別後,就不能改變變數型別了。變數的型別確定後,就遵循其它變數型別遵循的強型別化規則。
3.變數的作用域
變數的作用域是存取該變數的程式碼區域。只要變數的作用域是程式的不同部分就不會有問題。
(1).區域性變數的作用域衝突

  public static int Main()
  {
      int j =20;
      for(int i=0;i<20;i++)
      {
      int j = 30;
      // do something
      }
  }

編譯時會報錯,因為在Main()方法作用域內有兩個變數j,編譯器無法區分這兩個變數。
(2).欄位和區域性變數的作用域衝突
某些情況下可以區分名稱相同,作用域相同的兩個識別符號。原因是C#在變數之間有一個基本的區分,它把在類級別宣告的變數看作欄位,而把在方法中宣告的變數看作區域性變數。

  class Program
  {
      int j = 20;
      static void Main(string[] args)
      {
        int j = 30;
        Console.WriteLine(j);
        Console.ReadKey();
      }
  }

雖然在Main()方法的作用域內宣告了兩個j,這段程式碼也會編譯。在類級別上定義的j,在該類刪除前是不會超出作用域的,在Main()中宣告的j隱藏了同名的類級別變數,所以執行程式碼時會顯示30.

三.常數

顧名思義,常數是其值在使用過程中不會發生改變的變數。在宣告和初始化變數時,在變數的前面加上關鍵字const,就可以把該變數指定為一個常數:const int a =100;
常數的特點;

  • *常數必須在宣告時初始化。指定了值之後就不能改寫了。
  • *常數的值必須能在編譯時用於計算。因此不能用於從一個變數中提取的值來初始化常數。如果需要,應使用唯讀欄位(後面介紹)。
  • *常數總是靜態的。但注意,不必(實際上不允許)在常數宣告中包含static

使用常數的好處:

  • *由於使用易於讀取的名稱(名稱的值易於理解)代替了較難讀取的數位或字串,常數使程式變得更易於閱讀。
  • *常數使程式易於修改。當常數的值需要修改時,只需要把新值賦給這個常數,不必查詢整個程式去修改。
  • *常數更容易避免程式出現錯誤。如果在宣告常數的位置以外的地方給常數賦值,編譯器會報錯。

四.CTS型別

C#認可的基本預定義型別並沒有內建於C#語言中,而是內建於.NET Framework中。
例如,在C#中宣告一個int型別的資料時,宣告的實際上是.NET結構System.Int32的一個範例。這表示在語法上,可以把所有的基本資料型別看成支援某些方法的類。
把int i 轉化為string, string s = i.ToString();
在這種便利的語法背後,型別實際上仍儲存為基本型別。基本型別在概念上用.NET 結構表示,所以沒有效能損失。
C#有15個預定義型別,string,object是參照型別。

五.列舉

  public enum TimeDay
  {
      Morning=0,
      Afternoon = 1,
      Evening=2
  }

1.列舉是使用者定義的整數型別。
2.從長遠來看,建立列舉可以節省大量時間,減少許多麻煩。使用列舉比使用整數的優勢:

  • *列舉可以使程式碼更易於維護,有助於確保給變數指定合法的,期望的值;
  • *列舉使程式碼更清晰,用描述性的名稱表示整數值,而不是用含義模糊,變化多端的數來表示;

3.在C#中,列舉的真正強大之處是它們在後臺會範例化為派生於基礎類別System.Enum的結構。這表示可以對它們呼叫方法,執行有用的任務。

TimeDay td =TimeDay.Afternoon;
Console.WriteLine((td.ToString());

注意因為.NET Framework的執行方式,在語法上把列舉當成結構不會造成效能損失。實際上,一旦程式碼編譯好,列舉就成為基本型別,與int和float類似。
4.從字串中獲取列舉值

TimeDay td = (TimeDay)Enum.Parse(typeof(TimeDay),"afternoon",true);
Console.WriteLine((int)td);

要從字串中轉換,需要使用靜態方法Enum.Parse,第一個引數是要使用的列舉型別,第二個是要轉換的字串,第三個是指定在轉換時是否忽略大小寫。
Enum.Parse方法實際上返回一個物件參照(一個字串)————我們需要把這個字串顯示轉換為需要的列舉型別(是一個拆箱操作)。

六.名稱空間

  • 1.名稱空間提供了一種組織相關類和其它型別的方式。與檔案和元件不同,名稱空間是一種邏輯組合,而不是物理組合。
  • 2.不允許宣告巢狀在另一個名稱空間中的多部分的名稱空間。
  • 3.名稱空間與程式集無關。同一個程式集中可以有不同的名稱空間,也可以在不同的程式集中定義同一個名稱空間中的型別。
  • 4.名稱空間的別名

如果名稱空間的名稱很長,又要在程式碼中多次參照,但不希望該名稱空間的名稱包含在using指令中(例如,避免類名衝突),就可以給
該名稱空間指定一個別名:

  using System.Text;
  using System.Threading.Tasks;

  namespace Wrox.ProC.basic
  {
    class NameSpaceEx
    {

    }
  }

  namespace ConsoleApplication1
  {
    using Intro = Wrox.ProC.basic;//給Wrox.ProC.basic指定別名Intro
    class Program
    {

      static void Main(string[] args)
      {
        Intro::NameSpaceEx nex = new Intro.NameSpaceEx();//範例化NameSpaceEx物件,要使用::修飾符
      }


    }
  }

七.Main()方法

C#程式是從Main()方法開始執行的,這個方法必須是類或結構的靜態方法,並且其返回型別必須是int或void。

1.多個Main()方法

在編譯C#控制檯或Windows應用程式時,預設情況下,編譯器會在類中查詢與上述簽名匹配的Main()方法,並使這個類方法稱為程式的入口。
如果有多個Main()方法,編譯器就會報錯。

  namespace Wrox
  {
    class Client
    {
      public static int Main()
      {
        MathEx.Main();
        return 0;
      }
    }

    class MathEx
    {
      static int Add(int x,int y)
      {
        return x+y;
      }

      public static int Main()
      {
        int i = Add(5,10);
        return i;
      }
    }
  }

但是可以使用/main選項,後跟Main()方法所屬類的全名(包括名稱空),明確告訴編譯器把哪個方法作為程式的入口:

csc ConsoleApplication1.cs /main:Wrox.MathEx

2.給Main()方法傳遞引數

在呼叫程式時,可以讓CLR包含一個引數,將命令列引數傳遞給程式。這個引數是一個字串陣列,傳統上稱為args(但C#可以接受任何名稱)。

  class Program
  {
    static void Main(string[] args)
    {
      for (int i = 0; i < args.Length; i++)
      {
        Console.WriteLine(args[i]);
      }

    }
  }

使用命令列就可以編譯這段程式碼。

  ConsoleApplication1 a b c
  a
  b
  c

八.C#前處理器指令

C#前處理器指令不會轉化為可執行程式碼中的命令,但會影響編譯過程的各個方面。例如,使用C#前處理器指令可以禁止編譯器編譯程式碼的某一部分。
如果計劃釋出兩個版本的程式碼,即基本程式碼和擁有更多功能的企業版本,就可以使用前處理器指令。
C#提供了其它機制來實現C++指令的功能,如客製化特性。C#並沒有一個像C++那樣的獨立前處理器,所謂的前處理器指令實際上是由編譯器處理的。
儘管這樣,C#仍保留了一些前處理器指令名稱,因為這些命令會讓人覺得就是前處理器。

1.#define和#undef

#define DEBUG

它告訴編譯器存在給定名稱的符號,類似宣告一個變數,但沒有真正的值,只是存在而已。這個符號不是實際程式碼的一部分,而只是在編譯器編譯程式碼
時存在。在C#程式碼中沒有任何意義。

#undef DEBUG

刪除符號
#define 本身沒有什麼用,與其它前處理器指令(特別是#if)結合使用時,它的功能就很強大。

2.#if,#elif(=else if),#else和#endif

這些指令告訴編譯器是否要編譯某個程式碼塊

  #if DEBUG
  //do something
  #endif

#if,#elif還支援邏輯運運算元“!”,"==","!=","||",與或...

3.#warning, #error

當編譯器遇到它們時,會分別產生這兩個指令後面的文字作為警告或錯誤。

  #if DEBUG
  #error "you didnot define DEBUG"
  #endif
  #warning "dont forget to remove"

4.#region和#endregion

#region和#endregion用於把一段程式碼標記為又給定名稱的一個塊

  #region Member Field
  int x;
  double d;
  #endregion

它們可以被某些編譯器識別。

5.#pragma

#pragma指令可以抑制或還原指定的編譯警告。

  #pragma warning disable
  int i;
  #pragma warning restore

到此這篇關於C#基本語法的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com