结合上两篇文档,依据类的字段、属性、构造器 以及方法等核心概念,演示创建定义C#类 以及如何使用示例。
1. 类定义示例:Book 类
定义一个表示"书"的类,涵盖自动属性、只读字段、构造器和表达式体方法。
csharp
using System;
namespace LibrarySystem
{
// 定义一个图书类(引用类型)
public class Book
{
// 1. 字段 (Field)
// readonly 确保 ID 在构造后不可变更
private readonly string _id;
// 2. 属性 (Property)
// 使用自动属性和 init-only setter(C# 9),初始化后不可修改
public string Title { get; init; }
public string Author { get; set; }
public decimal Price { get; set; }
// 3. 构造器 (Constructor)
// 执行类初始化代码,名称与类型相同
public Book(string id, string title, string author)
{
_id = id;
Title = title;
Author = author;
}
// 4. 方法 (Method)
// 使用表达式体方法简写形式
public void DisplayInfo() =>
Console.WriteLine($"ID: {_id}, 书名: {Title}, 作者: {Author}, 价格: {Price:C}");
// 5. 解构器 (Deconstructor)
// 将对象属性反向赋值给变量
public void Deconstruct(out string title, out string author)
{
title = Title;
author = Author;
}
}
}
2. 类的实例化与使用
在 Main 方法中,展示如何创建对象、使用初始化器以及调用成员。
csharp
using System;
using LibrarySystem;
class Program
{
static void Main()
{
// 1. 实例化与对象初始化器
// 使用构造器设置核心字段,再通过初始化器设置 Price
Book myBook = new Book("B001", "C#入门经典", "张三")
{
Price = 59.8m
};
// 2. 调用方法
myBook.DisplayInfo();
// 3. 使用解构器 (Deconstruction)
var (title, author) = myBook;
Console.WriteLine($"解析结果 - 书名: {title}, 作者: {author}");
// 4. 验证 readonly 与 init 特性
// myBook.Title = "新书名"; // 错误:init 属性在初始化后不可修改
}
}
3. 关键技术点解释
- 内存分配 :
Book是一个类(引用类型),myBook变量存储在栈上,而实际的对象数据存储在堆中。 - 字段 vs 属性 :
_id作为私有字段隐藏了内部实现;Title和Price作为属性提供了更灵活的访问控制。 - 初始化顺序 :当你调用
new Book(...)时,会先按顺序初始化字段,然后执行构造器方法体,最后处理对象初始化器中的赋值。 - 安全保护 :通过
readonly和init关键字,我们构建了一个半不可变的对象,增强了代码的健壮性。