1. 为什么选择C#作为入门语言
C#(读作C Sharp)作为微软主推的面向对象编程语言,在工业界有着广泛的应用场景。从我十多年的开发经验来看,它特别适合作为编程初学者的第一门语言。与C++相比,它移除了指针等复杂概念;与Java相比,它拥有更简洁的语法;与Python相比,它又具备强类型检查的优势。
Visual Studio提供的智能提示和调试工具,能让新手快速看到代码执行结果。现在很多游戏开发(特别是Unity引擎)、企业级应用开发、Windows桌面程序都大量使用C#。我带的很多实习生都是从C#入门,三个月后就能参与实际项目开发。
2. 开发环境搭建与第一个程序
2.1 安装Visual Studio Community版
微软提供了完全免费的Visual Studio Community版本,这是目前最好的C#开发环境。安装时注意勾选".NET桌面开发"工作负载,这会自动包含C#所需的所有组件。建议选择2022版本,它对新手更友好。
安装完成后,创建一个新项目:
- 选择"控制台应用(.NET Core)"
- 项目名称输入"HelloWorld"
- 框架选择.NET 6.0(长期支持版本)
2.2 理解程序基本结构
生成的Program.cs文件中会自动包含以下代码:
csharp复制// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
这虽然简单,但包含几个重要概念:
//开头的行是注释,不会被程序执行Console.WriteLine是输出文本到控制台的方法- 每行代码以分号
;结束
提示:新手常见错误是忘记写分号,或者使用中文标点符号。VS会用红色波浪线标出这类语法错误。
3. 变量与数据类型
3.1 基本数据类型
C#是强类型语言,所有变量都必须先声明类型。最常用的基本类型有:
| 类型 | 说明 | 示例 |
|---|---|---|
| int | 整数 | int age = 25; |
| double | 双精度浮点数 | double price = 9.99; |
| bool | 布尔值 | bool isActive = true; |
| char | 单个字符 | char grade = 'A'; |
| string | 字符串 | string name = "Alice"; |
3.2 类型转换
有时需要在不同类型间转换:
csharp复制// 显式转换(可能丢失精度)
double pi = 3.14159;
int approxPi = (int)pi; // 结果为3
// 字符串转数字
string input = "123";
int number = int.Parse(input);
注意:使用
Parse方法时,如果字符串格式不正确会抛出异常。更安全的做法是使用TryParse:csharp复制if(int.TryParse(input, out number)) { Console.WriteLine($"转换成功: {number}"); }
4. 流程控制语句
4.1 条件判断
if-else语句是最基础的条件判断:
csharp复制int score = 85;
if (score >= 90) {
Console.WriteLine("优秀");
}
else if (score >= 60) {
Console.WriteLine("及格");
}
else {
Console.WriteLine("不及格");
}
4.2 循环结构
for循环适合已知循环次数的情况:
csharp复制for(int i=0; i<5; i++) {
Console.WriteLine($"这是第{i+1}次循环");
}
while循环更适合不确定次数的情况:
csharp复制Random rand = new Random();
int target = rand.Next(1, 101);
int guess = 0;
while(guess != target) {
Console.Write("猜数字(1-100):");
guess = int.Parse(Console.ReadLine());
if(guess > target) Console.WriteLine("太大了");
else if(guess < target) Console.WriteLine("太小了");
}
Console.WriteLine("猜对了!");
5. 函数与方法
5.1 定义和调用方法
方法是组织代码的基本单元:
csharp复制// 定义一个计算BMI的方法
static double CalculateBMI(double weightKg, double heightM) {
return weightKg / (heightM * heightM);
}
// 调用方法
double myBMI = CalculateBMI(70, 1.75);
Console.WriteLine($"您的BMI是:{myBMI:F1}"); // F1表示保留1位小数
5.2 方法重载
同一个方法名可以有不同参数列表:
csharp复制static int Add(int a, int b) => a + b;
static double Add(double a, double b) => a + b;
static string Add(string a, string b) => a + b;
编译器会根据参数类型自动选择合适的方法。
6. 面向对象基础
6.1 类和对象
类是创建对象的模板:
csharp复制public class Person {
// 字段
public string Name;
private int age;
// 属性
public int Age {
get { return age; }
set {
if(value >= 0) age = value;
else throw new ArgumentException("年龄不能为负");
}
}
// 方法
public void Introduce() {
Console.WriteLine($"大家好,我是{Name},今年{Age}岁");
}
}
// 使用类
Person p = new Person();
p.Name = "张三";
p.Age = 25; // 通过属性赋值
p.Introduce();
6.2 构造函数
构造函数在创建对象时初始化数据:
csharp复制public class Person {
public Person(string name, int age) {
this.Name = name;
this.Age = age;
}
// 其他成员同上
}
// 创建对象
Person p = new Person("李四", 30);
7. 集合与泛型
7.1 列表(List)
List<T>是最常用的动态数组:
csharp复制List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");
names.Add("Charlie");
foreach(string name in names) {
Console.WriteLine(name);
}
// 查找元素
int index = names.IndexOf("Bob");
if(index != -1) {
Console.WriteLine($"找到Bob,索引:{index}");
}
7.2 字典(Dictionary)
Dictionary<TKey,TValue>存储键值对:
csharp复制Dictionary<string, int> ages = new Dictionary<string, int>();
ages["Alice"] = 25;
ages["Bob"] = 30;
// 安全访问
if(ages.TryGetValue("Alice", out int aliceAge)) {
Console.WriteLine($"Alice的年龄是{aliceAge}");
}
8. 异常处理
8.1 try-catch-finally
处理运行时错误的正确方式:
csharp复制try {
Console.Write("请输入数字:");
int num = int.Parse(Console.ReadLine());
Console.WriteLine($"你输入的是:{num}");
}
catch (FormatException) {
Console.WriteLine("输入的不是有效数字!");
}
catch (Exception ex) {
Console.WriteLine($"发生错误:{ex.Message}");
}
finally {
Console.WriteLine("程序执行完毕");
}
8.2 自定义异常
创建特定业务异常:
csharp复制public class InsufficientBalanceException : Exception {
public InsufficientBalanceException(decimal balance, decimal amount)
: base($"余额不足。当前余额:{balance},尝试提取:{amount}") {}
}
public class BankAccount {
private decimal balance;
public void Withdraw(decimal amount) {
if(amount > balance) {
throw new InsufficientBalanceException(balance, amount);
}
balance -= amount;
}
}
9. 文件操作
9.1 读写文本文件
csharp复制// 写入文件
string path = "test.txt";
File.WriteAllText(path, "Hello, File IO!");
// 读取文件
string content = File.ReadAllText(path);
Console.WriteLine(content);
// 追加内容
File.AppendAllText(path, "\n这是追加的内容");
9.2 处理文件流
对于大文件,使用流更高效:
csharp复制using (FileStream fs = new FileStream("largefile.dat", FileMode.Create)) {
byte[] data = new byte[1024];
// 写入数据
fs.Write(data, 0, data.Length);
}
using (StreamReader reader = new StreamReader("config.ini")) {
string line;
while ((line = reader.ReadLine()) != null) {
Console.WriteLine(line);
}
}
10. 进阶学习建议
掌握这些基础后,建议按以下路线深入学习:
- LINQ:强大的数据查询功能
- 异步编程:async/await关键字
- WPF/WinForms:桌面应用开发
- ASP.NET Core:Web开发
- Entity Framework:数据库操作
我个人的经验是,学习编程最好的方式就是动手实践。可以尝试这些项目:
- 开发一个通讯录管理程序
- 制作简易计算器
- 编写文件加密工具
- 实现贪吃蛇小游戏
遇到问题时,善用Visual Studio的调试功能,逐步执行代码并观察变量值的变化。记住每个专业开发者都是从"Hello World"开始的,坚持练习,你很快就能写出有实用价值的程序。
