主頁 > .NET開發 > C# 語法基礎

C# 語法基礎

2020-09-21 10:10:34 .NET開發

目錄
  • 簡單的 C# 程式示例
  • 關鍵字
    • C# 關鍵字串列
    • C# 背景關系關鍵字串列
  • 識別符號
    • 識別符號的大小寫規則
  • 型別定義
  • Main 方法
  • 花括號、方法體和代碼塊
  • 陳述句和陳述句分隔符
  • 空白
  • 注釋
  • 總結

第一次見到 C# 程式可能會有一些奇怪,程式中有一些 {}[] 這樣的符號,然而在逐漸深入了解 C# 語言的程序中,對這些符號和 C# 語言特有的其他符號會越來越熟悉,甚至會喜歡上它們,

本篇,我們繼續從演示一個簡單的程式示例開始,解釋該程式的功能和它的各組成部分,同時,介紹一些 C# 語言的基本語法,

簡單的 C# 程式示例

using System;   /* 告訴編譯器這個程式使用 System 命名空間中的型別 */

namespace ConsoleApp    /* 宣告一個新命名空間,名稱為 ConsoleApp */
{
    class Program   /* 宣告一個新的型別別,名稱為 Program */
    {
        /// <summary>
        /// Main 是一個特殊方法,編譯器用它作為程式的起始點
        /// </summary>
        static void Main()
        {
            int number; /* 宣告一個名為 number 的變數 */

            // 為 number 賦值
            number = 1;

            // 輸出一行文字
            Console.WriteLine("C# 語法基礎");

            // 還是輸出一行文字
            Console.WriteLine($"變數 number 的值是:{number}");
        }
    }
}

輸出

C# 語法基礎
變數 number 的值是:1

上面程式中每一行代碼的作用:

第 1 行

告訴編譯器這個程式使用 System 命名空間中的型別

第 3 行

宣告一個新命名空間,名稱為 ConsoleApp

  • 新命名空間從第 4 行的左大括號({)開始一直延伸到第 24 行與之對應的右大括號(})結束
  • 在這部分里宣告的任何型別都是該命名空間的成員
第 5 行

宣告一個新的型別別,名稱為 Program

  • 任何在第 6 行和第 23 行的兩個大括號中間宣告的成員都是組成這個類的成員
第 10 行

宣告一個名稱為 Main 的方法

  • Main 是一個特殊方法,編譯器用它作為程式的起始點
第 12 行

宣告一個名為 number 的變數

第 15 行

number 賦值

第 18 行和第 21 行

輸出一行文字

關于 C# 的語法,要介紹的內容有很多,我們從簡單的開始,

關鍵字

為了使編譯器能夠解釋代碼,C# 中的某些單詞具有特殊地位和含義,它們稱為關鍵字,關鍵字是預定義的保留識別符號,對編譯器有特殊意義,在上面的代碼中,classstaticvoid 均是關鍵字,

編譯器根據關鍵字識別代碼的結構與組織方式,由于編譯器對這些單詞有著嚴格的解釋,所以必須將關鍵字放在特定位置,如違反規則,編譯器會報錯,

C# 關鍵字串列

abstract as
break byte
char checked
continue decimal
do double
event explicit
finally fixed
foreach goto
in int
is lock
new null
out override
protected public
return sbyte
sizeof stackalloc
struct switch
true try
ulong unchecked
using using static
volatile while

C# 背景關系關鍵字串列

背景關系關鍵字用于在代碼中提供特定含義,但它不是 C# 中的保留字, 一些背景關系關鍵字(如 partialwhere)在兩個或多個背景關系中有特殊含義,

add
async
descending
from
group
let
orderby
remove
unmanaged(泛型型別約束)
when(篩選條件)
yield

識別符號

識別符號是一種字串,開發者用來命名如變數、方法、引數和許多后面將要闡述的其他程式結構,有效識別符號必須遵循以下規則:

  • 不得將關鍵字用作識別符號,
  • 識別符號必須以字母 a-z A-Z 或下劃線 _ 符號開頭,
  • 識別符號可以包含字母 a-z A-Z,數字 0-9 和下劃線 _ 符號,
  • 識別符號不得包含任何特殊字符(例如!@ $ *.’[]等),除了下劃線 _
  • 關鍵字附加“@”前綴可作為識別符號使用,例如:可命名區域變數 @return 類似地,可命名方法 @throw()

選擇簡潔而有意義的名稱,這使代碼更容易理解和重用,要選擇清晰(甚至是詳細)的名稱,尤其是在團隊中作業,或者開發要由別人使用的庫的時候,

識別符號區分大小寫,例如,變數名 myVarMyVar 是不同的識別符號,舉個例子,在下面的代碼片段中,變數的宣告都是有效的,并宣告了不同的整型變數,但使用如此相似的名稱會使代碼更易出錯并更難除錯,后續需要除錯代碼的人會很不爽,

// 語法上有效,但非常混亂
int totalCycleCount;
int TotalCycleCount; 
int TotalcycleCount;

識別符號的大小寫規則

識別符號有兩種基本的大小寫風格:

  • PascalCasing
  • camelCasing

PascalCasing 約定用于除引數名稱之外的所有識別符號,將每個單詞的第一個字符大寫(包括超過兩個字母的首字母縮寫),如以下示例所示:

PropertyDescriptor

HtmlTag (在 HtmlTag 中, 由于首字母縮寫詞 HTML 的長度超過兩個字母,所以僅首字母大寫,)

這里有一種特殊情況,即遇到兩個字母的首字母縮略詞時,兩個字母都要大寫,如下面的識別符號所示:

IOStream

camelCasing 約定僅用于引數名稱,將除第一個單詞之外的每個單詞的第一個字符大寫,如以下示例所示, 該示例還顯示,以 camelCasing 識別符號開始的雙字母縮寫詞都是小寫的,

propertyDescriptor

ioStream

htmlTag

識別符號命名規范

  • 要更注重識別符號的清晰而不是簡短,
  • 不要在識別符號名稱中使用單詞縮寫,
  • 不要使用不被廣泛接受的首字母縮寫詞,即使被廣泛接受,非必要也不要用,
  • 不要使用下劃線來區分單詞,也不要在識別符號中的任何位置使用下劃線,

參考微軟官方“框架設計準則”,鏈接地址:https://docs.microsoft.com/zh-cn/dotnet/standard/design-guidelines/

型別定義

C# 所有代碼都出現在一個型別定義的內部,最常見的型別定義以關鍵字 class 開頭,

型別名稱(本例是 Program)可以隨便取,但根據約定,它應當使用 PascalCase 風格,就本例來說,可選擇的名稱包括 GreetingsHelloInigoMontoyaHello 或者簡單地稱為 Program

class Program
{
    // ...
}

Main 方法

Main 方法是 C# 應用程式的入口點, (庫和服務不要求使用 Main 方法作為入口點),Main 方法是應用程式啟動后呼叫的第一個方法,

static void Main()
{
    // ...
}

C# 要求 Main 方法回傳 voidint, 而且要么無參,要么接收一個字串陣列,

static int Main(string[] args)
{
    // ...
    return 0;
}

args 引數是用于接收命令列引數的字串陣列,用 System.Environment.CommandLine 獲取執行程式所用的完整命令,

Main 回傳的 int 是狀態碼,標識程式執行是否成功,回傳非零值通常意味著錯誤,

雖然 Main 方法宣告可進行某種程度的變化,但關鍵字 static 和方法名 Main 是始終都是需要的,以下是有效 Main 示例:

static void Main() { }
static int Main() { }
static void Main(string[] args) { }
static int Main(string[] args) { }
static async Task Main() { }
static async Task<int> Main() { }
static async Task Main(string[] args) { }
static async Task<int> Main(string[] args) { }

花括號、方法體和代碼塊

{
    ...
}

一般來說,所有的 C# 方法都使用花括號標記方法體的開始和結束,這是規定,不能省略,只有花括號({})能起這種作用,圓括號(())和方括號([])都不行,

花括號還可用于把方法中的多條陳述句合并為一個單元或塊,

陳述句和陳述句分隔符

陳述句是描述一個型別或告訴程式去執行某個動作的一條源代碼指令,C# 通常用分號標識陳述句結束,每條陳述句都由代碼要執行的一個或多個行動構成,宣告變數、控制程式流程或呼叫方法,所有這些都是陳述句的例子,

例如,下面的代碼是一個由兩條簡單陳述句組成的序列,第一條陳述句定義了一個名稱為 var1 的整型變數,并初始化它的值為 5,第二條陳述句將變數 var1 的值列印到螢屏視窗,

int var1 = 5;
System.Console.WriteLine("The value of var1 is {0}", var1);

陳述句可以是以分號結尾的單行代碼,也可以是陳述句塊中的一系列單行陳述句, 陳述句塊括在括號 {} 中,并且可以包含嵌套塊, 以下代碼演示了兩個單行陳述句示例和一個多行陳述句塊:

namespace ConsoleApp
{
    class Program
    {
        static void Main()
        {
            // Declaration statement.
            int counter;

            // Assignment statement.
            counter = 1;

            // Error! This is an expression, not an expression statement.
            // counter + 1; 

            // Declaration statements with initializers are functionally
            // equivalent to  declaration statement followed by assignment statement:         
            int[] radii = { 15, 32, 108, 74, 9 }; // Declare and initialize an array.
            const double pi = 3.14159; // Declare and initialize  constant.          

            // foreach statement block that contains multiple statements.
            foreach (int radius in radii)
            {
                // Declaration statement with initializer.
                double circumference = pi * (2 * radius);

                // Expression statement (method invocation). A single-line
                // statement can span multiple text lines because line breaks
                // are treated as white space, which is ignored by the compiler.
                System.Console.WriteLine("Radius of circle #{0} is {1}. Circumference = {2:N2}",
                    counter, radius, circumference);

                // Expression statement (postfix increment).
                counter++;

            } // End of foreach statement block
        } // End of Main method body.
    } // End of SimpleStatements class.
}

由于換行與否不影響陳述句的分隔,所以可將多條陳述句放到同一行,C# 編譯器認為這一行包含多條指令,例如,下面的代碼在同一行包含了兩條陳述句,

int var1 = 5;System.Console.WriteLine("The value of var1 is {0}", var1);

C# 還允許一條陳述句跨越多行,同樣地,C# 編譯器根據分號判斷陳述句結束位置,

System
.Console.
WriteLine
("The value of var1 is {0}",
    var1);

空白

程式中的空白指的是沒有可視化輸出的字符,程式員在源代碼中使用的空白將被編譯器忽略,但使代碼更清晰易讀,空白字符包括:空格(Space)、制表符(Tab)、換行符、回車符,

例如,下面的代碼段會被編譯器完全相同地對待而不管它們表面上的區別,

// 推薦的格式
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
    }
}
// 連在一起(不推薦的格式)
class Program {static void Main(string[] args){Console.WriteLine("Hello World!");}}

為了增強可讀性,用空白對代碼進行縮進很有必要,寫代碼時要遵循制訂好的編碼標準和約定,以增強代碼的可讀性,

注釋

注釋,是代碼中的一些“說明性文字”,注釋本身不會參與程式的編譯和運行,僅僅供程式員閱讀,

注釋分為:單行注釋、多行注釋、檔案注釋,

單行注釋的符號是 2 條斜線(請注意斜線的方向),2 條斜線右側的內容就是注釋,左側的代碼不會受影響,

多行注釋以“/*”開始,以“*/”結束,之間的內容就是注釋,可以包含多行,

檔案注釋寫在類、方法或屬性,它的符號是 3 條斜線“///”,

/// <summary>
/// XML(檔案)注釋
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
    // 單行注釋
    var item = (Name: "eggplant", Price: 1.99m, perPackage: 3);

    /* 多行注釋(可以寫一行,也可以寫多行) */
    var date = DateTime.Now;

    /*
    多行注釋
    注釋注釋
    注釋
    */
    Console.WriteLine($"On {date}, the price of {item.Name} was {item.Price:C2} per {item.perPackage} items.");

    /*
    * 這樣比較好看
    * 嗯呢,好看
    * 漂亮
    */
    Console.WriteLine();

    Console./*這是有多閑才這么寫啊*/WriteLine();
}

編譯器會忽略所有的注釋,所以生成的程式集中看不到源代碼中的任何注釋,

總結

一門語言的語法是一套規則,用于管理語言中各有效陳述句組合在一起的方式,

原文鏈接:https://www.vinanysoft.com/c-sharp-basics/introducing/c-sharp-syntax-fundamentals/

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/96184.html

標籤:C#

上一篇:學習 C#,從 Hello world 開始吧

下一篇:HALCON資料型別和C#對應資料型別的對比

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more