C# 基础教程:从零开始掌握编程利器
欢迎踏上编程之旅!如果你选择 C# 作为你的第一门编程语言,或者希望系统地学习 C# 的基础知识,那么你来对地方了。C# 是一门强大、灵活且应用广泛的编程语言,由微软公司开发,常用于构建 Windows 桌面应用、Web 应用、移动应用、游戏开发(使用 Unity)以及现代云服务等。
本教程将带你一步步了解 C# 的核心概念,从安装开发环境到编写第一个程序,再到掌握变量、数据类型、控制流、方法以及面向对象的基础。我们将通过丰富的代码示例,让你边学边练,扎实地打下 C# 编程基础。
本教程涵盖以下主要内容:
- C# 初探:它是什么,为什么选择它?
- 准备开发环境:安装 Visual Studio 或 VS Code 和 .NET SDK
- 你的第一个 C# 程序:Hello, World!
- 理解程序结构:命名空间、类、Main 方法
- 代码中的注释
- 变量与数据类型:存储数据
- C# 中的运算符
- 控制流程:让程序“思考”和“决策”
- 条件语句:if, else if, else, switch
- 循环语句:for, while, do-while, foreach
- 数组:存储同类型数据的集合
- 字符串:处理文本
- 方法:组织代码,提高复用性
- 初识面向对象:类与对象的基本概念
- 其他重要概念:命名空间、基本异常处理、控制台输入输出
- 下一步:继续深入学习的方向
准备好了吗?让我们开始吧!
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,集代码编辑、编译、调试、版本控制等功能于一体。
- 访问 Visual Studio 官方网站:
https://visualstudio.microsoft.com/zh-hans/downloads/
- 下载并运行 Visual Studio Community 版本(免费供个人开发者、学生和开源贡献者使用)。
- 在安装过程中,选择你需要的工作负载(Workloads)。对于基础学习,建议选择:
.NET 桌面开发
ASP.NET 和 Web 开发
(如果你对 Web 开发感兴趣).NET Core 跨平台开发
(现在通常包含在其他 .NET 工作负载中)
- 点击安装,等待安装完成。
选项 2:Visual Studio Code (跨平台,轻量级)
VS Code 是一个免费、开源、跨平台的代码编辑器,通过安装扩展来支持各种语言。
- 访问 VS Code 官方网站:
https://code.visualstudio.com/
下载并安装适用于你的操作系统的版本。 - 安装 .NET SDK:访问 .NET 官方网站,下载并安装最新版本的 .NET SDK。安装完成后,你可以在终端或命令提示符中运行
dotnet --version
来验证是否安装成功。 - 打开 VS Code,进入 Extensions (扩展) 视图 (快捷键 Ctrl+Shift+X),搜索并安装
C#
扩展 (通常由 Microsoft 提供)。
安装完成后,你就可以创建和运行 C# 程序了。本教程中的代码示例可以在任一环境中运行。
3. 你的第一个 C# 程序:Hello, World!
按照编程界的传统,我们的第一个程序将是输出 “Hello, World!”。
使用 Visual Studio 创建:
- 打开 Visual Studio。
- 选择
创建新项目
。 - 在项目模板搜索框中输入 “Console Application” (控制台应用),选择对应的 C# 模板,然后点击
下一步
。 - 输入项目名称 (例如
HelloWorld
) 和存储位置,点击下一步
。 - 选择目标框架 (建议选择最新的 .NET 版本),然后点击
创建
。 - Visual Studio 会自动为你创建一个包含基本代码的程序文件 (通常是
Program.cs
)。
使用 VS Code 创建:
- 打开终端或命令提示符。
- 创建一个新的文件夹用于存放项目,例如
mkdir HelloWorld
。 - 进入该文件夹:
cd HelloWorld
。 - 使用 .NET CLI (命令行界面) 创建一个新的控制台项目:
dotnet new console
。 - 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
)。
- 这行代码叫做 using 指令。它告诉编译器我们要使用
-
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 方法传递命令行参数。在大多数简单的控制台程序中,你可能不会用到这个参数。
- 这是程序的 入口点 (Entry Point)。当程序启动时,第一段执行的代码就是
-
Console.WriteLine("Hello, World!");
Console
是System
命名空间中的一个静态类,提供了用于控制台输入输出的方法。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 位单精度浮点数 (精度较低,以f
或F
后缀结尾,如1.23f
)double
: 64 位双精度浮点数 (精度较高,最常用,默认类型,如1.23
)decimal
: 128 位高精度小数类型 (用于金融计算等需要精确小数的场景,以m
或M
后缀结尾,如1.23m
)
- 布尔型 (Boolean): 用于存储
true
或false
这两个逻辑值。bool
: 存储true
或false
。
- 字符型 (Character): 用于存储单个字符。
char
: 存储单个 Unicode 字符 (用单引号'
包围,如'A'
,'1'
,'\n'
)。
常见的引用类型:
- 字符串 (String): 用于存储一串文本字符。
string
: 存储文本 (用双引号"
包围,如"Hello"
).string
是System.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); // 输出 123string 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}”);
}
“` -
break
和continue
: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
是一个类,person1
和 person2
是 Person
类的两个不同的对象(实例)。它们都拥有 Name
和 Age
属性以及 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# 的编程世界中取得成功!