前言
在C#第11天的学习中,我系统掌握了正则表达式、内存模型(堆栈)、面向对象继承和时间处理四大核心主题。本文完整保留我的课堂笔记和代码实践,通过结构化梳理帮助大家系统掌握这些关键知识。所有代码示例均来自我的实际操作,保留原始命名和实现逻辑!
一、正则表达式实战
1. 正则基础与特殊字符串
// 原始字符串与@字符串的区别
string s1 = "aaa\nbbb"; // 转义换行
string s2 = @"aaa\nbbb"; // 直接显示\n
Console.WriteLine(s1);
Console.WriteLine(s2);
2. 正则匹配与替换
string string1 = "abc123abc123abc";
// 创建正则匹配字母"a"
Regex reg1 = new Regex(@"a");
Console.WriteLine(reg1.Replace(string1, "*"));
// 输出:*bc123*bc123*bc
// 匹配数字和斜杠
Regex reg = new Regex(@"[\d/]");
string str = "福/克斯变废676468为宝/六分零五\u002F";
MatchCollection ms = reg.Matches(str);
// 遍历所有匹配项
foreach (Match item in ms)
{
Console.WriteLine(item.Value);
}
// 输出:/ 6 7 6 4 6 8 / /
二、值类型与引用类型内存模型
1. 内存存储差异
2. 代码验证
// 值类型复制验证
int num = 10;
int num1 = num;
num = 20;
Console.WriteLine(num); // 20
Console.WriteLine(num1); // 10
// 引用类型共享验证
Student stu = new Student(20,"小明");
Student stu3 = stu; // 复制引用
stu3.age = 100;
Console.WriteLine(stu.age); // 100(共享修改)
// 结构体值复制验证
Dog d1 = new Dog("阿黄",2);
Dog d3 = d1; // 值复制
d1.age = 1000;
Console.WriteLine(d3.age); // 2(独立副本)
3. 类型定义
class Student {
public int age;
public string name;
public Student(int age, string name) {
this.age = age;
this.name = name;
}
}
public struct Dog {
public string name;
public int age;
public Dog(string name, int age) {
this.name = name;
this.age = age;
}
}
三、面向对象继承
1. 继承概念与实现
class Boss {
public int HP { get; set; }
public int SP { get; set; }
public void Move() {
Console.WriteLine("移动");
}
}
// Class1继承Boss
class Class1 : Boss {
public double Height { get; set; }
public void minAi() {
Console.WriteLine("Min攻击");
}
}
// 使用继承
Class1 c2 = new Class1();
c2.HP = 100; // 继承自Boss
c2.Move(); // 继承自Boss
c2.minAi(); // 自有方法
2. 虚方法与重写
class Boss {
public virtual void Move() {
Console.WriteLine("Boss只能左右移动");
}
}
class Class1 : Boss {
// 重写父类方法
public override void Move() {
Console.WriteLine("小兵随意移动");
}
// 隐藏父类方法
public new void AI() {
Console.WriteLine("普通攻击");
}
}
四、只读字段特性
1. 只读字段规则
class Class1 {
public readonly string name = "张三"; // 声明时初始化
public Class1(string name) {
this.name = name; // 构造函数初始化
}
}
// 使用示例
Class1 c2 = new Class1("王五");
Console.WriteLine(c2.name); // 输出:王五
// c2.name = "李四"; // 错误!只读字段不能修改
五、日期与时间处理
1. DateTime基础
DateTime now = DateTime.Now;
Console.WriteLine(now); // 当前时间
// 获取时间分量
Console.WriteLine($"年: {now.Year} 月: {now.Month} 日: {now.Day}");
Console.WriteLine($"时: {now.Hour} 分: {now.Minute} 秒: {now.Second}");
// 时间运算
DateTime future = now.AddDays(100); // 100天后
DateTime past = now.AddDays(-100); // 100天前
2. TimeSpan时间跨度
// 计算时间间隔
DateTime birth = new DateTime(2002, 8, 4, 20, 0, 0);
TimeSpan lifeSpan = DateTime.Now.Subtract(birth);
// 输出时间跨度
Console.WriteLine($"生存天数: {lifeSpan.Days}天");
Console.WriteLine($"总小时数: {lifeSpan.TotalHours}小时");
六、学习总结
核心知识图谱
关键要点梳理
主题 | 核心概念 | 我的代码实践 |
---|---|---|
正则表达式 | 模式匹配、特殊字符处理 | Regex 类应用 |
内存模型 | 值类型栈存、引用类型堆存 | Student 与Dog 验证 |
继承机制 | 代码复用、层次关系 | Boss 基类设计 |
虚方法 | 多态实现、方法重写 | override 关键字 |
只读字段 | 初始化限制、安全访问 | readonly 字段 |
时间处理 | 日期获取、时间运算 | DateTime.Now 应用 |
实用编程技巧
- 正则优化:
- 预编译常用正则提升性能
- 使用
RegexOptions.IgnoreCase
忽略大小写
- 内存管理:
- 结构体用于小于16字节的数据
- 引用类型注意空值检查
- 继承设计:
- 使用
protected
保护子类访问 - 合理使用
sealed
防止过度继承
- 使用
- 时间处理:
- 使用
DateTime.UtcNow
处理时区问题 TimeSpan
适合计算时间间隔
- 使用
编程箴言
"理解内存模型是写出高效代码的基础,掌握正则能处理复杂文本,善用继承让代码优雅而强大"
学习建议:
- 在日志分析中实践正则表达式
- 通过内存查看工具观察不同类型的内存分配
- 设计三层继承结构的类体系
- 开发个人生日倒计时程序