.net core 面试题 2023
文章目录
- 1. 什么是 ASP.net core
- 2. .net 术语
- 3. 托管资源 和 非托管资源
- 4. GC 和 垃圾回收
- 5. .net中所有类的基类
- 6. 如何实现对象的深拷贝
- 7. 依赖注入,为什么使用依赖注入
- 8. IOC容器的注入方法
- 9. ASP.net core 中 服务生命周期
- 10. scoped的 service 可以注入到 singleton的 service中吗
- 11. AOP?
- 12. jwt token 的原理
- 13. asp.net 中 middleware的概念
- 14. unmanaged types
- 15. unmanaged code, IDisposable
- 16. unsafe code
- 17. 值类型和引用类型
- 18. 装箱和拆箱
- 19. string a="" 和 string a = null 的 区别
- 20. int 和 System.Int32
- 21. int 是 System.Int32,最终也继承自object,为什么是值类型
- 22. string 和 System.String
- 23. string具有值类型的表现,为什么是引用类型
- 24 设计模式 设计原则
- 25 LockMethod(20)会死锁吗,竟然是不会的
- 26 await 和 task.wait
- 28.泛型?
- 28.泛型约束
- 29 泛型 为什么可以减少装箱拆箱的损耗
1. 什么是 ASP.net core
微软的 开源的 跨平台的 Web框架。比起asp.net更容易配置/模块化/扩展。
2. .net 术语
1. CLR,公共语言运行时(Common Language Runtime)
2. CIL,公共中间语言(Common Intermediate Language)
3. CTS,通用类型系统(Common Type System)
4. CLS,公共语言规范(Common Language Specification)
5. CLI,公共语言基础架构(Common Language Infrastructure)
6. BCL,基础类库(Base Class Library)
7. FCL,框架类库(Framework Class Library)
8. JIT,是.Net边运行边编译的一种机制(Just In Time)
3. 托管资源 和 非托管资源
1. 托管资源: 由CLR管理分配和释放的资源,也就是我们直接new出来的对象;(公共语言运行时的垃圾回收器回收托管对象使用的内存)。
2. 不受CLR控制的资源,也就是不属于.NET本身的功能,往往是通过调用跨平台程序集(如C++)或者操作系统提供的一些接口,比如Windows内核对象、文件操作、数据库连接、socket、Win32API、网络等。
4. GC 和 垃圾回收
GC:.NET Framework 的垃圾回收器管理应用程序的内存分配和释放
工作方式:每次您使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。但是,内存不是无限大的。最终,垃圾回收器必须执行回收以释放一些内存。垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。
.NET 的垃圾回收器管理应用程序的内存分配和释放。 每当有对象新建时,公共语言运行时都会从托管堆为对象分配内存。 只要托管堆中有地址空间,运行时就会继续为新对象分配空间。 不过,内存并不是无限的。 垃圾回收器最终必须执行垃圾回收来释放一些内存。 垃圾回收器的优化引擎会根据所执行的分配来确定执行回收的最佳时机。 执行回收时,垃圾回收器会在托管堆中检查应用程序不再使用的对象,然后执行必要的操作来回收其内存。
5. .net中所有类的基类
Object
6. 如何实现对象的深拷贝
1. 实现一个方法来new一个新的对象,对其中的引用类型属性全部new出来,值类型的对应旧对象依次赋值。2. 序列化成json等格式,再反序列化。
7. 依赖注入,为什么使用依赖注入
依赖注入将对象的生命周期交给DI框架来管理,在使用这些对象的时候,不需要new出来,而是直接从container中获取,从而降低了耦合性,降低了依赖,
使用依赖注入我们可以很好的管理类跟类之间的依赖,在我们设计应用程序的时候遵循这几原则,确保代码的可维护性和扩展性;另外在Core的架构中依赖注入提供了对象创建和生命周期管理的核心能力,各个组件之间的相互协作也是由依赖注入框架来实现的。
8. IOC容器的注入方法
1. 构造函数注入,在构造函数中将服务已参数的方式注入到类中。
2. 方法注入,通过指定的方法将服务实例传入类中。
3. 属性注入,通过设置实例到属性将服务实例注入到类中。DI 容器暂不支持该注入方式(autofac支持)。
9. ASP.net core 中 服务生命周期
1. Singleton 单例的,注册时创建,永久存在,相当于静态类,适合使用频繁,工具类类型的service。
2. Scoped 每个request创建一次实例,单个reqest之中在不同地方多次请求时返回的是同一个实例。适合大多数业务service。
3. Transient 同一request中的每次请求也会创建实例。适合轻量级的,无状态的service。
10. scoped的 service 可以注入到 singleton的 service中吗
通过构造函数注入的话是不被允许的,因为singleton的service在注册时需要被创建,而scoped service在此时并不存在实例,所以无法被注入到singleton的service中。 短生命周期的无法被注入到长生命周期的service中。
通过方法注入的话,可以在singlton中注入 IServiceScopeFactory/IServiceProvider,通过create scope,在cope中通过serviceProvider来request相应的scoped service。
11. AOP?
AOP(Aspect Oriented Programming),即面向切面编程。采用“横切”的思想,将软件系统的系统功能和业务功能分开。
常用的比如:
1. 缓存,http request 过来之后,先尝试查找缓存。
2. 验证,http request过来之后,立即对request进行验证。
3. 日志, http请求过来之后和出去之前,对request和response记录日志。
可以通过filter或者其他来实现。
12. jwt token 的原理
json web token,由server端生成,返回给前端,前端的request header中携带token。
token由三部分构成,头部header,荷载payload,签名signature。
header和payload是base64加密的可以被解析出来,signature指定盐值或者私钥指定加密算法来对前两部分的base64码加密,类似于校验和,密码等,server通过该signature来判断是否是合法token。
常用加密算法 SHA256, RS256, RSA.
13. asp.net 中 middleware的概念
位于request和 response之间的 用来出里request或者修改response的这样的组件。可以串联执行,通过next方法来进入下一个middleware的处理,next前后均可以添加code。
14. unmanaged types
A type is an unmanaged type if it’s any of the following types:
sbyte, byte, short, ushort, int, uint, long, ulong, nint, nuint, char, float, double, decimal, or bool
Any enum type
Any pointer type
Any user-defined struct type that contains fields of unmanaged types only.
15. unmanaged code, IDisposable
Managed Code - Code that could be understood and managed by CLR,只会与虚拟机交互
Unmanaged Code - Code that could not handled by CLR,需要直接访问虚拟机之外,CLR无法完成的操作。
16. unsafe code
C# supports an unsafe context, in which you may write unverifiable code. In an unsafe context, code may use pointers, allocate and free blocks of memory, and call methods using function pointers. Unsafe code in C# isn’t necessarily dangerous; it’s just code whose safety cannot be verified.
Unsafe code has the following properties:
Methods, types, and code blocks can be defined as unsafe.
In some cases, unsafe code may increase an application’s performance by removing array bounds checks.
Unsafe code is required when you call native functions that require pointers.
Using unsafe code introduces security and stability risks.
The code that contains unsafe blocks must be compiled with the AllowUnsafeBlocks compiler option.
17. 值类型和引用类型
基类不同:
值类型继承自 System.ValueType;
引用类型继承自 System.Object;
内存分配不同
值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。引用类型的对象总是在进程堆中分配(动态分配)。
equal比较不同
值类型由于ValueType重写了Object的Equals()方法,会使用实例的值来比较,而不是地址;
引用类型是使用引用地址来判断是否相等。
初始值不同
值类型具有初始值(0,‘\0’,false’);
引用类型初始值是null。
生命周期不同
值类型生命周期是其定义域。当离开定义域后立即销毁释放。
引用类型是由CLR的垃圾回收策略控制回收的,具体销毁时间对开发者来说是透明的不可见的。
值类型包括C#的基本类型(用关键字int、char、float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型),可空类型(int?,char?);而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类)。 C#中的每一种类型要么是值类型,要么是引用类型。所以每个对象要么是值类型的实例,要么是引用类型的实例。
18. 装箱和拆箱
装箱:将值类型转换为一个引用类型
装箱步骤:
1. 在托管堆上分配内存,内存大小为值类型所有字段的大小和类型对象指针加上同步块索引的大小。
2. 将值类型的所有字段复制到刚分配的内存中。
3. 返回刚分配的内存地址
拆箱:将引用类型转换成值类型
拆箱步骤:
获取引用类型所有字段对应的地址,这里拆箱已经完成了。
拆箱操作完成后,会发生一次字段的复制。
19. string a=“” 和 string a = null 的 区别
string a = “” 用空字符串创建了一个新的字符串实例,a指向该字符串实例,只是该字符串为空,可以调用方法,比如a.concat/split 不会报错。分配了两块内存,一块存a本身,一块存a指向的字符串"".
string a = null 将a设置为空引用,不指向任何地址,如果调用a.concat/split会报错null reference。只分配了一块内存,存a本身。
20. int 和 System.Int32
int 是C#中对.net的 System.Int32的别名。
Object->ValueType->Int32
21. int 是 System.Int32,最终也继承自object,为什么是值类型
System.Object->System.ValueType(abstract)->Int32
22. string 和 System.String
别名
23. string具有值类型的表现,为什么是引用类型
不是继承自System.ValueType,所以不是值类型而是引用类型;因为改写了Equals方法,同时不可变,所以表现的像是值类型。
24 设计模式 设计原则
设计模式:
1. 创建型模式:工厂模式,单例模式,建造者模式
2. 结构型模式:代理模式,外观模式,桥接模式
3. 行为型模式:观察者模式,命令模式,状态模式,访问者模式,中介者模式,
设计原则:
1. 开闭原则(Open Closed Principle),一个软件实体,如类、模块和函数应该 对扩展开放,对修改关闭。
2. 单一职责原则(Single Responsibility Principle),一个类应该只有一个发生变化的原因。
3. 里氏替换原则(Liskov Substitution Principle),所有引用基类的地方必须能透明地使用其子类的对象。
4. 依赖倒置原则(Dependence Inversion Principle),上层模块不应该依赖底层模块,它们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
5. 接口隔离原则(Interface Segregation Principle),每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。
6. 迪米特法则(最少知道原则)(Law of Demeter),一个类对自己依赖的类知道的越少越好。无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。
7. 合成复用原则(Composite Reuse Principle),尽量使用对象组合/聚合,而不是继承关系达到软件复用的目的。
25 LockMethod(20)会死锁吗,竟然是不会的
private static readonly object lock1 = new object();public void LockMethod(int n){lock (lock1){if (n > 10){n--;LockMethod(n);}}}
将这段代码拷入VS中运行,发现没有进入死锁,于是想找个权威的理由来解释它,终于在《CLR via C#》第二版(中文版,清华大学出版社出版)的第530页中第7行找到了这样的描述:“同样需要引起注意的是线程可以递归拥有同步块”。即同一线程可以递归调用lock语句。
26 await 和 task.wait
await 是 异步等待,会切换线程;
task.wait 是 同步等待。
28.泛型?
List, List
28.泛型约束
约束 描述
where T : struct 类型参数必须是不可为 null 的值类型。 有关可为 null 的值类型的信息,请参阅可为 null 的值类型。 由于所有值类型都具有可访问的无参数构造函数,因此 struct 约束表示 new() 约束,并且不能与 new() 约束结合使用。 struct 约束也不能与 unmanaged 约束结合使用。
where T : class 类型参数必须是引用类型。 此约束还应用于任何类、接口、委托或数组类型。 在 C#8.0 或更高版本中的可为 null 上下文中,T 必须是不可为 null 的引用类型。
where T : class? 类型参数必须是可为 null 或不可为 null 的引用类型。 此约束还应用于任何类、接口、委托或数组类型。
where T : notnull 类型参数必须是不可为 null 的类型。 参数可以是 C# 8.0 或更高版本中的不可为 null 的引用类型,也可以是不可为 null 的值类型。
where T : default 重写方法或提供显式接口实现时,如果需要指定不受约束的类型参数,此约束可解决歧义。 default 约束表示基方法,但不包含 class 或 struct 约束。 有关详细信息,请参阅default约束规范建议。
where T : unmanaged 类型参数必须是不可为 null 的非托管类型。 unmanaged 约束表示 struct 约束,且不能与 struct 约束或 new() 约束结合使用。
where T : new() 类型参数必须具有公共无参数构造函数。 与其他约束一起使用时,new() 约束必须最后指定。 new() 约束不能与 struct 和 unmanaged 约束结合使用。
where T : 类型参数必须是指定的基类或派生自指定的基类。 在 C# 8.0 及更高版本中的可为 null 上下文中,T 必须是从指定基类派生的不可为 null 的引用类型。
where T : ? 类型参数必须是指定的基类或派生自指定的基类。 在 C# 8.0 及更高版本中的可为 null 上下文中,T 可以是从指定基类派生的可为 null 或不可为 null 的类型。
where T : 类型参数必须是指定的接口或实现指定的接口。 可指定多个接口约束。 约束接口也可以是泛型。 在 C# 8.0 及更高版本中的可为 null 上下文中,T 必须是实现指定接口的不可为 null 的类型。
where T : ? 类型参数必须是指定的接口或实现指定的接口。 可指定多个接口约束。 约束接口也可以是泛型。 在 C# 8.0 中的可为 null 上下文中,T 可以是可为 null 的引用类型、不可为 null 的引用类型或值类型。 T 不能是可为 null 的值类型。
where T : U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。 在可为 null 的上下文中,如果 U 是不可为 null 的引用类型,T 必须是不可为 null 的引用类型。 如果 U 是可为 null 的引用类型,则 T 可以是可为 null 的引用类型,也可以是不可为 null 的引用类型。
29 泛型 为什么可以减少装箱拆箱的损耗
list写死是objectList的话,也完全可以替代 List 和 List,但是此时比如list.add(1)的时候,这个1就会先进行装箱。由这里例子可以看出,泛型可以一定程度上避免直接使用object来涵盖所有类型的用法,从而避免装箱损耗。
相关文章:
.net core 面试题 2023
文章目录1. 什么是 ASP.net core2. .net 术语3. 托管资源 和 非托管资源4. GC 和 垃圾回收5. .net中所有类的基类6. 如何实现对象的深拷贝7. 依赖注入,为什么使用依赖注入8. IOC容器的注入方法9. ASP.net core 中 服务生命周期10. scoped的 service 可以注入到 sing…...

和ChatGPT关于Swing music的一场对话(上篇)
什么是 Swing Music ? Swing Music 是一款漂亮的自托管音乐播放器,适用于您的本地音频文件。就像一个更酷的 Spotify …但带上你自己的音乐。 第一次在 reddit 上看到 Swing Music,就被其 UI 吸引了 但源码站点的releases 中只有 windows 和 …...

java版工程项目管理系统源码 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单
ava版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示1…...

debian 10 扩展分区容量
debian 10 扩展分区容量1、扩展分区原因2、添加一块磁盘3、命令记录3.1、新增加的磁盘是/dev/sdb3.2、使用磁盘/dev/sdb 创建物理卷3.3、 把物理卷/dev/sdb加入到卷组debian-vg中3.4、查看物理卷、逻辑卷3.5、扩展逻辑卷/tmp3.6、逻辑卷组debian-vg 空余空间被用掉10g 还剩90g可…...

【无功优化】基于改进遗传算法的电力系统无功优化研究【IEEE30节点】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

LeetCode 218. 天际线问题
城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回 由这些建筑物形成的 天际线 。 每个建筑物的几何信息由数组 buildings 表示,其中三元组 buildings[i] [lefti, righti, heighti] 表示…...

Logstash:使用自定义正则表达式模式
有时 Logstash Grok 没有我们需要的模式。 幸运的是我们有正则表达式库:Oniguruma。在很多时候,如果 Logstash 所提供的正则表达不能满足我们的需求,我们选用定制自己的表达式。 定义 Logstash 是一种服务器端数据处理管道,可同时…...
常见的一致性问题及解决
什么是一致性 一致性问题主要是因为分布式系统中的多个节点之间可能存在网络延迟、故障等原因导致的。具体而言,分布式系统中的数据一致性问题可以分为以下几种类型: 强一致性:指在任何时间点,所有节点中的数据都是一致的。这种…...
vue下载文件
注意请求时加入:responseType: bloburl:写全了,因为前后端端口号不同downloadImage(imgUrl) {let formData new FormData();formData.append(fileName, this.getFilename(imgUrl)); // 用于后端下载文件的路径axios.post(http://localhost:8…...

人人都是数据分析师-数据分析之数据图表可视化(下)
当前的BI报表、运营同学的汇报报告中数据图表大多为 表格、折线图、柱状图和饼图,但是实际上还有很多具有代表性的可视化图表,因此将对常见的可视化图表进行介绍,希望这些图表可视化方法能够更好的提供数据的可用性。 人人都是数据分析师-数…...

考勤、充电,绑身份,你的人员定位系统就缺它了!
我们做人脸识别智能发卡充电柜是要解决什么问题? (1)工地、港口等场景,人员流动大,管理难 在工地、港口等场景,人员组成通常比较复杂。有来自施工方、客户、各劳务队、各管理层的人员,以及来自…...

RocketMQ水平扩展及负载均衡详解
文章目录 Broker端水平扩展Broker负载均衡commit logProducer负载均衡Consumer负载均衡集群模式广播模式RocketMQ是一个分布式具有高度可扩展性的消息中间件。本文旨在探索在broker端,生产端,以及消费端是如何做到横向扩展以及负载均衡的。 Broker端水平扩展 Broker负载均衡…...
java接口笔记
关键字:interface 定义形式:interface 接口名 { 接口体 } 细节: 1.接口里的方法可以为抽象方法,静态方法,默认方法(default 关键字) 2.接口里的方法只能是public ,可以不用写&a…...

安利安利-向大家推荐一个超级牛的etcd管理工具-EtcdKeeperFyne
etcd介绍 关于etcd的介绍大家可以看下这篇文章 etcd 开源仓库地址:EtcdKeeperFyne EtcdKeeperFyne 今天主要是向大家推荐一款使用起来特别方便的Etcd管理工具 EtcdKeeperFyne,具体运行起来的界面如下: 推荐原因 使用简单安装简单&…...
数字经济系列讲座-数字化平台(商业购物平台)
数字经济系列讲座 文章目录 钱的流向退货成本research questionLiterature review现金流发生在平台内侧平台商业模式转型Modelmodel 假设四种情形标记符利润函数&效用函数&平台效益模型构建利润对比图结论future directions讲座题目 To Adopt or not? The Impacts of…...
python3中collections模块详解
collections模块简介 collections包含了一些特殊的容器,针对Python内置的容器,例如list、dict、set和tuple,提供了另一种选择; namedtuple,可以创建包含名称的tuple; deque,类似于list的容器&a…...
护网面试题2.0
1.CSS和CSRF区别 通俗点讲的话: XSS通过构造恶意语句获取对方cookie, CSRF通过构造恶意链接利用对方cookie,但看不到cookie XSS比CSRF更加容易发生,但CSRF比XSS攻击危害更大 2.XSS原理 XSS(Cross-Site Scripting&…...

学习计算机组成原理第1天(计算机发展历程)
计算机发展历程计算机硬件发展计算机软件的发展经典例题计算机硬件发展 计算机的四代变化 1)第一代计算机(1946-1957年)电子管时代。特点:逻辑元件采用电子管;使用机器语言进行编程;主存用延迟线或磁鼓存储…...
二维字符数组与char** 关系 段错误打印
如下为错误,打印断错误。 具体原因参考 http://c.biancheng.net/view/2022.html 二维字符数组与char** 关系 原因: char a[2][20] ; 这是一个二维字符数组。 二维字符数组,这里相当于是两个一维字符串数组。这两个数组在内存的存放位置可以…...

从url输入到页面呈现发生了什么
从url输入到页面呈现发生了什么 1.URL解析 encodeURI / decodeURI 对整个URL的编码:处理空格/中文 let url "http://https://blog.csdn.net/api/ ?lx1&name科比&fromhttp://www.baidu.com/"; console.log(encodeURI(url));encodeURICompone…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...

Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

五、jmeter脚本参数化
目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...