1_预处理指令

(1)源代码指定了程序的定义,预处理指令(preprocessor directive)指示编译器如何处理源代码。例如,在某些情况下,我们希望编译器能够忽略一部分代码,而在其他情况下,我们希望代码被编译,这时我们就可以使用预处理指令了。

(2)基本规则

  • 预处理指令必须和C#代码在不同的行  

  • 与C#语句不同,预处理指令不需要以分号结尾

  • 包含预处理指令的每一行必须与 ‘’#‘’ 字符开始(在#字符前可以有空格,在#字符和指令之间也可以有空格)

  • 允许行尾注释

  • 在预处理指令所在的行不允许有分隔符注释

(3)C# 预处理器指令列表

预处理器指令描述
#define它用于定义一系列成为符号的字符。
#undef它用于取消定义符号。
#if它用于测试符号是否为真
#else它用于创建复合条件指令,与 #if 一起使用。
#elif它用于创建复合条件指令。
#endif指定一个条件指令的结束。
#line它可以让您修改编译器的行数以及(可选地)输出错误和警告的文件名。
#error它允许从代码的指定位置生成一个错误。
#warning它允许从代码的指定位置生成一级警告。
#region它可以让您在使用 Visual Studio Code Editor 的大纲特性时,指定一个可展开或折叠的代码块。
#endregion它标识着 #region 块的结束。
#define Debug //定义一个编译符号类似于定义一个变量,#define 声明,c#中的预处理指令
#define Log
#undef Log
static void Main(string[] args)
{
#if Log //当存在Log的时候执行1,后续不执行Console.WriteLine("执行了");//执行1
#elif Debug //当Log不存在,Debug存在时执行2,后续不执行Console.WriteLine("Debug");//执行2
#else  //当上述条件都不满足时执行Console.WriteLine("world");//执行3
#endif//上述相当于if elseif ...else 
}

2_特性

2.1_特性的定义

(1)特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。

特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。

特性(Attribute)是一种可由用户自有定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标。我们可以对类、以及C#程序集中的成员进行进一步的描述。

简单地说,Attribute的作用是为它们的附着体追加上一些额外的信息(这些信息保存在附着物的体内)——比如“这个类是我写的”或者“这个函数以前出过问题”等等

(2)元数据:保存在程序集中有关程序及其类型的数据。元数据主要用来描述C#中各种元素(类,方法,构造函数,属性等)。

(3)Attribute与注释的区别

注释是对程序源代码的一种说明,主要目的是给人看的,在程序被编译的时候会被编译器所丢弃,因此,它丝毫不会影响到程序的执行。

Attribute是程序代码的一部分,它不但不会被编译器丢弃,而且还会被编译器编译进程序集(Assembly)的元数据(Metadata)里。在程序运行的时候,随时可以从元数据中提取出这些附加信息,并以之决策程序的运行。

元数据:.NET中元数据是指程序集中的命名空间、类、方法、属性等信息,这些信息是可以通过Reflection读取出来的。

(4)常用特性:

AttributeUsage,Conditional,Obsolete,Category , Description , Browsable , DefaultValue ,Serializable

2.2_三种预定义特性分类
2.2.1_Conditional条件特性

这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符。它会引起方法调用的条件编译,取决于指定的值,比如 Debug 或 Trace。例如,当调试代码时显示变量的值。

Conditional条件特性 应用在方法上,让方法按照条件执行 全称:ConditionalAttribute

#define Debug
static void Main(string[] args)
{Test1();Test2();
}
public static void Test1()
{Console.WriteLine("Test1");
}
//Conditional条件特性 应用在方法上,让方法按照条件执行 全称:ConditionalAttribute
//Debug就是一个编译符号,当定义了这个编译符号,才会编译Test2;
[Conditional("Debug")]
public static void Test2()
{Console.WriteLine("Test2");
}
2.2.2_Obsolete废弃特性

这个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。例如,当一个新方法被用在一个类中,但是您仍然想要保持类中的旧方法,您可以通过显示一个应该使用新方法,而不是旧方法的消息,来把它标记为 obsolete(过时的)。

  • 参数 message,是一个字符串,描述项目为什么过时以及该替代使用什么。

  • 参数 iserror,是一个布尔值。如果该值为 true,编译器应把该项目的使用当作一个错误。默认值是 false(编译器生成一个警告)。

[Obsolete(message)]
[Obsolete(message,iserror)]
static void Main(string[] args)
{Test1();Test2();
}
//Obsolete 参数1:提示信息,参数2 bool值 为true的时候,代表此方法不可用
[Obsolete("这个方法已经被弃用,可以使用Test2方法代替",true)]//这个方法已经被弃用,可以使用Test2方法代替
public static void Test1()//1.0
{Console.WriteLine("Test1");
}
public static void Test2()//2.0
{Console.WriteLine("Test2");
}
2.2.3_AttributeUsage预定义特性

预定义特性 AttributeUsage 描述了如何使用一个自定义特性。它规定了特性可应用到的项目的类型。

  • 参数 validon 规定特性可被放置的语言元素。它是枚举器 AttributeTargets 的值的组合。默认值是 AttributeTargets.All。

  • 参数 AllowMultiple(可选的)为该特性的 AllowMultiple属性(property)提供一个布尔值。如果为 true,则该特性是多用的。默认值是 false(单用的)。

  • 参数 inherited(可选的)为该特性的 Inherited 属性(property)提供一个布尔值。如果为 true,则该特性可被派生类继承。默认值是 false(不被继承)。

[AttributeUsage(validon,AllowMultiple=allowmultiple,Inherited=inherited)]
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property, 
AllowMultiple = true)]
2.2.4_自定义特性

(1)特性本质上就是一个类:

  1. 命名建议以Attribute结尾,建议使用大驼峰。

  2. 必须继承基类Attribute

  3. 使用AttributeUsage特性来控制自定义的特性的应用范围。

(2)小技巧:怎么判断对象是一个特性呢?看对象的结尾是否以Attribute结尾,只要以Attribute结尾的基本上是特性。 特性在定义时,建议以Attribute结尾。特性肯定是一个类,必须继承Attribute。Atribute是特性的基类。

(3)自定义一个特性

//AttributeUsage也重载了|运算符
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple =true)]
public  class MyAttribute:Attribute
{/// <summary>/// 版本,提示,创建时间/// </summary>public string Version { get; set; }public string Message { get; set; }public string CallTime { get; set; }public MyAttribute(string version,string message,string callTime) {Version= version;Message= message;CallTime= callTime;}
}

(4)自定义特性的使用

[MyAttribute("1.0","张三","2025-08-11")]
internal class Program
{//自定义特性可以简写// [My("1.0", "张三", "2025-08-11")]public string id { get; set; }static void Main(string[] args){Test();//原始方法//反射预热//通过反射获取Type t1 = typeof(Program);//拿到Program类的类型,因为Test在ProgramConsole.WriteLine(t1);MethodInfo mi=t1.GetMethod("Test");//拿到Test方法//mi不能使用()执行,需要使用Invoke调用mi.Invoke(null,null);//获取test1上使用的特性//参数1:特性的类型//参数2:是否支持继承搜索object[] attrs = mi.GetCustomAttributes(typeof(MyAttribute),false);foreach (MyAttribute attr in attrs){Console.WriteLine(attr.Version);}Console.WriteLine(attrs);}[My("1.0", "张三", "2025-08-11")][My("2.0", "李斯", "2025-08-11")]public static void Test(){Console.WriteLine("方法1");}public static void Test2(){}public static void Test3(){}
}
2.2.5_其他特性:应用于自定义控件中:

(1)特性:

  • Description特性用来给属性和事件添加描述信息(解释说明)

  • Category 特性用来给属性分类 默认分类放到"杂项"

  • Browsable 特性用来控制属性是否在属性窗口中出现

  • DefaultValue 特性 设置默认值 在 Visual Studio 的属性窗口中,如果属性值等于默认值,属性值会显示为普通文本;如果被修改过,则会显示为粗体。

(2)多个特性的时候,可以用英文逗号分割

//自定义控件,继承自UserControl用户空间 
public partial class UserControl1 : UserControl{public UserControl1(){InitializeComponent();}//Description特性用来给属性和事件添加描述信息(解释说明)//Category 特性用来给属性分类   默认分类放到"杂项"//Browsable 特性用来控制属性是否在属性窗口中出现// DefaultValue 特性 设置默认值 在 Visual Studio 的属性窗口中,如果属性值等于默认值,属性值会显示为普通文本;如果被修改过,则会显示为粗体。[Description("控制账号信息")][Category("吴亦凡")][Browsable(true)][DefaultValue("吴亦凡的账号")]public  string Account{get { return textBox1.Text; }set { textBox1.Text = value; }}//多个特性的时候,可以用英文逗号分割[Description("控制密码信息"),Category("吴亦凡"),Obsolete("不建议使用此属性")]public string Password{get { return textBox2.Text; }set { textBox2.Text = value; }}}

3_反射

3.1_反射的定义

(1)反射是指在程序运行中,查看、操作其他程序集或者自身的元数据的各种信息(类、方法,属性、变量、对象等)的行为。C#中的反射(Reflection)是一种强大的功能,允许你在运行时检查和操作程序集、类型和对象的信息,基本上,使用反射可以在代码运行时检查和操作指定的类及其成员。C#反射的原理主要基于元数据(与C#特性相似),即程序集中存储的有关类型、方法等的信息。因为反射可以在程序编译后获得信息,所以它提高了程序的拓展性和灵活性。

反射就是为了拿到各种元素对应的标签。Reflection反射。使用反射时,代码性能低,因为反射使用了装箱和拆箱。

(2)优缺点

优点:

  • 反射提高了程序的灵活性和扩展性。

  • 降低耦合性,提高自适应能力。

  • 它允许程序创建和控制任何类的对象,无需提前硬编码目标类。

缺点:

  • 性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。

  • 使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

(3)反射的作用

反射(Reflection)有下列用途:(可以让查看或使用程序集以及程序集中的对象多了一种方法)

  • 它允许在运行时查看特性(attribute)信息。

  • 它允许审查集合中的各种类型,以及实例化这些类型。

  • 它允许延迟绑定的方法和属性(property)。

  • 它允许在运行时创建新类型,然后使用这些类型执行一些任务。

3.2_反射示例

(1)没有反射之前:查看或使用程序集以及程序集中的对象方法:1.引用程序集 2.引入命名空间,3.实例化

(2)有反射后:反射通过元数据获取程序集或者程序集的对象信息;主要信息:类型,成员(字段 属性 方法)...

(3)Type类:类型声明的类,

属性说明
Name属性类型名称
Namespace属性类所在的命名空间
FullName属性类所在的命名空间+类名
GetField()方法获取指定名称的公共字段
GetFields()方法获取所有的公共字段
GetProperty()方法获取指定名称的公共属性
GetProperties()方法获取所有的公共属性
GetMethod()方法获取指定名称的公共方法
GetMethods()方法获取所有的公共方法
GetNestedType()获取指定名称的嵌套类型(类中的类)
GetConstructor()获取类的构造函数
GetEvent()获取类的事件
GetCustomAttribute()获取类的特性
typeof() 和 GetType()/获取类型
Invoke() 和 InvokeMember()调用相应的成员
SetValue(),GetValue()设置属性,获取属性

typeof():获取参数的数据类型

Type type1=typeof(string);
Type type2=typeof(int);
Type type3=typeof(Student);
Console.WriteLine(type1);
Console.WriteLine(type2);
Console.WriteLine(type3);
Student student=new Student();//没有使用反射,直接创建实例
Type type4 = student.GetType();
Console.WriteLine(type4);
Console.WriteLine(type1.Name);//类型名称:string
Console.WriteLine(type4.Name);//Studetn
Console.WriteLine(type4.Namespace);//类所在的命名空间
Console.WriteLine(type4.FullName);//类所在的命名空间+类名

(5)Assembly类:表示一个程序集

方法说明
Load通过给定程序集的名称加载程序集
LoadFile加载指定路径上的程序集
LoadFrom已知程序集得文件名或路径,加载程序集
CreateInstance从程序集中加载指定得类型,并创建实例,返回值object类型

(4)通过反射获取信息的步骤

获取程序集——》创建类的实例——》获取实例的类型——》通过Type的方法获取类的成员

//2.通过反射获取字段,属性,方法
//通过反射创建实例,Load()加载程序集
//如果加载的程序集在当前项目中的bin/DeBug中不存在,会加载失败
Assembly assembly = Assembly.Load("03_反射");
//CreateInstance()创建,在()里面传入完整的对象名称,用加载得程序集创建一个程序集中得对象得实例
//使用反射基础创建程序集中得某个类得实例
object t1 =assembly.CreateInstance("_03_反射.Student");//类似于new一个实例对象//类似于Student student=new Student();//获取字段
FieldInfo fieldInfo = type3.GetField("MyId");//获取公开的字段
fieldInfo.SetValue(t1, 12);
int myId=(int)fieldInfo.GetValue(t1);
Console.WriteLine(myId);
Console.WriteLine("=========获取所有的公共的字段============");
//获取所有的字段
FieldInfo[] fieldInfos= type4.GetFields();
foreach(var item in fieldInfos)
{Console.WriteLine(item.Name);
}
Console.WriteLine("----------获单个属性----------");
PropertyInfo  propertyInfo1=  type3.GetProperty("Name");
propertyInfo1.SetValue(t1, "吴亦凡");
string name = (string)propertyInfo1.GetValue(t1);
Console.WriteLine(name);
Console.WriteLine("----------获取所有公开属性----------");
PropertyInfo [] propertyInfos = type3.GetProperties();
foreach (var item in propertyInfos)
{Console.WriteLine(item);if (item.Name=="Name"){item.SetValue(t1, "罗志祥");}
}
Console.WriteLine("--------获取方法-------");
MethodInfo methodInfo= type3.GetMethod("Method2");
//注意:通过数组的形式传入参数
methodInfo.Invoke(t1, new object[] { "a123","b123"});
MethodInfo []methodInfos= type3.GetMethods();Type s1= type3.GetNestedType("SamllStudent");//获取Student类下的SamllStudent
object s12 =  assembly.CreateInstance(s1.FullName);

4_加密和解密

(1)加密算法分类:对称加密,非对称加密,散列算法加密。 对称加密:使用相同的密钥对数据进行加密和解密。如:DES算法、AES算法 非对称加密:使用一对公钥和私钥来进行加密和解密。如:RSA算法 散列算法加密:任意长度的数据转换为固定长度的哈希值。如:MD5算法、SHA算法

公钥:主要用来把明文加密成密文,用到key。 私钥:主要用来把密文解密成明文,用到的key。

(2)常用加密算法了解: C#中的加密解密方法:对称、非对称与散列算法详解-CSDN博客

MD5和DES加密及解密封装参考: C#:使用MD5对用户密码加密与解密 - Healer2047 - 博客园

(3)将加密和解密的类封装,在使用的时候直接调用。

文件地址:"D:\上位机\扩展\EncryptTool.dll"

5_单例模式

什么是设计模式?

设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。我们使用设计模式最终的目的是实现代码的 高内聚 和 低耦合。

什么是高内聚和低耦合?

举例一个现实生活中的例子,例如一个公司,一般都是各个部门各司其职,互不干涉。各个部门需要沟通时通过专门的负责人进行对接。在软件里面也是一样的 一个功能模块只是关注一个功能,一个模块最好只实现一个功能。这个是所谓的内聚,模块与模块之间、系统与系统之间的交互,是不可避免的, 但是我们要尽量减少由于交互引起的单个模块无法独立使用或者无法移植的情况发生, 尽可能多的单独提供接口用于对外操作, 这个就是所谓的低耦合

什么是单例模式?

从“单例”字面意思上理解为一个类只有一个实例,所以单例模式也就是保证一个类只有一个实例的一种实现方法(设计模式其实就是帮助我们解决实际开发过程中的方法, 该方法是为了降低对象之间的耦合度,然而解决方法有很多种,所以前人就总结了一些常用的解决方法为书籍,从而把这本书就称为设计模式)

官方定义:确保一个类只有一个实例,并提供一个全局访问点。

为什么会有单例模式?它在什么情况下使用的?

从单例模式的定义中我们可以看出:单例模式的使用自然是当我们的系统中某个对象只需要一个实例的情况,例如:操作系统中只能有一个任务管理器,操作文件时,同一时间内只允许一个实例对其操作等,既然现实生活中有这样的应用场景,自然在软件设计领域必须有这样的解决方案了(因为软件设计也是现实生活中的抽象),所以也就有了单例模式了。

单例模式和静态类的区别?

  1. 首先单例模式会提供给你一个全局唯一的对象,静态类只是提供给你很多静态方法,这些方法不用创建对象,通过类就可以直接调用;

  2. 单例模式的灵活性更高,方法可以被override,因为静态类都是静态方法,所以不能被override;

  3. 如果是一个非常大的对象,单例模式可以懒加载,静态类就无法做到

那么什么时候时候应该用静态类,什么时候应该用单例模式呢?首先如果你只是想使用一些工具方法,那么最好用静态类,静态类比单例类更快,因为静态的绑定是在编译期进行的。如果你要维护状态信息,或者访问资源时,应该选用单例模式。还可以这样说,当你需要面向对象的能力时(比如继承、多态)时,选用单例类,当你仅仅是提供一些方法时选用静态类。

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

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

相关文章

【开题答辩全过程】以 微信小程序的医院挂号预约系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

鸿蒙ArkUI 基础篇-06-组件基础语法-Column/Row/Text

目录 掌握组件写法&#xff0c;使用组件布局界面 ArkUI与组件 先布局再内容 DevEco Studio代码实战 预览效果 总结 练习 掌握组件写法&#xff0c;使用组件布局界面 ArkUI与组件 ArkUI&#xff08;方舟开发框架&#xff09;&#xff1a;构建 鸿蒙 应用 界面 的框架 组件…

8.27 网格memo

lc329计算矩阵中最长递增路径长度尝试从矩阵每个位置出发&#xff0c;int dfs() 往上下左右四个方向找严格递增的路径retmax(ret,dfs(x,y)1);return memo[i][j]ret;返回所有路径里的最长长度 class Solution {public:int dx[4]{0,0,1,-1};int dy[4]{1,-1,0,0};int m,n;vector&l…

flume监控文件写入 Kafka 实战:解耦应用与消息队列的最佳实践

flume监控文件写入 Kafka 实战&#xff1a;解耦应用与消息队列的最佳实践 在日志采集场景中&#xff0c;直接让应用程序通过 log4j2 写入 Kafka 会导致应用与 Kafka 强耦合&#xff08;如 Kafka 故障可能影响应用运行&#xff09;。更优的方案是&#xff1a;应用程序将日志写入…

从浏览器无法访问到Docker容器的 FastAPI 服务地址【宿主机浏览器和容器不在同一个网络层面:端口映射】

文章目录1. 问题根源&#xff1a;Docker 网络模型2. 解决方案&#xff1a;端口映射&#xff08;Port Mapping&#xff09;方法 1&#xff1a;重新运行容器并添加端口映射&#xff08;推荐&#xff09;方法 2&#xff1a;获取宿主机的 IP 进行访问&#xff08;特定情况&#xff…

线性代数中矩阵等价与离散数学中关系的闭包之间的关联

最近在重温线性代数时&#xff0c;学到矩阵的等价的定义及其性质&#xff0c;发现其性质与离散数学中关系的闭包所要满足的性质非常相似&#xff0c;不由的让人不怀疑这二者之间存在某种关联&#xff0c;从而引发以下的思考&#xff1a;从deepseek的回答中我明白了矩阵的等价其…

从MyJUnit反思Java项目的工程实践(版本控制篇)

从 MyJUnit 反思Java项目的工程实践(版本控制篇) 参考资料 deepseekgithub copilotCSDN-Git代码管理工作流程&#xff1a;GitFlow详解Conventional Commits手册封面来自 qwen-image 遵循 git flow 分支管理模型 Git Flow 是一种围绕项目发布的核心分支模型, 它规定了不同的开发…

小工具推荐

小工具 ​ 平时不太喜欢去搜罗一些好用的工具&#xff0c;但是看到自己感兴趣的还是会记下来&#xff0c;有的是github上的开源项目&#xff0c;有的是一些直接在线的工具。主要是除了工作时间也不知道去干点什么&#xff0c;或者是和朋友玩玩游戏&#xff0c;或者是city walk…

【js】加密库sha.js 严重漏洞速查

前言sha.js 是 JavaScript 生态里最常用的轻量级加密库。它由 Browserify 社区维护&#xff0c;体积不足 20 KB&#xff0c;却实现了 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 全系列算法&#xff0c;是 crypto-browserify、webpack、web3.js 等数百个流行包的“根依赖”。而…

FPGA入门学习路径

FPGA入门学习路径 专业基础 数电&#xff08;数字电路基础-CSDN博客&#xff09; 语法 Verilog&#xff08;Verilog硬件描述语言-CSDN博客&#xff09; VHDL&#xff08;VHDL硬件描述语言-CSDN博客&#xff09; FPGA开发流程 常用接口设计 学习目的&#xff1a;通过简单…

HTML响应式设计的颜色选择器,适配各种屏幕尺寸

颜色选择器 响应式设计的颜色选择器&#xff0c;适配各种屏幕尺寸 支持色相滑块和RGB数值两种调色方式 点击颜色值或复制按钮即可复制十六进制颜色代码 自动根据背景色调整文字颜色确保可读性 包含复制成功提示动画效果 现代化UI设计&#xff0c;采用圆角、阴影和渐变背景 完全…

ChatGPT登录不进怎么办?

ChatGPT登录不进的核心原因分类ChatGPT登录失败并非单一问题导致&#xff0c;通常与网络环境、账号状态、设备设置及平台限制相关&#xff0c;不同场景下的故障表现与诱因存在明显差异&#xff0c;可分为以下四类&#xff1a;网络连接与地域限制&#xff1a;ChatGPT对访问地域有…

【ConcurrentHashMap】实现原理和HashMap、Redis哈希的区别

【ConcurrentHashMap】实现原理和HashMap、Redis哈希的区别【一】核心思想【1】HashMap​&#xff08;1&#xff09;概括&#xff08;2&#xff09;&#x1f680;线程不安全的场景和原因1-场景一&#xff1a;Put 操作导致的数据覆盖/丢失 (Lost Update)​​2-场景二&#xff1a…

Android 中使用开源库 ZXing 生成二维码图片

在 Android 中生成二维码是一个比较常见的功能&#xff0c;可以使用开源库 ZXing&#xff08;Zebra Crossing&#xff09;库来实现&#xff0c;这是一个非常流行的二维码生成和扫描库。 1、添加依赖库 在 app/build.gradle.kt 中添加依赖库。 dependencies { ......implementat…

vue 如何使用 vxe-table 来实现跨表拖拽,多表联动互相拖拽数据

vue 如何使用 vxe-table 来实现跨表拖拽&#xff0c;多表联动互相拖拽数据 row-drag-config.isCrossTableDrag 启用跨表格、多表格互相拖拽&#xff1b;跨表拖拽需要确保数据主键不重复&#xff0c;通过 row-config.keyField 指定主键字段名 查看官网&#xff1a;https://vxe…

微生产力革命:AI解决生活小任务分享会

微生产力革命的概念微生产力革命指利用AI技术高效解决日常琐碎任务&#xff0c;释放时间与精力。其核心在于将重复性、低价值的事务自动化&#xff0c;聚焦创造性或高价值活动。AI解决生活小任务的典型场景健康管理 AI健身助手可定制个性化训练计划&#xff0c;通过摄像头实时纠…

标量、向量、矩阵和张量的区别

注&#xff1a;本文为 “标量、向量、矩阵和张量的区别” 相关合辑。 英文引文&#xff0c;机翻未校。 如有内容异常&#xff0c;请看原文。 Difference Between Scalar, Vector, Matrix and Tensor 标量、向量、矩阵和张量的区别 Last Updated : 06 Aug, 2025 In the conte…

VScode,设置自动保存

在搜索框输入“autoSave”或VSCode提供以下自动保存选项&#xff1a; 在搜索框输入“autoSave” Off&#xff1a;禁用自动保存。 On Focus Change&#xff1a;当您将焦点从编辑器移开时自动保存。 On Window Change&#xff1a;当您切换窗口选项卡或编辑器时自动保存。 After D…

2025.8.27链表_链表逆置

链表中的指针只是用来标记&#xff0c;具体连接方式&#xff0c;是按照node.next链接。JAVA中头节点存东西&#xff0c;不是空的。核心原理&#xff1a;Java 的参数传递是"值传递"&#xff0c;但对象引用是"值传递引用"也就是传过来了ListNode head。headh…

ssc37x平台的音频应用demo

//ao_test.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include