C# 基础教程 – wiki基地


C# 基础教程:从零开始掌握编程利器

欢迎踏上编程之旅!如果你选择 C# 作为你的第一门编程语言,或者希望系统地学习 C# 的基础知识,那么你来对地方了。C# 是一门强大、灵活且应用广泛的编程语言,由微软公司开发,常用于构建 Windows 桌面应用、Web 应用、移动应用、游戏开发(使用 Unity)以及现代云服务等。

本教程将带你一步步了解 C# 的核心概念,从安装开发环境到编写第一个程序,再到掌握变量、数据类型、控制流、方法以及面向对象的基础。我们将通过丰富的代码示例,让你边学边练,扎实地打下 C# 编程基础。

本教程涵盖以下主要内容:

  1. C# 初探:它是什么,为什么选择它?
  2. 准备开发环境:安装 Visual Studio 或 VS Code 和 .NET SDK
  3. 你的第一个 C# 程序:Hello, World!
  4. 理解程序结构:命名空间、类、Main 方法
  5. 代码中的注释
  6. 变量与数据类型:存储数据
  7. C# 中的运算符
  8. 控制流程:让程序“思考”和“决策”
    • 条件语句:if, else if, else, switch
    • 循环语句:for, while, do-while, foreach
  9. 数组:存储同类型数据的集合
  10. 字符串:处理文本
  11. 方法:组织代码,提高复用性
  12. 初识面向对象:类与对象的基本概念
  13. 其他重要概念:命名空间、基本异常处理、控制台输入输出
  14. 下一步:继续深入学习的方向

准备好了吗?让我们开始吧!

1. C# 初探:它是什么,为什么选择它?

什么是 C#?

C# (读作 C-sharp) 是一门现代的、面向对象的编程语言,由微软公司于 2000 年发布。它是 .NET 平台的核心语言之一。.NET 是一个免费、跨平台、开源的开发平台,用于构建各种应用程序。

为什么选择 C#?

  • 强大且多用途: C# 可以用于开发各种应用,包括:
    • 桌面应用: 使用 WPF、WinForms 或最新的 MAUI(用于跨平台桌面和移动应用)。
    • Web 应用: 使用 ASP.NET Core 构建高性能的网站和后端服务。
    • 移动应用: 使用 MAUI 或 Xamarin(MAUI 的前身)开发跨平台的 iOS 和 Android 应用。
    • 游戏开发: Unity 游戏引擎广泛使用 C# 作为其主要开发语言。
    • 云服务: 利用 Azure 或 AWS 等云平台构建和部署 C# 应用程序。
    • 人工智能与机器学习: .NET 生态系统提供了 ML.NET 等库支持相关开发。
  • 易于学习: C# 语法清晰、直观,借鉴了 C++ 和 Java 等语言的优点,对于有其他语言基础的开发者来说尤其容易上手。即使是编程新手,其良好的结构和丰富的文档也能帮助你快速入门。
  • 面向对象: C# 是一门纯粹的面向对象语言,这有助于组织和管理复杂的代码,提高代码的可维护性和可重用性。
  • 完善的生态系统: 借助于 .NET 平台,C# 拥有庞大的类库 (BCL – Base Class Library) 和强大的工具(如 Visual Studio),为开发提供了极大的便利。
  • 社区支持: C# 拥有一个活跃的全球开发者社区,当你遇到问题时,很容易找到帮助和资源。

2. 准备开发环境:安装 Visual Studio 或 VS Code 和 .NET SDK

在开始编写 C# 代码之前,你需要安装相应的开发工具。最常用的选择是 Visual Studio(功能全面的集成开发环境 IDE)或 Visual Studio Code (VS Code) 配合 .NET SDK(轻量级代码编辑器)。

选项 1:Visual Studio (推荐 Windows 用户)

Visual Studio 是微软官方提供的功能强大的 IDE,集代码编辑、编译、调试、版本控制等功能于一体。

  1. 访问 Visual Studio 官方网站:https://visualstudio.microsoft.com/zh-hans/downloads/
  2. 下载并运行 Visual Studio Community 版本(免费供个人开发者、学生和开源贡献者使用)。
  3. 在安装过程中,选择你需要的工作负载(Workloads)。对于基础学习,建议选择:
    • .NET 桌面开发
    • ASP.NET 和 Web 开发 (如果你对 Web 开发感兴趣)
    • .NET Core 跨平台开发 (现在通常包含在其他 .NET 工作负载中)
  4. 点击安装,等待安装完成。

选项 2:Visual Studio Code (跨平台,轻量级)

VS Code 是一个免费、开源、跨平台的代码编辑器,通过安装扩展来支持各种语言。

  1. 访问 VS Code 官方网站:https://code.visualstudio.com/ 下载并安装适用于你的操作系统的版本。
  2. 安装 .NET SDK:访问 .NET 官方网站,下载并安装最新版本的 .NET SDK。安装完成后,你可以在终端或命令提示符中运行 dotnet --version 来验证是否安装成功。
  3. 打开 VS Code,进入 Extensions (扩展) 视图 (快捷键 Ctrl+Shift+X),搜索并安装 C# 扩展 (通常由 Microsoft 提供)。

安装完成后,你就可以创建和运行 C# 程序了。本教程中的代码示例可以在任一环境中运行。

3. 你的第一个 C# 程序:Hello, World!

按照编程界的传统,我们的第一个程序将是输出 “Hello, World!”。

使用 Visual Studio 创建:

  1. 打开 Visual Studio。
  2. 选择 创建新项目
  3. 在项目模板搜索框中输入 “Console Application” (控制台应用),选择对应的 C# 模板,然后点击 下一步
  4. 输入项目名称 (例如 HelloWorld) 和存储位置,点击 下一步
  5. 选择目标框架 (建议选择最新的 .NET 版本),然后点击 创建
  6. Visual Studio 会自动为你创建一个包含基本代码的程序文件 (通常是 Program.cs)。

使用 VS Code 创建:

  1. 打开终端或命令提示符。
  2. 创建一个新的文件夹用于存放项目,例如 mkdir HelloWorld
  3. 进入该文件夹:cd HelloWorld
  4. 使用 .NET CLI (命令行界面) 创建一个新的控制台项目:dotnet new console
  5. VS Code 中打开这个文件夹:code .。你会看到 Program.cs 文件。

无论使用哪种方式,你都会得到类似以下结构的代码文件 (Program.cs):

“`csharp
using System; // 导入 System 命名空间

// 声明一个命名空间,用于组织代码
namespace HelloWorld
{
// 声明一个类
class Program
{
// Main 方法是程序的入口点
static void Main(string[] args)
{
// 输出一行文本到控制台
Console.WriteLine(“Hello, World!”);
}
}
}
“`

要运行这个程序:

  • 在 Visual Studio 中: 直接点击工具栏上的“启动”按钮(通常是绿色的三角形),或者按下 F5 键。
  • 在 VS Code 中: 打开终端 (Terminal -> New Terminal),运行命令 dotnet run

你将在控制台窗口看到输出:Hello, World!

恭喜!你成功运行了第一个 C# 程序。

4. 理解程序结构:命名空间、类、Main 方法

让我们详细解析一下上面这段简单的代码:

  • using System;

    • 这行代码叫做 using 指令。它告诉编译器我们要使用 System 命名空间 中的类和功能。System 命名空间包含了 .NET 框架中最常用的类,比如用于控制台输入输出的 Console 类。使用 using 指令可以让我们直接使用命名空间中的类名(如 Console.WriteLine),而不需要写完整的限定名(如 System.Console.WriteLine)。
  • namespace HelloWorld

    • namespace 是用来组织代码的一种方式,可以防止不同代码文件中出现同名的类、接口等冲突。你可以将命名空间想象成文件夹,将相关的代码文件放在同一个“文件夹”下。HelloWorld 是我们定义的命名空间名称。
  • class Program

    • class 用于定义一个 类 (Class)。类是面向对象编程的基本构建块,它是一个模板或蓝图,用于创建 对象 (Object)。在控制台应用程序中,通常会有一个包含 Main 方法的类作为程序的起点。Program 是我们定义的类名。
  • static void Main(string[] args)

    • 这是程序的 入口点 (Entry Point)。当程序启动时,第一段执行的代码就是 Main 方法里的内容。
      • static:表示这个方法属于 Program 类本身,而不是属于 Program 类创建的任何特定对象。对于 Main 方法,它必须是静态的,因为程序启动时还没有创建任何对象。
      • void:表示这个方法不返回任何值。
      • Main:这是方法的名称,C# 程序从 Main 方法开始执行(方法名大小写敏感,必须是 Main)。
      • (string[] args):这是方法的参数列表。string[] args 表示一个字符串数组,它允许你在程序启动时向 Main 方法传递命令行参数。在大多数简单的控制台程序中,你可能不会用到这个参数。
  • Console.WriteLine("Hello, World!");

    • ConsoleSystem 命名空间中的一个静态类,提供了用于控制台输入输出的方法。
    • WriteLine()Console 类的一个静态方法,用于向控制台输出一行文本,并在末尾加上换行符。括号内的 "Hello, World!" 是要输出的文本,这是一个 字符串字面量
    • 注意行末的 ; 符号。在 C# 中,每个语句都必须以分号结束。

5. 代码中的注释

注释是写在代码中供开发者阅读的文本,编译器会忽略它们。注释对于解释代码的功能、目的和思路非常重要,尤其是在团队协作或编写复杂代码时。

C# 支持两种主要的注释类型:

  • 单行注释 (Single-line comments):// 开始,直到行末。

    csharp
    // 这是一行单行注释
    Console.WriteLine("Hello"); // 这一部分也是注释

  • 多行注释 (Multi-line comments):/* 开始,以 */ 结束,可以跨越多行。

    csharp
    /*
    这是一个
    多行注释。
    它可以包含多行文本。
    */
    Console.WriteLine("World");

  • XML 文档注释 (XML Documentation comments):/// 开始,通常用于方法、类、属性等的前面,用于生成代码文档。

    csharp
    /// <summary>
    /// 这是一个示例方法,用于演示 XML 文档注释。
    /// </summary>
    /// <param name="name">要打招呼的名字。</param>
    /// <returns>一个包含问候语的字符串。</returns>
    public static string SayHello(string name)
    {
    return $"Hello, {name}!";
    }

良好的注释习惯能让你和你的团队更轻松地理解和维护代码。

6. 变量与数据类型:存储数据

变量是用于存储数据值的容器。在使用变量之前,你需要声明它,指定它的 数据类型 (Data Type)变量名 (Variable Name)

数据类型 决定了变量可以存储哪种类型的数据(如整数、小数、文本等)以及该类型数据可以执行的操作。C# 中的数据类型大致分为两类:值类型 (Value Types)引用类型 (Reference Types)

常见的值类型:

  • 整型 (Integers): 用于存储整数(没有小数部分的数字)。
    • byte: 8 位无符号整数 (0 到 255)
    • short: 16 位有符号整数 (-32768 到 32767)
    • int: 32 位有符号整数 (最常用)
    • long: 64 位有符号整数 (用于存储非常大的整数)
  • 浮点型 (Floating-point types): 用于存储带有小数部分的数字。
    • float: 32 位单精度浮点数 (精度较低,以 fF 后缀结尾,如 1.23f)
    • double: 64 位双精度浮点数 (精度较高,最常用,默认类型,如 1.23)
    • decimal: 128 位高精度小数类型 (用于金融计算等需要精确小数的场景,以 mM 后缀结尾,如 1.23m)
  • 布尔型 (Boolean): 用于存储 truefalse 这两个逻辑值。
    • bool: 存储 truefalse
  • 字符型 (Character): 用于存储单个字符。
    • char: 存储单个 Unicode 字符 (用单引号 ' 包围,如 'A', '1', '\n')。

常见的引用类型:

  • 字符串 (String): 用于存储一串文本字符。
    • string: 存储文本 (用双引号 " 包围,如 "Hello"). stringSystem.String 类的别名。
  • 数组 (Arrays): 用于存储同类型数据的集合。
  • 类 (Classes)、接口 (Interfaces)、委托 (Delegates) 等。

声明和使用变量:

“`csharp
// 声明一个整数变量并初始化
int age = 30;

// 声明一个浮点数变量
double price;
// 给变量赋值
price = 19.99;

// 声明一个布尔变量
bool isStudent = true;

// 声明一个字符变量
char initial = ‘J’;

// 声明一个字符串变量
string name = “Alice”;

// 使用 var 关键字(隐式类型)
// 编译器会根据赋给变量的初始值自动推断变量的类型
var count = 100; // count 会被推断为 int
var message = “这是一条消息”; // message 会被推断为 string
var temperature = 25.5; // temperature 会被推断为 double

// 注意:使用 var 声明的变量必须在声明时初始化。

// 输出变量的值
Console.WriteLine(“姓名: ” + name); // 字符串拼接
Console.WriteLine($”年龄: {age}”); // 字符串插值 (推荐)
Console.WriteLine(“商品价格: ” + price + “元”);
“`

类型转换 (Type Casting):

在 C# 中,你可能需要将一个数据类型转换为另一个数据类型。这分为两种:

  • 隐式转换 (Implicit Conversion): 自动发生,通常发生在将“较小”的值类型转换为“较大”的值类型时,不会丢失数据。

    csharp
    int myInt = 10;
    double myDouble = myInt; // int 隐式转换为 double
    Console.WriteLine(myDouble); // 输出 10

  • 显式转换 (Explicit Conversion) 或强制转换 (Casting): 需要手动进行,通常发生在将“较大”的值类型转换为“较小”的值类型时,可能会丢失数据或引发错误。需要使用括号 () 指定目标类型。

    “`csharp
    double anotherDouble = 9.78;
    int anotherInt = (int)anotherDouble; // double 显式转换为 int,小数部分被截断
    Console.WriteLine(anotherInt); // 输出 9

    // 字符串与数字之间的转换通常使用 Convert 类或 Parse 方法
    string numStr = “123”;
    int num = int.Parse(numStr); // 将字符串转换为 int
    // 或者
    // int num = Convert.ToInt32(numStr); // Convert 类提供更多类型转换方法
    Console.WriteLine(num); // 输出 123

    string doubleStr = “45.67”;
    double dbl = double.Parse(doubleStr);
    Console.WriteLine(dbl); // 输出 45.67

    // 注意:如果字符串无法转换为目标类型,Parse 或 Convert 会抛出异常。
    // 可以使用 TryParse 方法进行更安全的转换,它返回一个 bool 值表示是否成功。
    string invalidStr = “abc”;
    int result;
    bool success = int.TryParse(invalidStr, out result); // 尝试转换,结果存储在 result 中
    Console.WriteLine($”转换是否成功: {success}, 结果: {result}”); // 输出 转换是否成功: False, 结果: 0 (默认值)
    “`

7. C# 中的运算符

运算符用于对变量和值执行操作。C# 支持多种运算符:

  • 算术运算符 (Arithmetic Operators): 用于执行数学运算。

    • +: 加
    • -: 减
    • *: 乘
    • /: 除
    • %: 取模 (余数)
    • ++: 自增 (将变量值加 1)
    • --: 自减 (将变量值减 1)

    csharp
    int a = 10;
    int b = 5;
    Console.WriteLine(a + b); // 15
    Console.WriteLine(a - b); // 5
    Console.WriteLine(a * b); // 50
    Console.WriteLine(a / b); // 2 (整数相除)
    Console.WriteLine(a % b); // 0
    a++; // a 现在是 11
    b--; // b 现在是 4
    Console.WriteLine($"a: {a}, b: {b}"); // a: 11, b: 4

  • 赋值运算符 (Assignment Operators): 用于给变量赋值。

    • =: 简单赋值
    • +=: 加等于 (x += y 等同于 x = x + y)
    • -=: 减等于 (x -= y 等同于 x = x - y)
    • *=: 乘等于 (x *= y 等同于 x = x * y)
    • /=: 除等于 (x /= y 等同于 x = x / y)
    • %=: 模等于 (x %= y 等同于 x = x % y)

    csharp
    int x = 10;
    x += 5; // x 现在是 15
    Console.WriteLine(x);
    x *= 2; // x 现在是 30
    Console.WriteLine(x);

  • 比较运算符 (Comparison Operators): 用于比较两个值,返回 bool (true 或 false)。

    • ==: 等于
    • !=: 不等于
    • >: 大于
    • <: 小于
    • >=: 大于或等于
    • <=: 小于或等于

    csharp
    int num1 = 10;
    int num2 = 15;
    Console.WriteLine(num1 == num2); // False
    Console.WriteLine(num1 != num2); // True
    Console.WriteLine(num1 < num2); // True
    Console.WriteLine(num1 >= 10); // True

  • 逻辑运算符 (Logical Operators): 用于组合布尔表达式,返回 bool

    • &&: 逻辑与 (如果两个条件都为 true,则结果为 true)
    • ||: 逻辑或 (如果任一条件为 true,则结果为 true)
    • !: 逻辑非 (反转布尔值)

    csharp
    bool isAdult = true;
    bool hasPermission = false;
    Console.WriteLine(isAdult && hasPermission); // False
    Console.WriteLine(isAdult || hasPermission); // True
    Console.WriteLine(!hasPermission); // True

  • 其他运算符:

    • ? :: 三元条件运算符 (简洁的 if-else 语句)
    • ?.: Null 条件运算符 (安全地访问成员,避免 NullReferenceException)
    • ??: Null 合并运算符 (为 null 变量提供默认值)

    “`csharp
    int score = 85;
    string status = (score >= 60) ? “及格” : “不及格”; // 如果 score >= 60 为 true,status = “及格”,否则 status = “不及格”
    Console.WriteLine(status); // 及格

    string city = null;
    // string upperCity = city.ToUpper(); // 这会抛出 NullReferenceException
    string upperCitySafe = city?.ToUpper(); // 如果 city 不为 null,则调用 ToUpper();否则结果为 null
    Console.WriteLine(upperCitySafe); // 输出空行 (或 null 的字符串表示)

    string userName = null;
    string displayeName = userName ?? “访客”; // 如果 userName 不为 null,则 displayeName = userName;否则 displayeName = “访客”
    Console.WriteLine($”欢迎您,{displayeName}”); // 欢迎您,访客
    “`

8. 控制流程:让程序“思考”和“决策”

控制流程语句决定了程序执行的顺序。C# 提供了多种控制流程语句:条件语句和循环语句。

条件语句 (Conditional Statements):

用于根据条件的真假执行不同的代码块。

  • if, else if, else:

    “`csharp
    int number = 10;

    if (number > 0)
    {
    Console.WriteLine(“数字是正数。”);
    }
    else if (number < 0)
    {
    Console.WriteLine(“数字是负数。”);
    }
    else
    {
    Console.WriteLine(“数字是零。”);
    }
    “`

  • switch: 用于在多个可能的执行路径中选择一个,通常用于基于某个变量的不同值执行不同操作。

    “`csharp
    int dayOfWeek = 3; // 1=周一, 2=周二, …

    switch (dayOfWeek)
    {
    case 1:
    Console.WriteLine(“星期一”);
    break; // 每个 case 必须以 break 或 return 或 throw 结束
    case 2:
    Console.WriteLine(“星期二”);
    break;
    case 3:
    Console.WriteLine(“星期三”);
    break;
    case 4:
    Console.WriteLine(“星期四”);
    break;
    case 5:
    Console.WriteLine(“星期五”);
    break;
    case 6:
    case 7: // 多个 case 可以指向同一个代码块
    Console.WriteLine(“周末”);
    break;
    default: // 当所有 case 都不匹配时执行
    Console.WriteLine(“无效的日期”);
    break;
    }
    “`

循环语句 (Loop Statements):

用于重复执行一段代码块。

  • for 循环: 当你知道循环需要执行的次数时常用。

    “`csharp
    // 从 0 数到 4
    for (int i = 0; i < 5; i++)
    {
    Console.WriteLine($”For 循环计数: {i}”);
    }

    // 从 10 数到 1 倒计时
    for (int j = 10; j > 0; j–)
    {
    Console.WriteLine($”倒计时: {j}”);
    }
    “`

  • while 循环: 当你不知道循环需要执行多少次,但知道循环继续的条件时常用。循环体在每次迭代开始时检查条件。

    csharp
    int count = 0;
    while (count < 3)
    {
    Console.WriteLine($"While 循环计数: {count}");
    count++; // 别忘了更新条件,否则会无限循环
    }

  • do-while 循环: 类似于 while 循环,但它先执行一次循环体,然后再检查条件。这保证了循环体至少会执行一次。

    csharp
    int k = 0;
    do
    {
    Console.WriteLine($"Do-While 循环计数: {k}");
    k++;
    } while (k < 3);

  • foreach 循环: 用于遍历数组或集合中的元素,无需关心索引或元素总数。

    “`csharp
    string[] fruits = {“Apple”, “Banana”, “Cherry”};

    foreach (string fruit in fruits)
    {
    Console.WriteLine($”我喜欢的水果: {fruit}”);
    }
    “`

  • breakcontinue:

    • break: 立即终止当前循环(或 switch 语句)的执行,跳到循环后面的第一条语句。
    • continue: 暂停当前循环迭代的剩余代码,直接开始下一次迭代。

    csharp
    for (int i = 0; i < 10; i++)
    {
    if (i == 3)
    {
    continue; // 跳过当前循环的剩余部分,继续下一次 (i=4)
    }
    if (i == 7)
    {
    break; // 终止整个循环
    }
    Console.WriteLine($"Current number: {i}");
    }
    // Output:
    // Current number: 0
    // Current number: 1
    // Current number: 2
    // Current number: 4
    // Current number: 5
    // Current number: 6

9. 数组:存储同类型数据的集合

数组是一个存储相同类型元素的固定大小的顺序集合。

声明和初始化数组:

“`csharp
// 声明一个整数数组,指定大小,元素默认值为 0
int[] numbers = new int[5]; // 创建一个包含 5 个 int 元素的数组

// 声明一个字符串数组并初始化元素
string[] names = {“Alice”, “Bob”, “Charlie”};

// 声明并初始化一个整数数组
int[] scores = new int[] { 85, 90, 78, 92 };

// 使用 var 隐式类型声明数组 (必须同时初始化)
var temperatures = new[] { 25.5, 26.1, 24.8 }; // 数组类型被推断为 double[]
“`

访问数组元素:

数组的元素通过 索引 (Index) 来访问,索引从 0 开始。

“`csharp
string firstName = names[0]; // 获取第一个元素 “Alice”
int thirdScore = scores[2]; // 获取第三个元素 78

Console.WriteLine($”第一个名字: {firstName}”);
Console.WriteLine($”第三个分数: {thirdScore}”);

// 修改数组元素
numbers[0] = 10;
numbers[1] = 20;
Console.WriteLine($”numbers[0]: {numbers[0]}”); // 输出 10
“`

数组的长度:

可以使用 .Length 属性获取数组的元素个数。

csharp
Console.WriteLine($"names 数组的长度: {names.Length}"); // 输出 3

遍历数组:

可以使用 for 循环或 foreach 循环遍历数组。

“`csharp
// 使用 for 循环遍历
for (int i = 0; i < names.Length; i++)
{
Console.WriteLine($”名字索引 {i}: {names[i]}”);
}

// 使用 foreach 循环遍历 (更简洁,推荐用于只需要访问元素值的情况)
foreach (string name in names)
{
Console.WriteLine($”当前名字: {name}”);
}
“`

10. 字符串:处理文本

string 类型用于存储文本。字符串是引用类型,但由于其常用性,C# 为字符串提供了很多便利的操作。字符串是 不可变的 (Immutable),这意味着一旦创建,你就不能改变字符串对象本身。任何看起来修改字符串的操作实际上都会创建一个新的字符串对象。

声明字符串:

csharp
string greeting = "Hello";
string message = "世界";

字符串拼接:

使用 + 运算符或 string.Concat() 方法。

csharp
string combined = greeting + ", " + message + "!"; // Hello, 世界!
string combined2 = string.Concat(greeting, ", ", message, "!"); // Hello, 世界!

字符串插值 (String Interpolation):

使用 $"" 语法,可以将变量或表达式直接嵌入到字符串字面量中,非常方便且可读性高。

csharp
int year = 2023;
string interpolated = $"今天是 {year} 年,{greeting},{message}!"; // 今天是 2023 年,Hello,世界!
Console.WriteLine(interpolated);

常用的字符串方法和属性:

  • .Length: 获取字符串的长度(字符个数)。
  • .ToUpper(), .ToLower(): 转换为大写或小写。
  • .Contains(substring): 判断字符串是否包含指定的子字符串。
  • .StartsWith(prefix), .EndsWith(suffix): 判断字符串是否以指定的前缀或后缀开始/结束。
  • .IndexOf(substring), .LastIndexOf(substring): 查找子字符串第一次/最后一次出现的位置(索引)。
  • .Substring(startIndex, length): 提取子字符串。
  • .Replace(oldValue, newValue): 替换字符串中的部分内容。
  • .Split(separator): 根据指定的分隔符将字符串分割成字符串数组。
  • .Trim(), .TrimStart(), .TrimEnd(): 移除字符串开头/结尾的空白字符。

csharp
string example = " Hello, World! ";
Console.WriteLine($"原字符串长度: {example.Length}"); // 17
Console.WriteLine($"去除空白后: '{example.Trim()}'"); // 'Hello, World!'
Console.WriteLine($"大写: {example.ToUpper()}"); // HELLO, WORLD!
Console.WriteLine($"是否包含 'World': {example.Contains("World")}"); // True
Console.WriteLine($"索引 of 'o': {example.IndexOf("o")}"); // 4
string part = example.Substring(4, 5); // 从索引 4 开始取 5 个字符
Console.WriteLine($"子字符串: '{part}'"); // lo, W
string replaced = example.Replace("World", "C#");
Console.WriteLine($"替换后: '{replaced}'"); // Hello, C#!
string[] words = "Apple,Banana,Cherry".Split(',');
Console.WriteLine($"分割后的第一个词: {words[0]}"); // Apple

11. 方法:组织代码,提高复用性

方法 (Method) 是一段执行特定任务的代码块。使用方法可以将你的程序分解成更小、更易于管理和理解的部分。方法还可以让你避免重复编写相同的代码(代码复用)。

定义方法:

方法的定义通常包括:访问修饰符(如 public, private)、static 关键字(如果方法属于类本身而不是对象)、返回类型、方法名和参数列表。

“`csharp
// 定义一个不带参数、不返回值的静态方法
public static void Greet()
{
Console.WriteLine(“您好!”);
}

// 定义一个带一个参数、不返回值的静态方法
public static void GreetPerson(string name)
{
Console.WriteLine($”您好,{name}!”);
}

// 定义一个带两个参数、返回一个字符串值的静态方法
public static string CreateGreetingMessage(string name, int hour)
{
string timeOfDay;
if (hour < 12)
{
timeOfDay = “上午”;
}
else if (hour < 18)
{
timeOfDay = “下午”;
}
else
{
timeOfDay = “晚上”;
}
return $”{timeOfDay}好,{name}!”; // 使用 return 关键字返回一个值
}
“`

调用方法:

Main 方法或另一个方法中调用你定义的方法。

“`csharp
static void Main(string[] args)
{
Greet(); // 调用 Greet 方法

GreetPerson("张三"); // 调用 GreetPerson 方法并传递参数

string message = CreateGreetingMessage("李四", 9); // 调用 CreateGreetingMessage 方法并接收返回值
Console.WriteLine(message); // 上午好,李四!

string eveningMessage = CreateGreetingMessage("王五", 20);
Console.WriteLine(eveningMessage); // 晚上好,王五!

}
“`

方法重载 (Method Overloading):

在同一个类中,你可以定义多个同名的方法,只要它们的参数列表不同(参数个数不同,或者参数类型不同,或者参数顺序不同)。这称为方法重载。

“`csharp
public static int Add(int a, int b)
{
return a + b;
}

// 重载 Add 方法,接受 double 类型的参数
public static double Add(double a, double b)
{
return a + b;
}

// 重载 Add 方法,接受三个 int 类型的参数
public static int Add(int a, int b, int c)
{
return a + b + c;
}

static void Main(string[] args)
{
Console.WriteLine(Add(5, 3)); // 调用第一个 Add 方法 (int)
Console.WriteLine(Add(5.5, 3.2)); // 调用第二个 Add 方法 (double)
Console.WriteLine(Add(1, 2, 3)); // 调用第三个 Add 方法 (int, int, int)
}
“`

12. 初识面向对象:类与对象的基本概念

C# 是一门面向对象的语言 (Object-Oriented Programming, OOP)。OOP 是一种编程范式,它将程序设计看作是对象之间的交互。对象是现实世界中事物在程序中的抽象,它有自己的 属性 (Properties)(数据)和 行为 (Behaviors)(方法)。

类 (Class):

类是创建对象的蓝图或模板。它定义了对象的属性(数据成员,也叫字段或属性)和行为(方法成员)。

对象 (Object):

对象是类的一个实例。你可以根据同一个类创建多个不同的对象,每个对象都有自己独立的数据。

示例:创建一个简单的 Person

“`csharp
// 定义一个 Person 类
public class Person
{
// 属性 (数据成员)
public string Name { get; set; } // Name 属性,类型是 string
public int Age { get; set; } // Age 属性,类型是 int

// 构造函数 (用于创建对象时初始化属性)
public Person(string name, int age)
{
    Name = name;
    Age = age;
}

// 方法 (行为成员)
public void SayHello()
{
    Console.WriteLine($"你好,我的名字是 {Name},我今年 {Age} 岁。");
}

}
“`

创建和使用对象:

Main 方法或其他地方,你可以使用 new 关键字根据类创建对象。

“`csharp
static void Main(string[] args)
{
// 创建一个 Person 对象
Person person1 = new Person(“爱丽丝”, 25);

// 访问对象的属性
Console.WriteLine($"姓名: {person1.Name}");
Console.WriteLine($"年龄: {person1.Age}");

// 调用对象的方法
person1.SayHello(); // 输出: 你好,我的名字是 爱丽丝,我今年 25 岁。

// 创建另一个 Person 对象
Person person2 = new Person("鲍勃", 30);
person2.SayHello(); // 输出: 你好,我的名字是 鲍勃,我今年 30 岁。

}
“`

在这个例子中,Person 是一个类,person1person2Person 类的两个不同的对象(实例)。它们都拥有 NameAge 属性以及 SayHello 方法,但它们各自存储了不同的属性值。

面向对象编程还有许多更深入的概念,如继承、多态、抽象、接口等,这些是你在掌握基础后需要进一步学习的重要内容。

13. 其他重要概念:命名空间、基本异常处理、控制台输入输出

命名空间 (Namespaces):

前面已经提到了命名空间用于组织代码。它提供了一种避免命名冲突的方式。在大型项目中,你会经常使用不同的命名空间来分类和管理代码。

“`csharp
// 通常你的代码会在一个或多个命名空间内
namespace MyApp.Utilities
{
public class Helper
{
public static void PrintMessage(string message)
{
Console.WriteLine($”[Helper] {message}”);
}
}
}

namespace MyApp.DataProcessing
{
public class Processor
{
public void Process()
{
// 如果不使用 using 指令,需要写完整的命名空间+类名
MyApp.Utilities.Helper.PrintMessage(“开始处理数据…”);
// … 处理逻辑 …
MyApp.Utilities.Helper.PrintMessage(“数据处理完成。”);
}
}
}

// 在另一个文件或命名空间中使用它们
using MyApp.Utilities; // 使用 using 指令导入命名空间
using MyApp.DataProcessing;

namespace MyApp.MainProgram
{
class Program
{
static void Main(string[] args)
{
Helper.PrintMessage(“程序启动。”); // 直接使用类名,因为导入了命名空间

        Processor processor = new Processor();
        processor.Process();

        Console.WriteLine("程序结束。");
    }
}

}
“`

基本异常处理 (Basic Exception Handling):

程序运行时可能会遇到错误,导致程序崩溃。这些运行时错误称为 异常 (Exceptions)。为了让程序更健壮,你需要学会处理这些异常。C# 使用 try-catch 块来捕获和处理异常。

  • try 块:包含可能抛出异常的代码。
  • catch 块:用于捕获并处理特定类型的异常。

“`csharp
static void Main(string[] args)
{
Console.WriteLine(“请输入一个数字:”);
string input = Console.ReadLine();

try
{
    // 这段代码可能因为输入无效而抛出 FormatException
    int number = int.Parse(input);
    int result = 100 / number; // 这段代码可能因为 number 为 0 而抛出 DivideByZeroException

    Console.WriteLine($"您输入的数字是: {number}");
    Console.WriteLine($"100 除以该数字的结果是: {result}");
}
catch (FormatException ex)
{
    // 捕获 FormatException (当输入不是一个有效数字时发生)
    Console.WriteLine($"错误:您输入的 '{input}' 不是一个有效的数字格式。");
    // 可以打印异常信息,但对于用户友好,通常只打印简化错误信息
    // Console.WriteLine($"详细错误: {ex.Message}");
}
catch (DivideByZeroException ex)
{
    // 捕获 DivideByZeroException (当除数为零时发生)
    Console.WriteLine("错误:除数不能为零。");
    // Console.WriteLine($"详细错误: {ex.Message}");
}
catch (Exception ex) // 捕获其他所有类型的异常
{
    Console.WriteLine($"发生了未知错误: {ex.Message}");
}
finally
{
    // finally 块是可选的,无论是否发生异常,其中的代码总会被执行
    Console.WriteLine("异常处理流程结束。");
}

Console.WriteLine("程序继续执行。");

}
“`

try-catch 块使得你可以在发生错误时优雅地处理问题,而不是让程序突然终止。

控制台输入输出 (Console Input/Output):

我们已经多次使用 Console.WriteLine() 进行输出。要从用户获取输入,可以使用 Console.ReadLine()

  • Console.ReadLine(): 从控制台读取用户输入的一整行文本,返回一个字符串。

“`csharp
static void Main(string[] args)
{
Console.Write(“请输入您的名字:”); // Console.Write 不换行
string userName = Console.ReadLine(); // 读取用户输入的整行文本

Console.Write("请输入您的年龄:");
string ageString = Console.ReadLine();

// Console.ReadLine() 返回的是字符串,如果需要数字,需要进行转换
try
{
    int userAge = int.Parse(ageString);
    Console.WriteLine($"你好,{userName}!你今年 {userAge} 岁。");
}
catch (FormatException)
{
    Console.WriteLine("年龄输入无效,请输入一个数字。");
}

}
“`

14. 下一步:继续深入学习的方向

恭喜你完成了 C# 基础知识的学习!这仅仅是 C# 编程世界的冰山一角。要成为一名熟练的 C# 开发者,你需要继续探索以下方向:

  • 更深入的面向对象概念: 继承 (Inheritance)、多态 (Polymorphism)、抽象类 (Abstract Classes)、接口 (Interfaces)。
  • 集合 (Collections): 学习使用 List<T>, Dictionary<TKey, TValue>, HashSet<T> 等泛型集合类,它们比数组更灵活。
  • 泛型 (Generics): 学习如何创建类型安全且可重用的类、接口和方法。
  • 委托 (Delegates) 和事件 (Events): 理解如何实现事件驱动编程。
  • LINQ (Language Integrated Query): 学习如何方便地查询和操作各种数据源(如集合、数据库、XML)。
  • 文件和流 (File and Stream I/O): 学习如何读写文件。
  • 多线程和异步编程 (Multithreading and Asynchronous Programming): 学习如何编写同时执行多个任务的程序,以及如何编写不会阻塞用户界面的响应式程序(async/await)。
  • .NET 生态系统:
    • ASP.NET Core: Web 应用开发框架。
    • Entity Framework Core: 对象关系映射 (ORM) 框架,用于数据库操作。
    • WPF/WinForms/MAUI: 桌面和移动应用开发框架。
    • Unity: 游戏开发引擎。
  • 设计模式 (Design Patterns): 学习软件设计中常用的解决方案模板。
  • 测试 (Testing): 学习单元测试、集成测试等,确保代码质量。

实践是最好的老师。 在学习新概念的同时,尝试编写小型项目来巩固知识。可以在 GitHub 等平台找到开源项目,阅读别人的代码也是一种很好的学习方式。

总结

本教程带你学习了 C# 编程的基础知识,包括:

  • C# 的基本概念和应用领域
  • 开发环境的搭建
  • 第一个 “Hello, World!” 程序
  • 程序的基本结构(命名空间、类、Main 方法)
  • 变量、数据类型和类型转换
  • 各种运算符的使用
  • 控制流程语句(if, switch, for, while, do-while, foreach)
  • 数组的使用
  • 字符串的操作
  • 方法的定义和调用
  • 面向对象编程的初步概念(类和对象)
  • 命名空间、异常处理和控制台输入输出

掌握这些基础知识,你就已经迈出了成为一名 C# 程序员的第一步。继续学习、不断实践,祝你在 C# 的编程世界中取得成功!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部