首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> C# 入門

C# 程式結構完整指南:命名空間、類別、Main、陳述式、編譯執行與專案結構

     編輯:C# 入門

C# 程式結構完整指南:命名空間、類別、Main、陳述式、編譯執行與專案結構

理解 C# 程式結構是組織、建置、部署應用程式的基礎。本文詳細說明命名空間、類別、Main 入口點、陳述式/運算式、編譯執行流程、專案檔結構、現代 .NET 專案範本。

程式基本元素

// 1. using 指令:引入命名空間型別
using System;
using System.Collections.Generic;

// 2. 命名空間:邏輯分組,防止名稱衝突
namespace MyApp {
    // 3. 類別:資料與行為封裝
    public class Program {
        // 4. Main 方法:程式進入點
        public static void Main(string[] args) {
            // 5. 陳述式與運算式
            Console.WriteLine("Hello, World!");
            var message = "Hello"; // 運算式
            Console.WriteLine(message); // 陳述式
        }
    }
}

現代簡化結構

最上層陳述式

.NET 6+ 專案範本預設:

// Program.cs - 完整程式
using System;
using System.Linq;

var names = new[] { "Alice", "Bob", "Charlie" };
var greeting = $"Hello, {string.Join(", ", names)}!";
Console.WriteLine(greeting);

編譯器自動產生 Program 類別與 Main 方法。適用於腳本、控制台應用、最小 API。

檔案範圍命名空間

namespace MyApp; // 整個檔案

public class Service { }

Main 方法詳細

簽章用途版本
static void Main()基本1.0+
static int Main()回傳結束代碼1.0+
static void Main(string[] args)命令列參數1.0+
static int Main(string[] args)參數 + 結束代碼1.0+
static async Task Main()非同步7.1+
static async Task Main(string[] args)非同步 + 參數 + 代碼7.1+

參數:args[0] 為第一個參數 (非程式名稱)。Windows 檔案關聯啟動時參數包含檔案路徑。

陳述式 vs 運算式

類別說明範例
宣告陳述式宣告變數/常數int x = 1;
運算式陳述式運算式後加分號x++;, Method();
選擇陳述式if, switchif (x>0) {}
迭代陳述式for, foreach, while, do-whilefor (int i=0; i<10; i++) {}
跳躍陳述式break, continue, return, throw, gotoreturn x;
try 陳述式try-catch-finallytry {} catch {}
checked/unchecked溢位檢查內容checked { x = y * z; }
lock/using資源管理using (var f = File.Open(...)) {}

專案結構與檔案

.csproj 專案檔

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>      <!-- 自動引入常用命名空間 -->
    <Nullable>enable</Nullable>                  <!-- 可為 Null 參考型別 -->
  </PropertyGroup>
  
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
  </ItemGroup>
</Project>

常見專案類型

範本OutputType用途
consoleExe控制台應用
classlibLibrary類別庫 (DLL)
webapiExeASP.NET Core Web API
mvcExeASP.NET Core MVC
blazorExeBlazor WebAssembly/Server
xunit/nunit/mstestLibrary單元測試專案
workerExe背景服務

標準目錄結構

MySolution/
├── src/
│   ├── MyApp/              # 主控制台專案
│   │   ├── Program.cs
│   │   ├── Services/
│   │   └── MyApp.csproj
│   ├── MyApp.Core/         # 核心領域邏輯 (ClassLib)
│   └── MyApp.Infrastructure/ # 基礎設施實作 (ClassLib)
├── tests/
│   ├── MyApp.UnitTests/
│   └── MyApp.IntegrationTests/
├── MySolution.sln
├── Directory.Build.props   # 共用建置屬性
└── nuget.config            # NuGet 來源設定

編譯流程

  1. 語法分析:.cs → 語法樹
  2. 語意分析:型別檢查、多載解析、常數摺疊
  3. IL 產生:語法樹 → IL 程式碼 + 中繼資料
  4. 組件封裝:IL + 中繼資料 + 資源 → .dll/.exe (PE 格式)
  5. 執行期:CLR 載入組件 → JIT 編譯 IL → 原生機器碼 → 執行

建置輸出

bin/
├── Debug/
│   └── net8.0/
│       ├── MyApp.dll           # 組件
│       ├── MyApp.pdb           # 偵錯符號
│       ├── MyApp.deps.json     # 相依性圖
│       ├── MyApp.runtimeconfig.json # 執行期設定
│       └── ref/                # 參考組件 (僅公開 API)
└── Release/...

執行模式

模式特點適用
Framework-dependent需目標機安裝 .NET Runtime伺服器、開發機、容器基底映像含 Runtime
Self-contained包含 Runtime,單一執行檔無法安裝 Runtime 環境、邊緣裝置、單一檔案部署
Single-file發布為單一 .exe簡化部署、啟動稍慢 (解壓縮)
AOT (NativeAOT)編譯為原生碼,無 JIT啟動極快、體積小、無動態載入

命名空間組織原則

  • Company.Product.Module:Acme.Sales.Ordering
  • 功能垂直切分:Domain, Application, Infrastructure, Presentation
  • 避免過深巢狀:3-4 層為宜
  • 介面與實作分離:MyApp.Abstractions vs MyApp.SqlServer

最佳實踐

  • 專案獨立性:每個專案單一職責,透過專案參考/套件參考相依。
  • Directory.Build.props:集中管理版本、編譯選項、分析器。
  • ImplicitUsings:減少重複 using,專案層級管理全域引入。
  • Nullable Context:全域啟用,漸進式修復警告。
  • 來源產生器:編譯期產生程式碼,減少反射/執行期開銷。
  • 測試專案隔離:獨立目錄、獨立命名空間、不發布。

常見問題 FAQ

Q: 最上層陳述式可以有多個檔案嗎?

A: 不可以。一個專案只能有一個檔案包含最上層陳述式 (預設 Program.cs)。其他檔案需用傳統結構。

Q: 如何指定自訂 Main 進入點?

A: 專案檔 <StartupObject>MyApp.Program</StartupObject> 或編譯器 /main:MyApp.Program。

Q: 類別庫可以有 Main 嗎?

A: 可以 (設定 OutputType>Exe</OutputType),但慣例類別庫為 Library,測試/主控台專案參考它。

Q: 什麼是 ref 組件?

A: bin/Debug/net8.0/ref/MyApp.dll 僅包含公開 API 中繼資料,供編譯時參考,加速建置、避免循環參考。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved