以下是对提供的 C# 代码中涉及的核心知识点的梳理和总结,涵盖索引器、接口、泛型三大核心内容,以及相关实践要点:

一、索引器(Indexer)

索引器是一种允许类或结构体像数组一样通过[]语法访问成员的特殊成员,本质是对类中数据的 “索引式访问” 封装。

1. 基本定义与格式
  • 作用:让对象可以通过对象名[索引]的方式访问内部数据(如数组、集合中的元素),简化访问逻辑。

  • 格式:

    public 返回值类型 this[索引类型 索引参数名]
    {get { /* 获取数据时执行,返回对应值 */ }set { /* 设置数据时执行,value为赋值内容 */ }
    }
  • 关键说明:

    • this关键字表示当前对象,索引参数可以是任意类型(int、string 等)。

    • get块:通过索引获取数据时触发,返回内部存储的数据。

    • set块:通过索引设置数据时触发,value是赋值运算符右侧的值(若省略set,则索引器为只读)。

2. 核心特点
  • 支持多类型索引:同一个类可以定义多个索引器(重载),通过索引参数类型区分。 例如:ClassRoom类同时定义this[int index](按位置索引)和this[string name](按姓名索引)。

  • 动态处理逻辑:可在get/set中添加自定义逻辑(如边界检查、数据转换)。 例如:索引器练习中,当索引超出数组长度时,动态扩展数组长度。

  • 与数组的区别:数组的索引固定为int类型且基于连续内存,索引器的索引类型和内部实现可自定义(如基于字典、集合)。

3. 示例解析
  • ClassRoom类中,通过this[int index]索引器访问List<Students>集合中的元素,get返回对应索引的学生对象,set修改对应位置的学生对象。

  • 通过this[string name]索引器,根据姓名查找学生(使用List.Find方法),实现按姓名索引的功能。

一、索引器的本质与作用

索引器是 C# 中一种特殊的类成员,允许类或结构的实例像数组一样通过索引([] 进行访问,从而简化对内部数据的操作。其核心作用是:将类的内部数据结构(如数组、集合)封装起来,对外提供类似数组的访问接口,同时隐藏内部实现细节。

二、索引器的基本语法
// 访问修饰符  返回值类型  this[参数类型 参数名]
public 数据类型 this[索引类型 index]
{get { /* 获取值的逻辑,返回对应数据 */ }set { /* 设置值的逻辑,value表示赋值的内容 */ }
}
  • this:特殊关键字,代表当前类的实例(类似属性,但索引器没有名称,通过this标识)。

  • 索引类型:可以是任意类型(int、string、自定义类型等),这是索引器与数组的关键区别(数组索引只能是 int)。

  • get访问器:通过索引获取值时执行(类似数组的读操作)。

  • set访问器:通过索引设置值时执行(类似数组的写操作),value是隐式参数,代表赋值的内容。

  • 若省略set,则索引器为只读;若省略get,则为只写(通常不推荐)。

三、索引器的重载特性

索引器支持重载(与方法重载规则一致),即同一类中可以定义多个索引器,通过参数类型或参数数量区分。

示例(第一个代码)ClassRoom类定义了两个索引器:

// 1. int类型索引:通过下标访问学生
public Students this[int index] { get; set; }
​
// 2. string类型索引:通过姓名查找学生
public Students this[string n] { get; }

调用时会根据[]中参数的类型自动匹配对应的索引器:

room[1]; // 匹配int类型索引器
room["郑爽"]; // 匹配string类型索引器
四、索引器与数组的区别
特性索引器数组
本质类的成员(方法的语法糖)引用类型(数据结构)
索引类型任意类型(int、string 等)只能是 int 类型
长度灵活性可动态调整(内部逻辑控制)长度固定(创建后不可变)
定义位置类或结构内部独立定义(变量)
五、代码细节分析与扩展
1. 第一个代码(ClassRoom 类)
  • 内部数据结构:使用List<Students>存储学生,索引器封装了对 List 的访问,避免直接暴露 List(封装性)。

  • string 类型索引器

    :通过姓名查找学生,使用

    List.Find()

    方法结合 Lambda 表达式简化逻辑:

    return students.Find(s => s.Name == n); 
    // 等价于循环遍历查找,更简洁
  • set 访问器的作用:

    this[int index]

    的 set 访问器允许直接通过索引修改 List 中的元素,例如:

    room[0] = new Students() { Name = "金秀贤", Sex='女' }; 
    // 实际执行students[0] = value;
2. 第二个代码(Student 类)
  • 核心功能:索引器处理数组索引越界问题,实现动态扩展数组长度。

  • 关键逻辑(set 访问器):

    set 
    {if (index >= names.Length){// 索引越界时,创建新数组并复制原有元素string[] newNames = new string[names.Length + 1];Array.Copy(names, newNames, names.Length); // 复制旧数据newNames[index] = value; // 赋值新元素names = newNames; // 替换旧数组}else{names[index] = value; // 索引正常时直接赋值}
    }

    这个逻辑解决了数组长度固定的问题,通过索引器对外提供 “动态数组” 的体验。

六、索引器的扩展用法
  1. 多参数索引器:支持多个参数(类似二维数组),例如:

    // 二维索引器:访问矩阵中的元素
    public int this[int row, int col]
    {get { return matrix[row, col]; }set { matrix[row, col] = value; }
    }
    // 调用:matrix[2, 3] = 10;
  2. 限制访问权限:通过访问修饰符控制 get/set 的可见性,例如:

    public string this[int index]
    {get { return data[index]; } // 公开可读private set { data[index] = value; } // 仅类内部可写
    }
  3. 结合接口:索引器可以在接口中定义(仅声明,无实现),由实现类具体实现:

    public interface IIndexable
    {string this[int index] { get; set; }
    }
总结

索引器是 C# 中增强类交互性的重要特性,通过模拟数组的访问方式,简化了对类内部数据的操作。其核心优势在于:灵活的索引类型、支持重载、可封装复杂内部逻辑,常用于集合类、数据容器等场景(如List<T>Dictionary<TKey, TValue>内部都实现了索引器)。

二、接口(Interface)

接口是一种规范(“契约”),定义了一组必须实现的成员(属性、方法等),但不包含实现逻辑,由类或结构体实现。

1. 基本定义与格式
  • 作用:统一不同类的行为标准,实现 “多态” 和 “解耦”。

  • 格式:

    interface 接口名(通常以I开头)
    {// 成员声明(无访问修饰符,默认公开)返回值类型 方法名(参数);类型 属性名 { get; set; }
    }
  • 实现规则:类 / 结构体通过:实现接口,必须实现接口中所有成员(包括继承的父接口成员)。

2. 核心特点
  • 多实现:一个类可以实现多个接口(用,分隔),解决类的单继承限制。 例如:Book类同时实现IBookIPaper接口。

  • 接口继承:接口可以继承其他接口,子接口包含父接口的所有成员。实现子接口的类必须实现所有父接口和子接口的成员。 例如:IStudent继承IPeopleStudent类实现IStudent时,需实现IPeopleNameAgeIStudentStudentIdStudy

  • 显式实现:当多个接口包含同名不同类型的成员时,需显式实现(不添加访问修饰符,通过 “接口名。成员” 定义)。 例如:IAIBC属性(int 和 string 类型),通过int IA.Cstring IB.C实现,访问时需将对象转为对应接口类型。

3. 与抽象类的区别
对比项接口抽象类
实现方式类通过:实现,可多实现类通过:继承,仅单继承
成员实现无实现(纯规范)可包含抽象成员(无实现)和具体成员
访问修饰符成员无修饰符(默认公开)成员可加修饰符(public、protected 等)
成员类型仅属性、方法、事件、索引器可包含字段、属性、方法等
实例化不能实例化不能实例化
一、接口的本质与核心特性

接口是 C# 中一种引用类型,它定义了一组未实现的成员规范(属性、方法、索引器、事件等),本质是一种 “契约” 或 “规则”。其核心特性包括:

  • 无实现:接口只声明成员 “是什么”,不定义 “怎么做”(方法无方法体,属性只有get/set声明)。

  • 强制实现:类或结构体实现接口时,必须全部实现接口中的所有成员,否则会编译错误。

  • 多实现支持:一个类 / 结构体可以同时实现多个接口(弥补 C# 类单继承的限制)。

二、接口的定义语法
// 接口名称通常以"I"开头(约定),成员默认是public(不能显式添加访问修饰符)
interface 接口名
{// 属性声明(无实现)返回值类型 属性名 { get; set; }// 方法声明(无方法体)返回值类型 方法名(参数列表);// 索引器、事件等(语法类似类成员,但无实现)
}

示例(用户代码)

interface IBook
{string Name { get; set; }  // 属性声明double Price { get; set; }void Fn();  // 方法声明void Fn(string n);  // 方法重载声明
}
三、接口的实现

类或结构体通过:符号实现接口,需严格遵循接口规范:

1. 基本实现规则
  • 必须实现接口中所有成员(包括重载的方法、属性等)。

  • 实现的成员必须与接口声明的返回值、参数列表、名称完全一致。

  • 类可以在实现接口的基础上,添加自己的额外成员(如Book类的Color属性)。

示例

class Book : IBook, IPaper  // 实现多个接口
{// 实现IBook的属性public string Name { get; set; }public double Price { get; set; }// 实现IPaper的属性public string Type { get; set; }// 类自己的额外成员public string Color { get; set; }// 实现IBook的方法public void Fn() { /* 具体实现 */ }public void Fn(string n) { /* 具体实现 */ }
}
2. 显式实现(解决成员冲突)

当类实现的多个接口包含同名成员(且类型 / 参数不同)时,需使用显式实现避免冲突:

  • 语法:接口名.成员名(无访问修饰符)。

  • 显式实现的成员只能通过接口类型的变量访问,不能通过类实例直接访问。

示例(用户代码)

interface IA { int C { get; set; } }
interface IB { string C { get; set; } }
​
class Test : IA, IB
{// 显式实现IA的C(int类型)int IA.C { get; set; }// 显式实现IB的C(string类型)string IB.C { get; set; }
}
​
// 调用方式
Test test = new Test();
IA ia = test;
ia.C = 10;  // 访问IA的C
​
IB ib = test;
ib.C = "hello";  // 访问IB的C
四、接口的继承

接口支持多继承(与类不同,类只能单继承),即一个接口可以继承多个其他接口,继承后会包含父接口的所有成员。

规则

  • 接口继承语法:interface 子接口 : 父接口1, 父接口2...

  • 类实现子接口时,必须同时实现子接口和所有父接口的成员

示例(用户代码)

// IStudent继承IPeople,包含IPeople的所有成员
interface IStudent : IPeople
{string StudentId { get; set; }void Study();
}
​
// 实现IStudent必须同时实现IPeople的成员
class Student : IStudent
{// 实现IPeople的成员public string Name { get; set; }public int Age { get; set; }// 实现IStudent的成员public string StudentId { get; set; }public void Study() { /* 实现 */ }
}
五、接口与抽象类的对比(补充完整)
特性接口抽象类
实例化不能实例化不能实例化
成员实现所有成员无实现(纯规范)可以包含抽象成员(无实现)和非抽象成员(有实现)
继承 / 实现方式类 / 结构体通过:实现,支持多实现类通过:继承,仅支持单继承
成员访问修饰符默认 public,不能显式添加修饰符可以有 public、protected 等修饰符
包含的成员类型只能有属性、方法、索引器、事件(无字段)可以有字段、属性、方法、索引器、事件等
关系本质表示 “具有某种能力”(has-a)表示 “是一种”(is-a)
结构体支持结构体可以实现接口结构体不能继承抽象类(结构体是值类型)
六、接口的典型应用场景
  1. 定义规范:为不同类提供统一的行为标准(如ICollection接口规定集合的基本操作)。

  2. 多态实现:通过接口类型变量调用不同实现类的方法,实现 “同一接口,不同行为”。

    interface IFly { void Fly(); }
    class Bird : IFly { public void Fly() { Console.WriteLine("鸟飞"); } }
    class Plane : IFly { public void Fly() { Console.WriteLine("飞机飞"); } }
    ​
    // 多态调用
    IFly fly1 = new Bird();
    IFly fly2 = new Plane();
    fly1.Fly();  // 输出"鸟飞"
    fly2.Fly();  // 输出"飞机飞"
  3. 解耦设计:降低类之间的依赖(如依赖注入中,通过接口注入而非具体类)。

总结

接口是 C# 中实现 “规范与实现分离” 的核心机制,通过强制实现、多实现支持、多继承能力,灵活解决了类单继承的局限,是实现多态、规范设计的重要工具。理解接口与抽象类的区别,能帮助在不同场景下选择更合适的设计方式(需要代码复用选抽象类,需要多能力规范选接口)。

三、泛型(Generic)

泛型是一种 “延迟指定类型” 的语法,允许在定义方法、类、接口时不指定具体类型,而在使用时动态指定,解决代码复用和类型安全问题。

1. 基本定义与格式
  • 作用:避免为不同类型重复编写相同逻辑(如 int、string 的通用方法),同时避免装箱拆箱(提升性能)。

  • 常见形式

    • 泛型方法:方法名后加<T>,参数或返回值使用T作为类型。 示例:public static T Fn<T>(T i) { return i; }

    • 泛型接口:接口名后加<T>,成员使用T作为类型。 示例:interface ICalc<T> { T Add(T a, T b); }

    • 泛型类:类名后加<T>,成员使用T作为类型。 示例:class Calc3<T> : ICalc<T> { ... }

2. 核心特点
  • 类型推断:调用泛型方法时,可省略类型指定(编译器根据参数自动推断)。 例如:Fn(123)等价于Fn<int>(123)

  • 多泛型参数:支持多个泛型参数(如<T1, T2>),分别指定不同类型。 示例:public static T1 Fn3<T1, T2>(T1 i, T2[] arr) { ... }

  • 默认值:通过default(T)获取泛型类型的默认值(如引用类型为null,值类型为0)。

  • 性能优势:相比object参数(需装箱拆箱),泛型直接操作具体类型,减少性能损耗(如泛型测试中,泛型方法比object参数方法更快)。

3. 泛型约束(补充)

泛型默认支持所有类型,但可通过约束限制T的范围(如仅允许引用类型、特定接口的实现类等),语法:where T : 约束条件。 常见约束:

  • where T : classT必须是引用类型。

  • where T : structT必须是值类型。

  • where T : 接口名T必须实现指定接口。

  • where T : 类名T必须是指定类或其派生类。

一、泛型的本质与价值

泛型是 C# 中一种参数化类型的机制,允许在定义类、方法、接口时不指定具体类型,而是在使用时动态指定。其核心价值在于:

  • 代码复用:一套逻辑适配多种数据类型(避免为 int、string、自定义类型重复编写相同代码)。

  • 类型安全:编译时检查类型匹配(相比 object 类型转换,减少运行时错误)。

  • 性能优化:避免值类型与引用类型之间的装箱 / 拆箱操作(见泛型测试代码分析)。

二、泛型的三种基本形式
1. 泛型方法

在方法名后添加<类型参数>,调用时指定具体类型(或由编译器自动推断)。

语法与特性

// 定义泛型方法
public static 返回值类型 方法名<T>(T 参数)
{// 逻辑实现,T可作为参数类型、返回值类型或局部变量类型
}
​
// 调用方式
方法名<int>(123);       // 显式指定类型
方法名("hello");        // 隐式推断类型(T=string)

示例解析(用户代码):

public static T Fn<T>(T i) { return i; }
// 调用时T被替换为具体类型,等价于:
// public static int Fn(int i) { return i; }
// public static string Fn(string i) { return i; }
2. 泛型接口

接口定义时包含类型参数,实现接口时需指定具体类型或继续使用泛型。

语法与特性

// 定义泛型接口
interface I接口名<T>
{T 方法名(T 参数);
}
​
// 实现方式1:指定具体类型
class 类名 : I接口名<int>
{public int 方法名(int 参数) { /* 实现 */ }
}
​
// 实现方式2:继续使用泛型(泛型类实现泛型接口)
class 类名<T> : I接口名<T>
{public T 方法名(T 参数) { /* 实现 */ }
}

示例解析(用户代码):

// 泛型接口ICalc<T>
interface ICalc<T>
{T Add(T a, T b);T Sub(T a, T b);
}
​
// 实现1:指定T=int
class Calc : ICalc<int> { /* 实现int类型的加减 */ }
​
// 实现2:指定T=string
class Calc2 : ICalc<string> { /* 实现string类型的加减 */ }
3. 泛型类

类定义时包含类型参数,实例化时需指定具体类型。

语法与特性

// 定义泛型类
class 类名<T>
{private T 字段;public T 方法(T 参数) { /* 实现 */ }
}
​
// 实例化
var 变量 = new 类名<int>();  // T被替换为int

示例解析(用户代码):

class Calc3<T> : ICalc<T>
{public T Add(T a, T b){return default(T);  // default(T)返回T类型的默认值}
}
​
// 使用时指定类型
var calc = new Calc3<double>();
double result = calc.Add(1.5, 2.5);  // result=0.0(double默认值)
三、泛型的性能优势(基于测试代码)

用户提供的_08_泛型测试代码通过计时器对比了三种方式的性能:

方法类型实现方式10000 次调用耗时(示例值)性能差异原因
ShowInt具体类型(int)187ms无类型转换,直接操作
ShowObjectobject 类型(装箱 / 拆箱)235msint→object(装箱)和 object→int(拆箱)消耗性能
Show<T>泛型方法220ms编译时生成具体类型代码,无装箱 / 拆箱

结论:泛型性能接近具体类型方法,远优于 object 类型(避免了值类型与引用类型转换的开销)。

四、泛型的关键特性
  1. 类型推断 调用泛型方法时,若编译器可从参数推断出类型,可省略<类型>

    Fn2(1, new int[] { 1 });  // 推断T=int
    Fn3(1, new string[] { "a" });  // 推断TTest1=int,TTest2=string
  2. 多类型参数 泛型可包含多个类型参数(用,分隔):

    public static T1 Fn3<T1, T2>(T1 i, T2[] arr) { return i; }
  3. 默认值(default (T)) 用于获取任意类型的默认值(值类型为0/false等,引用类型为null):

    return default(T);  // 泛型中安全获取默认值
五、泛型与其他技术的对比
技术优势劣势适用场景
泛型类型安全、性能好、代码复用语法稍复杂通用逻辑(如集合、工具类)
重载方法简单直观类型增多时代码量爆炸类型较少的场景
object 类型灵活(支持所有类型)性能差(装箱)、类型不安全(需强制转换)早期版本 C#(无泛型时)
总结

泛型是 C# 中实现 “编写一次,适配多类型” 的核心机制,通过泛型方法、泛型类、泛型接口三种形式,在保证类型安全和性能的前提下,极大提升了代码复用率。其设计思想贯穿于.NET Framework 的核心组件(如List<T>Dictionary<TKey, TValue>),是 C# 开发者必须掌握的重要特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90481.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90481.shtml
英文地址,请注明出处:http://en.pswp.cn/web/90481.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

界面组件DevExpress WPF中文教程:Grid - 如何过滤节点?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

Excel——INDEX和MATCH傻傻分不清?

核心逻辑​先用 MATCH 找到目标姓名在表格中的 ​行号&#xff0c;再用 INDEX 根据行号 ​提取对应信息。就像查字典&#xff1a;先用拼音找到字的页码&#xff08;MATCH 找行号&#xff09;再翻到该页看具体解释&#xff08;INDEX 取数据&#xff09;​分步拆解&#xff08;以…

制造业低代码平台实战评测:简道云、钉钉宜搭、华为云Astro、金蝶云·苍穹、斑斑低代码,谁更值得选?

上回聊了斑斑和简道云&#xff0c;不少同行私信问我其他几个低代码平台怎么样&#xff0c;今天就给大家来个"五大门派"终极对决&#xff01; 一、先说痛点 制造业搞数字化最怕三件事&#xff1a; 1.钱花了没效果&#xff08;大平台用不起&#xff0c;小工具不够用&…

Jenkins中HTML文件显示样式问题解决方案

Jenkins中HTML文件显示样式问题解决方案 问题描述 在Jenkins中归档的HTML文件显示格式失效&#xff0c;样式无法正常显示&#xff0c;但在本地浏览器中打开却能正常显示。 问题原因 Jenkins为了安全考虑&#xff0c;默认设置了严格的内容安全策略(Content Security Policy, CSP…

四、配置文件

文章目录1. 文件类型1.1 properties1.2 yaml1.2.1 简介1.2.2 基本语法1.2.3 数据类型1.2.4 示例2. 配置提示1. 文件类型 1.1 properties 同以前的properties的用法 1.2 yaml 1.2.1 简介 YAML 是 “YAML Ain’t Markup Language”&#xff08;YAML 不是一种标记语言&#x…

Python常用医疗AI库以及案例解析(场景化进阶版)

📊 框架应用拓扑图用例 #mermaid-svg-lZ1J5KCaVWBV2kAu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lZ1J5KCaVWBV2kAu .error-icon{fill:#552222;}#mermaid-svg-lZ1J5KCaVWBV2kAu .error-text{fill:#552222;st…

Python高效操作Kafka实战指南

Python操作Kafka的高效 以下是使用Python操作Kafka的高效消息发送实例,涵盖基础发送、批量处理、异步回调等场景。示例基于confluent-kafka库(推荐)和kafka-python库,代码均经过实测。 流程图 基础消息发送(同步) from confluent_kafka import Producerproducer = Pro…

离线快速处理PDF格式转化的方案

日常办公中&#xff0c;PDF 几乎成了我们离不开的文件格式。然而像 WPS 这样的工具&#xff0c;不少实用功能都需要额外付费才能解锁。它的打开方式很简单&#xff0c;双击桌面图标即可运行。它不会弹出主界面&#xff0c;而是默默驻留在系统托盘区&#xff0c;需要时双击图标就…

SpringMVC注解与SpringCloudOpenFeign注解对比

1. 背景知识 梳理SpringMVC和SpringCloudOpenFeign常用注解后&#xff1a; Spring MVC中常用注解_笔记-CSDN博客Spring Cloud OpenFeign 常用注解_笔记-CSDN博客 这里对两类注解做个对比。理解两者定位&#xff08;服务端 vs 客户端&#xff09;是掌握注解使用的关键&#x…

Linux 时间同步的流程

一、问题时间RTC时间、系统时间(UTC)和本地时间的关系如下&#xff1a;‌RTC时间‌&#xff08;硬件时钟&#xff09;&#xff1a;显示为UTC时间格式&#xff1a;02:50:35/02:51:28由主板电池供电&#xff0c;独立于系统运行‌12通常存储UTC时间&#xff08;Linux默认配置&…

VSCode——python选择解释器消失的解决办法

VSCode软件的左下角 设置——检查更新&#xff1a;

笛卡尔积规避:JOIN条件完整性检查要点

笛卡尔积是数据库查询中的高风险操作&#xff0c;多表JOIN时缺失有效关联条件会导致结果集指数级膨胀&#xff0c;引发‌性能塌方‌甚至系统崩溃‌。以下是核心检查策略及防御方案&#xff1a;一、笛卡尔积的致命影响‌‌性能塌方‌百万级订单表与千万级用户表缺失ON条件时&…

Vimba相机二次开发教程,基于Python

文章目录安装获取图像辅助数据Vimba 是由 Allied Vision 开发的一套软件开发套件&#xff08;SDK&#xff09;&#xff0c;主要用于控制和操作其工业相机产品。它提供了一套完整的 API 和工具&#xff0c;支持多种操作系统和编程语言&#xff0c;便于开发者快速集成相机功能到应…

电子测试行业软件ATECLOUD与ETEST对比分析-纳米软件

在当今科技飞速发展的时代&#xff0c;电测行业对于自动化测试平台的依赖程度日益加深。高效、精准的自动化测试平台不仅能够提升测试效率&#xff0c;还能确保产品质量。ATECLOUD 与 ETEST 作为电测行业中颇受瞩目的自动化测试平台&#xff0c;各自展现出独特的优势与特点。下…

自动化测试中的常见测试方法

自动化测试中的常见测试方法在自动化测试中&#xff0c;除了数据驱动&#xff08;Data-Driven Testing&#xff09;&#xff0c;还有多种主流方法&#xff0c;每种方法适用于不同场景和需求。以下是常见的自动化测试方法分类及详解&#xff1a;一、关键字驱动测试&#xff08;K…

口语01-don‘t judge a book by its cover

Dont judge a book by its cover 不要以貌取人1 the most advanced thing2 stack3 right4 frantically5 be annoyed with sb6 Get your stuff off my desk7 But today I came to class and was running a few minutes late.8 take my seat&#xff1a;占我座位 / 坐我的位置9 s…

《Uniapp-Vue 3-TS 实战开发》自定义预约时间段组件

这个组件可以直接在 uniapp 项目中使用,提供了 24 小时时段选择功能,支持单选 / 多选、预设时段选择、随机选择等功能。 html版本: <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="vi…

《Uniapp-Vue 3-TS 实战开发》自定义环形进度条组件

引言 在UniApp中使用Vue3和TypeScript开发环形进度条组件,我们可以考虑三种技术:Canvas、SVG和纯HTML(利用CSS)。考虑到兼容性、实现难度和效果,SVG是较好的选择。它可以轻松实现环形进度条,支持渐变色,并且可以通过属性精确控制进度,同时在不同分辨率屏幕上清晰显示…

MybatisPlus-17.扩展功能-JSON处理器

一.JSON处理器数据库中有的字段会以JSON格式来进行存储。类型为json类型。但是在java中我们没有这样的数据类型&#xff0c;一般会以字符串接收&#xff0c;这样就会导致如果想要从数据库中获取json格式中的key和value的话会比较麻烦&#xff0c;还要进行字符串操作。那么有没有…

【Web】DASCTF 2025上半年赛 wp

目录 phpms 再短一点点 泽西岛 phpms dirsearch请求太快会报429&#xff0c;要设置一手--delay&#xff0c;扫出来.git 跑一下githacker git stash list git stash show -p 注释的绕过参考&#xff1a;从国赛想到的一些php绕过注释符trick 发现很多函数都被disable了 这…