类与对象 #
一、面向对象概述 #
面向对象编程(OOP)的三大特性:
| 特性 | 说明 |
|---|---|
| 封装 | 隐藏内部实现细节 |
| 继承 | 复用和扩展代码 |
| 多态 | 同一接口不同实现 |
二、类的定义 #
2.1 基本语法 #
csharp
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void SayHello()
{
Console.WriteLine($"你好,我是{Name}");
}
}
2.2 类成员 #
csharp
public class Student
{
private string _id;
public string Name { get; set; }
public static int Count { get; private set; }
public const int MaxAge = 150;
public readonly DateTime CreatedAt;
public Student()
{
CreatedAt = DateTime.Now;
Count++;
}
public void Study()
{
Console.WriteLine($"{Name}正在学习");
}
public static void PrintInfo()
{
Console.WriteLine($"学生总数:{Count}");
}
}
2.3 访问修饰符 #
| 修饰符 | 说明 |
|---|---|
| public | 公有,任何地方可访问 |
| private | 私有,类内部可访问 |
| protected | 受保护,类及子类可访问 |
| internal | 内部,同一程序集可访问 |
| protected internal | 受保护或内部 |
csharp
public class Example
{
public int PublicField;
private int _privateField;
protected int ProtectedField;
internal int InternalField;
protected internal int ProtectedInternalField;
}
三、对象创建 #
3.1 使用new关键字 #
csharp
Person person = new Person();
person.Name = "张三";
person.Age = 25;
3.2 对象初始化器 #
csharp
Person person = new Person
{
Name = "张三",
Age = 25
};
var person = new Person { Name = "张三", Age = 25 };
3.3 目标类型new(C# 9+) #
csharp
Person person = new();
Person person = new() { Name = "张三", Age = 25 };
void Process(Person p) { }
Process(new());
3.4 with表达式(C# 9+,用于record) #
csharp
public record Person(string Name, int Age);
var person1 = new Person("张三", 25);
var person2 = person1 with { Age = 26 };
四、字段与属性 #
4.1 字段 #
csharp
public class Person
{
public string Name;
private int _age;
public readonly DateTime CreatedAt = DateTime.Now;
}
4.2 属性 #
csharp
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get => _age;
set
{
if (value >= 0 && value <= 150)
_age = value;
}
}
}
4.3 自动属性 #
csharp
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; private set; }
public DateTime CreatedAt { get; } = DateTime.Now;
}
4.4 必需属性(C# 11+) #
csharp
public class Person
{
public required string Name { get; set; }
public required int Age { get; set; }
}
var person = new Person { Name = "张三", Age = 25 };
4.5 初始化属性 #
csharp
public class Person
{
public string Name { get; init; }
public int Age { get; init; }
}
var person = new Person { Name = "张三", Age = 25 };
五、方法 #
5.1 方法定义 #
csharp
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public void PrintResult(int result)
{
Console.WriteLine($"结果:{result}");
}
public static double PI => 3.14159;
public static int Multiply(int a, int b) => a * b;
}
5.2 方法参数 #
csharp
public class Methods
{
public void Process(int value) { }
public void Process(ref int value)
{
value = 100;
}
public void Process(out int value)
{
value = 100;
}
public void Process(in int value) { }
public int Sum(params int[] numbers)
{
return numbers.Sum();
}
public void Process(int a, int b = 10, string name = "default") { }
public void Process(int a, string name = "default", int b = 10) { }
}
5.3 方法重载 #
csharp
public class Calculator
{
public int Add(int a, int b) => a + b;
public double Add(double a, double b) => a + b;
public int Add(int a, int b, int c) => a + b + c;
}
六、静态成员 #
6.1 静态字段和属性 #
csharp
public class Counter
{
private static int _count = 0;
public static int Count => _count;
public Counter()
{
_count++;
}
}
6.2 静态方法 #
csharp
public class MathHelper
{
public static double Square(double x) => x * x;
public static double Cube(double x) => x * x * x;
}
double result = MathHelper.Square(5);
6.3 静态构造函数 #
csharp
public class Configuration
{
public static string ConnectionString { get; }
static Configuration()
{
ConnectionString = "Server=localhost;Database=MyDb";
}
}
6.4 静态类 #
csharp
public static class Constants
{
public const double PI = 3.14159;
public const double E = 2.71828;
public static readonly string AppName = "MyApp";
}
七、this关键字 #
7.1 引用当前实例 #
csharp
public class Person
{
private string name;
public Person(string name)
{
this.name = name;
}
public void Introduce()
{
Console.WriteLine($"我是{this.name}");
}
}
7.2 链式调用 #
csharp
public class Builder
{
private string _name;
private int _age;
public Builder SetName(string name)
{
_name = name;
return this;
}
public Builder SetAge(int age)
{
_age = age;
return this;
}
public override string ToString() => $"{_name}, {_age}岁";
}
var person = new Builder()
.SetName("张三")
.SetAge(25);
八、实战示例 #
8.1 学生类 #
csharp
public class Student
{
private static int _nextId = 1;
public int Id { get; }
public string Name { get; set; }
public int Age { get; set; }
public List<int> Scores { get; } = new();
public Student(string name, int age)
{
Id = _nextId++;
Name = name;
Age = age;
}
public void AddScore(int score)
{
if (score >= 0 && score <= 100)
Scores.Add(score);
}
public double GetAverage()
{
return Scores.Count > 0 ? Scores.Average() : 0;
}
public string GetGrade()
{
var avg = GetAverage();
return avg switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
>= 60 => "D",
_ => "F"
};
}
}
8.2 银行账户类 #
csharp
public class BankAccount
{
private decimal _balance;
private readonly List<Transaction> _transactions = new();
public string AccountNumber { get; }
public string Owner { get; }
public decimal Balance => _balance;
public BankAccount(string accountNumber, string owner, decimal initialBalance = 0)
{
AccountNumber = accountNumber;
Owner = owner;
_balance = initialBalance;
}
public void Deposit(decimal amount)
{
if (amount <= 0)
throw new ArgumentException("存款金额必须大于0");
_balance += amount;
_transactions.Add(new Transaction("存款", amount, _balance));
}
public void Withdraw(decimal amount)
{
if (amount <= 0)
throw new ArgumentException("取款金额必须大于0");
if (amount > _balance)
throw new InvalidOperationException("余额不足");
_balance -= amount;
_transactions.Add(new Transaction("取款", -amount, _balance));
}
public IEnumerable<Transaction> GetTransactions() => _transactions.AsReadOnly();
}
public record Transaction(string Type, decimal Amount, decimal BalanceAfter);
九、总结 #
类与对象要点:
| 要点 | 说明 |
|---|---|
| 类定义 | class关键字 |
| 对象创建 | new关键字 |
| 字段 | 存储数据 |
| 属性 | 封装字段 |
| 方法 | 定义行为 |
| 静态成员 | 类级别共享 |
下一步,让我们学习构造方法!
最后更新:2026-03-26