类与对象 #

一、面向对象概述 #

面向对象编程(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