返回 计算机通用语(C#)

16-30

以下为完整正文内容。

正文

16.技术栈 一个项目从数据库到后端到前端,用了哪些技术,这一串技术排在一起就叫技术栈。就像做一道菜,用什么锅、什么灶、什么调料,凑起来就是“做菜栈”。 17.全栈 一个人既能写数据库和后端接口,也能写前端页面,整条技术栈都能拿下,就叫全栈。 18.序列化(Serialization)与反序列化(Deserialization) 序列化是把一个 C# 对象转成能存进文件或在网上传输的格式(比如 JSON 字符串)。反序列化就是反过来,把 JSON 字符串还原成一个 C# 对象。 前后端传数据的时候,后端把对象序列化成 JSON 发给前端,前端再把收到的 JSON 反序列化成自己能用的对象。这两个操作是网络通信里最基本的工序。 19.反射(Reflection) 程序运行时动态读取自身信息的能力。比如在运行时查看一个类有哪些属性、方法,或者动态创建对象、调用方法。很多框架底层依赖反射实现自动映射、依赖注入等。但反射性能开销较大,不适合高频调用的场景。 20.泛型(Generics) 写类或方法时先用占位符 <T> 代替具体类型,调用时再指定用哪个类型。 List<T> 就是一个泛型类,你写 List<string> 就得到一个装字符串的列表,写 List<int> 就得到一个装整数的列表。一个定义,适应所有类型,避免为每种类型重写相同代码。 21.迭代器(Iterator) 迭代器是一种让你可以逐步“产出”数据的机制,不需要一次性把所有数据都准备好再返回。 在 C# 里,你写 yield return,方法就会变成一个迭代器。每次调用 MoveNext() 时执行一段代码,产出一个值,然后暂停住,等待下一次调用再继续往下跑。foreach 循环和 LINQ 的延迟执行,底层都依赖它。 22.装箱(Boxing)与拆箱(Unboxing) 把值类型(比如 int)转成 object 的过程叫装箱,系统会在堆上额外分配一块内存来装这个值。反过来,把 object 转回值类型的过程叫拆箱。装箱和拆箱有性能开销,高频场景下应避免,这也是泛型被广泛推荐的原因之一。 23. 堆(Heap)与栈(Stack) 这是内存中两块不同的区域。栈由系统自动管理,存放局部变量和方法调用信息,用完立刻释放,速度极快。堆用来存放 new 出来的对象,由垃圾回收器统一管理,分配较慢,但容量大。值类型通常在栈上,引用类型的对象在堆上,这是理解 C# 内存模型的基础。 24.强类型(Strongly Typed)与弱类型(Weakly Typed) 强类型语言中,每个变量在编译时就确定了类型,比如 string name = "张三",你不能把 name 当数字来用,编译阶段就会报错。C# 是典型的强类型语言,这能在代码跑起来之前就暴露大量错误。弱类型语言(如 JavaScript)变量类型在运行时可以随意改变,写法更灵活但容易埋下隐患。 25.静态类型(Static Typed)与动态类型(Dynamic Typed) 静态类型语言在编译时检查类型是否匹配,如 C# 中 string 变量不能赋给 int 变量,编译器直接不通过。动态类型语言在运行时才检查类型,变量没有固定类型,可以随时改变,如 Python 中同一变量可先后赋值为字符串或数字。C# 强类型的同时也是静态类型。 26.值类型(Value Type)与引用类型(Reference Type) 值类型存的是数据本身。把一个值类型赋给另一个变量,会复制一份。 引用类型存的是内存地址,赋值时只复制地址,两个变量指向同一个对象。 int、bool、DateTime、struct 是值类型。string、class、数组、List<T> 是引用类型。知道这个区别,才能理解为什么改一个变量另一个也跟着变。 27.多态(Polymorphism) 同一个方法调用,在不同对象上表现出不同行为。通过继承或接口实现,运行时根据对象的实际类型自动选择对应的方法版本。 你写 animal.MakeSound(),传入狗对象就汪汪叫,传入猫对象就喵喵叫。 多态让你用统一的代码处理不同类型的对象,是面向对象编程的三大支柱之一。 28.封装(Encapsulation) 把数据和操作数据的方法包装在类里,对外只暴露有限的访问入口,隐藏内部实现细节。你使用 List<T> 时调用 Add 和 Remove,不需要知道内部数组怎么扩容、元素怎么移动。封装降低耦合,修改内部实现不影响外部调用,是面向对象编程的第二大支柱。 29.字段(Field)与属性的区别 字段是类里直接定义的变量,通常用 private 修饰,不对外暴露。 属性是包裹字段的访问器,用 get 和 set 控制读写,对外公开。 外部代码通过属性访问数据,属性内部可以加验证、计算或通知逻辑。 字段存数据,属性管访问,这就是封装在 C# 中的标准实现。 30.线程(Thread)与任务(Task) 线程是程序执行的最小单元,多个线程可以同时做不同的事,但手动管理线程复杂且容易出错。 任务是对线程的更高层封装,由线程池调度,不需要自己创建和销毁线程。 Task 配合 async/await 是现代 C# 异步编程的标准模式,线程是底层,任务是上层抽象。