【从零开始入门unity游戏开发之——C#篇40】C#特性(Attributes)和自定义特性
文章目录
- 前言
- 一、特性(`Attributes`)基本概念
- 二、自定义特性
- 1、自定义特性代码示例:
- 2、应用自定义特性:
- 3、解释
- 3.1 **AttributeUsage 特性**
- 3.2 特性的命名
- 3.3 **构造函数**:
- 3.4 **属性**:
- 4、使用反射获取特性信息
- 5、内置的系统特性
- 5.1 **`[AttributeUsage]`**
- 5.2 **`[Obsolete]`**
- 5.3 **`[Serializable]`**
- 5.4 **`[Conditional]`**
- 5.5 **`[DllImport]`**
- 5.6 **`[DebuggerDisplay]`**
- 5.7`[Flags]`
- 6、总结
- 专栏推荐
- 完结
前言
特性本身是通过类实现的,通常用于描述代码的某些方面(例如标记、验证、代码生成等),并可以在运行时通过反射获取。
一、特性(Attributes
)基本概念
在 C# 中,特性 是一种附加信息或元数据,允许开发者向程序集、类、方法、属性、字段等添加自定义标记或信息。用于在代码中嵌入描述信息,通常用于描述代码结构(如类、方法、属性等)的附加信息。这些元数据在编译时嵌入程序集,并可以在运行时通过反射获取。
- 本质:特性本质上是一个类,继承自
System.Attribute
类。 - 用途:可以将特性应用于类、方法、属性、字段、参数等,作为额外的元数据或标记。
- 反射:特性信息通常在运行时通过
反射
来访问。
二、自定义特性
为了定义一个特性,必须创建一个继承自 System.Attribute
的类。可以通过构造函数或者字段来传递数据。
1、自定义特性代码示例:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
public class MyCustomAttribute : Attribute
{public string Info { get; }// 构造函数public MyCustomAttribute(string info){Info = info;}// 可以在特性中定义方法public void DisplayInfo(){Console.WriteLine(Info);}
}
2、应用自定义特性:
[MyCustom("这是类的特性")]
public class MyClass
{[MyCustom("这是成员变量的特性")]public int Value;[MyCustom("这是方法的特性")]public void TestMethod(){Console.WriteLine("执行方法");}
}
3、解释
3.1 AttributeUsage 特性
-
AttributeTargets
:这是一个必填参数,类型为AttributeTargets
枚举的组合,指定了该特性可以应用于哪些程序元素。- All:所有可能的目标。
- Assembly:程序集级别。
- Class:类级别。
- Constructor:构造函数级别。
- Delegate:委托级别。
- Enum:枚举级别。
- Event:事件级别。
- Field:字段级别。
- Interface:接口级别。
- Method:方法级别。
- Module:模块级别(通常是指编译单元)。
- Parameter:参数级别。
- Property:属性级别。
- ReturnValue:返回值级别(用于特性应用于方法返回值)。
- Struct:结构体级别。
你可以通过按位或运算符 (
|
) 来组合多个目标。例如:[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class MyCustomAttribute : Attribute { }
这表示 MyCustomAttribute 可以应用于
类
和方法
。 -
AllowMultiple
:这是一个可选布尔参数,默认值为 false。如果设置为 true,则允许多个相同类型的特性应用于同一个程序元素。[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] public class MultiUseAttribute : Attribute { }
在这种情况下,你可以多次应用 MultiUseAttribute 到同一个类上
[MultiUse("First use")] [MultiUse("Second use")] public class MyClass { }
-
Inherited
:这也是一个可选布尔参数,默认值为 false。如果设置为 true,则子类会继承父类上的该特性;否则,子类不会继承这些特性。[AttributeUsage(AttributeTargets.Class, Inherited = true)] public class InheritableAttribute : Attribute { }
在这种情况下,如果 DerivedClass 继承了 BaseClass,并且 BaseClass 上有 InheritableAttribute,那么 DerivedClass 也会被认为具有该特性:
[Inheritable] public class BaseClass { }public class DerivedClass : BaseClass { }
3.2 特性的命名
在C#中,特性类名通常带有 Attribute 后缀,但在应用时可以省略。例如:
public class MyCustomAttribute : Attribute { }
然而,在实际应用这个特性时,你可以选择省略 Attribute 后缀。编译器会自动识别并匹配到相应的特性类。因此,以下两种写法是等价的:
[MyCustom("这是一个测试")]
public class MyClass { }[MyCustomAttribute("这是一个测试")]
public class MyClass { }
这种灵活性使得特性名称更加简洁,尤其是在频繁使用的情况下。不过,为了保持代码的一致性和可读性,建议在定义特性时始终使用完整的 Attribute 后缀,而在应用时可以选择省略
。
3.3 构造函数:
构造函数用于初始化特性实例,并接受参数以传递给特性。通过构造函数,你可以在应用特性时提供必要的信息。构造函数可以包含任意数量的参数,但通常应该尽量保持简单,以便易于使用。
示例:带参数的构造函数
public class MyCustomAttribute : Attribute
{public string Description { get; }// 构造函数接受一个字符串参数,并将其赋值给Description属性public MyCustomAttribute(string description){Description = description;}
}
在这个例子中,当你应用 MyCustom 特性时,必须提供一个字符串参数:
[MyCustom("这是一个测试类")]
public class MyClass { }
如果你需要传递多个参数,可以在构造函数中添加更多的参数:
public class MyCustomAttribute : Attribute
{public string Description { get; }public int Priority { get; }public MyCustomAttribute(string description, int priority){Description = description;Priority = priority;}
}// 应用特性时传递两个参数
[MyCustom("这是一个测试类", priority: 1)]
public class MyClass { }
3.4 属性:
属性用于存储特性接收到的数据,并可以在运行时通过反射访问这些数据。你可以定义任意数量的公共属性来保存不同类型的配置信息。
示例:定义和使用属性
public class MyCustomAttribute : Attribute
{public string Description { get; }public int Priority { get; }// 构造函数初始化属性public MyCustomAttribute(string description, int priority){Description = description;Priority = priority;}// 可选:定义只读或读写属性public bool IsEnabled { get; set; } = true;
}// 应用特性时设置属性
[MyCustom("这是一个测试类", priority: 1, IsEnabled = false)]
public class MyClass { }
注意,对于非构造函数参数的属性(如 IsEnabled
),你需要在应用特性时使用命名参数的形式来设置它们。
4、使用反射获取特性信息
你可以通过反射来访问类型或成员上应用的特性。在运行时,可以使用 Attribute.GetCustomAttributes
或 MemberInfo.GetCustomAttributes
方法来检索已应用的特性。
获取特性信息代码示例:
using System;
using System.Reflection;[AttributeUsage(AttributeTargets.Method)]
public class CustomMethodAttribute : Attribute
{public string Info { get; }public CustomMethodAttribute(string info){Info = info;}
}public class MyClass
{[CustomMethodAttribute("This is a custom method")]public void MyMethod(){Console.WriteLine("MyMethod executed.");}
}class Program
{static void Main(){// 获取 MyClass 类型上的所有方法MethodInfo methodInfo = typeof(MyClass).GetMethod("MyMethod");// 获取 MyMethod 上的 CustomMethodAttribute 特性CustomMethodAttribute attribute = (CustomMethodAttribute)Attribute.GetCustomAttribute(methodInfo, typeof(CustomMethodAttribute));if (attribute != null){Console.WriteLine(attribute.Info); // 输出: This is a custom method}}
}
5、内置的系统特性
C# 提供了许多内置的系统特性(Attributes),这些特性可以帮助开发者更高效地编写代码,控制编译器行为,以及与各种框架和工具进行交互。以下是C#中一些常用的系统内置特性及其应用场景。
5.1 [AttributeUsage]
前介绍的AttributeUsage
其实就是一个内置的系统特性,用于定义自定义特性的应用范围和其他行为。前面已经详细介绍过这个特性。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyCustomAttribute : Attribute { }
5.2 [Obsolete]
用于标记过时的方法、类或其他成员,告知其他开发者不要使用它们,并可以在必要时引发编译警告或错误。
//第一个参数是提示信息
//第2个参数可选,默认false,表示警告, true 表示这会导致编译错误
[Obsolete("请使用新方法代替", true)]
public void OldMethod() { }
效果
5.3 [Serializable]
指示类可以序列化,意味着该类的实例可以转换为字节流以便存储或传输。
[Serializable]
public class Person
{public string Name { get; set; }public int Age { get; set; }
}
解释:如果你希望把一个类的对象保存到文件或者通过网络发送出去,就需要用到这个特性。它告诉程序:“我可以被转换成数据流
”。
5.4 [Conditional]
指定条件编译符号,只有当符号定义时才会编译相应的方法调用。常用于调试信息记录。
[Conditional("DEBUG")]
public void DebugLog(string message)
{Console.WriteLine(message);
}
解释:当你只在某些条件下才想执行某个方法时(比如调试模式下记录日志),可以用这个特性。它告诉编译器只有当条件满足时才包含这段代码。
[Conditional]
特性和前面我们介绍得预编译指令 #if, #endif
实现效果类似,翻译成预编译指令如下:
#if DEBUG
public void DebugLog(string message)
{Console.WriteLine(message);
}
#endif
当你在方法上应用 [Conditional
] 特性时,编译器会根据你提供的条件符号来决定是否包含对该方法的调用。如果定义了该符号(这里是DEBUG
符合),则保留调用;否则,编译器会忽略这些调用,就好像它们不存在一样。
5.5 [DllImport]
主要用于调用外部库。
using System.Runtime.InteropServices;[DllImport("user32.dll", SetLastError = true)]
static extern bool SetCursorPos(int X, int Y);
解释:有时候你需要调用一些不是用C#写的函数(比如Windows系统的功能),这时就可以用这个特性。它告诉程序去哪里找这些函数。
之前开发桌面宠物时有时使用过很多,感兴趣可以看看:
【制作100个unity游戏之32】unity开发属于自己的一个2d/3d桌面宠物,可以实时计算已经获取的工资
5.6 [DebuggerDisplay]
用于自定义调试器显示的信息
,使得在调试时
更容易查看对象的状态。
[DebuggerDisplay("Name = {Name}, Age = {Age}")]
public class Person
{public string Name { get; set; }public int Age { get; set; }
}
比如,实际其实没啥用
5.7[Flags]
当你在枚举上应用 [Flags
] 特性时,它告诉编译器和开发者这个枚举的值可以按位组合(即通过按位或运算 |
组合多个值)。这样,你可以用一个单一的变量来表示多个选择,而不是为每个选择创建单独的变量。
[Flags]
public enum FileAccess
{Read = 1,Write = 2,ReadWrite = Read | Write
}
在这个例子中,FileAccess
枚举的值被设计成可以组合使用。例如,ReadWrite
是由 Read
和 Write
组合而成。
6、总结
学习 C# 自定义特性的意义在于它能够极大地增强代码的灵活性、可扩展性以及可读性。通过自定义特性(Attributes
),开发者可以在代码中添加元数据,并通过反射等机制动态地处理这些元数据,进而实现一些通用的功能和行为。这种技术在大型系统、框架和库中尤为重要。
可能在初期看不出太多具体的应用场景,但随着后面对 Unity
引擎的深入了解,你会发现自定义特性在项目中的强大作用。在 Unity 中,也自定义了很多默认的特性,很大程度上增强编辑器和游戏逻辑的灵活性和可扩展性,这个知识就留到【unity篇】
再讲解了。
专栏推荐
地址 |
---|
【从零开始入门unity游戏开发之——C#篇】 |
【从零开始入门unity游戏开发之——unity篇】 |
【制作100个Unity游戏】 |
【推荐100个unity插件】 |
【实现100个unity特效】 |
【unity框架开发】 |
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
相关文章:
【从零开始入门unity游戏开发之——C#篇40】C#特性(Attributes)和自定义特性
文章目录 前言一、特性(Attributes)基本概念二、自定义特性1、自定义特性代码示例:2、应用自定义特性:3、解释3.1 **AttributeUsage 特性**3.2 特性的命名3.3 **构造函数**:3.4 **属性**: 4、使用反射获取特…...
Unity2D无限地图的实现(简单好抄)
说明:本教程实现的是在2D游戏中玩家在游戏中上下左右移动的时候自动进行地图拼接的功能,如果你只想实现左右移动的无限地图,那么这篇博客也能起到一定参考作用。 思路 第一步: 创建一个10*10的2D游戏对象当做地图 第二步创建一个…...
OSPF特殊区域(open shortest path first LSA Type7)
一、区域介绍 1、Stub区域 Stub区域是一种可选的配置属性。通常来说,Stub区域位于自治系统的边界,例如,只有一 个ABR的非骨干区域。在这些区域中,设备的路由表规模以及路由信息传递的数量都会大量减少。 kill 4 5类type 传递1 …...
工程师了解的Lua语言
1、关于lua语言 lua语言是用于嵌入式领域当中的一门脚本语言,其实在大学期间,我也没有接触过这门语言,但是在未来的发展之路当中,需要用到这门语言,所以在我的知识库当中添加这门语言知识是必要而且重要的,…...
每日一学——日志管理工具(Graylog)
5.2 Graylog 5.2.1 输入输出配置 嘿,小伙伴们!今天我们要介绍的是Graylog——一款功能强大的日志管理工具。Graylog不仅可以帮助我们收集、存储和搜索日志数据,还可以通过丰富的插件系统进行扩展。让我们一起来看看如何配置Graylog来收集日…...
SQL Server中最大并行度详解
在 SQL Server 中,MAXDOP(Maximum Degree of Parallelism,最大并行度)是一个用于控制并行查询执行中最大可用 CPU 核心数的配置参数。通过设置 MAXDOP,你可以管理 SQL Server 在执行并行查询时使用多少个处理器核心&am…...
2453.学习周刊-2024年53周
封面 不要站在问题一边打败孩子,而是站在孩子一边打败问题,多从孩子的角度思考问题,帮助孩子一起解决问题 ✍优秀博文 SQL中历史数据处理实践指南新领导上任了,老员工该如何适应?主动接纳还是我行我素? ✍…...
硬件-射频-PCB-常见天线分类-ESP32实例
文章目录 一:常见天线1.1 PCB天线①蓝牙模块的蛇形走线-天线②倒F天线-IFA:③蛇形倒F天线-MIFA④立体的倒F天线-PIFA 1.2 实例示意图1.21 对数周期天线(LPDA):1.22 2.4GHZ的八木天线:1.23 陶瓷天线:1.24 外接天线: 二&…...
Golang的容器编排实践
Golang的容器编排实践 一、Golang中的容器编排概述 作为一种高效的编程语言,其在容器编排领域也有着广泛的运用。容器编排是指利用自动化工具对容器化的应用进行部署、管理和扩展的过程,典型的容器编排工具包括Docker Swarm、Kubernetes等。在Golang中&a…...
关于大一上的总结
大一上总结 前言 源于学长们都喜欢写总结,今晚也正好听见一首有点触动心灵的歌,深有感慨,故来此写下这篇总结 正文 1.暑假前的准备 暑假之前姑且还是学习了基本的C语法,大概是到了结构体的地方,进度很慢࿰…...
SpringBoot教程(三十二) SpringBoot集成Skywalking链路跟踪
SpringBoot教程(三十二) | SpringBoot集成Skywalking链路跟踪 一、Skywalking是什么?二、Skywalking与JDK版本的对应关系三、Skywalking下载四、Skywalking 数据存储五、Skywalking 的启动六、部署探针 前提: Agents 8.9.0 放入 …...
iOS 11 中的 HEIF 图像格式 - 您需要了解的内容
HEIF,也称为高效图像格式,是iOS 11 之后发布的新图像格式,以能够在不压缩图像质量的情况下以较小尺寸保存照片而闻名。换句话说,HEIF 图像格式可以具有相同或更好的照片质量,同时比 JPEG、PNG、GIF、TIFF 占用更少的设…...
Python爬虫入门(1)
在互联网时代,数据成为了最宝贵的资源之一。Python作为一种功能强大的编程语言,因其简洁的语法和丰富的库支持,成为了编写网络爬虫的首选。本文将带你入门Python爬虫技术,让你能够从互联网上自动获取数据。 什么是爬虫࿱…...
GIT 企业级开发学习 1
本节主要命令: git init ls 不能列出 .git ls -a 列出 .git 1. 初始化 Git 仓库 git init • 初始化一个新的 Git 仓库,在当前目录下生成一个 .git 隐藏文件夹,用于存储版本控制信息。 2. 查看隐藏文件 ls -a • 使用 ls -a 显示隐藏文件…...
C# _ 数字分隔符的使用
总目录 一、数字分隔符是什么? _ 用作数字分隔符。可以将数字分隔符用于所有类型(二进制,十进制,十六进制)的数字文本。数字分隔符 _ 在编译时是被编译器忽略的,因此在语义上对数字结果没有任何影响。 二…...
迟来的前端面试经验
最近也是在换工作,小公司和大厂(虾皮、腾讯)都有面试。几次面试收获还是比较大的,了解许多自己的短板,当然也拿到了合适的offer。本文主要整理下面试遇到的问题和知识点,希望对准备找工作的掘友有所帮助。 …...
深度解析 LDA 与聚类结合的文本主题分析实战
🌟作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~🍊个人主页:小高要坚强的博客🍓当前专栏:《Python之文本分析》🍎本文内容:深度解析 LDA 与聚类结合的文本主题分析实战🌸作者“三要”格言:要坚强、要努力、要学习 目录 引言 技术框架…...
国内Ubuntu环境Docker部署CosyVoice
国内Ubuntu环境Docker部署CosyVoice 本文旨在记录在 国内 CosyVoice项目在 Ubuntu 环境下如何使用 dockermin-conda进行一键部署。 源项目地址: https://github.com/FunAudioLLM/CosyVoice 如果想要使用 dockerpython 进行部署,可以参考我另一篇博客中的…...
Oracle sql developer and Toad for Oracle set start DBMS output
Oracle sql developer Toad for Oracle...
ArcGIS JSAPI 高级教程 - 通过RenderNode实现视频融合效果(不借助三方工具)
ArcGIS JSAPI 高级教程 - 通过RenderNode实现视频融合效果(不借助三方工具) 核心代码完整代码在线示例地球中展示视频可以通过替换纹理的方式实现,但是随着摄像头和无人机的流行,需要视频和场景深度融合,简单的实现方式则不能满足需求。 三维视频融合技术将视频资源与三维…...
关于IDE的相关知识之二【插件推荐】
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于ide插件推荐的相关内容!…...
Spring Boot日志处理
文章目录 Spring Boot日志处理1. 日志存入数据库(AOP)2. 日志控制台打印与写入文件(logback) Spring Boot日志处理 1. 日志存入数据库(AOP) 引入aop依赖 <dependency><groupId>org.springfram…...
node.js之---子线程(child_process)模块
为什么需要子线程(child_process)模块 Worker Threads 的基本概念 如何使用 Worker Threads Worker Threads 的性能 Worker 线程的优势和限制 进阶用法:共享内存 为什么需要子线程(child_process)模块 在 Node.js…...
什么是打流,怎么用iperf3打流
什么是打流 在网络安全和黑灰产领域,“打流”具有不同的含义,常用于形容通过技术手段制造流量假象或发起流量攻击。 流量攻击(DDoS)中的“打流”: “打流”指向目标服务器或网络发起 大规模的数据请求,造…...
Java 可变参数、Collections工具类
一. 可变参数 1. 可变参数:就是一种特殊形参,定义方法、构造器的形参列表里,格式:数据类型...参数名称 2. 特点:可以不传数据;可以穿一个或多个数据;也可以传一个数组 3. 好处:常常用…...
day30-awk进阶
awk模式种类 awk的模式分为这几种 正则表达式 基本正则扩展正则比较表达式范围表达式特殊模式 BEGINEND awk比较运算符(语法) 关系运算符解释示例<小于x<y<小于等于x<y等于xy!不等于x!y>大于等于x>y>大于x>y~匹配正则x~/正则…...
cka考试-03-k8s版本升级
一、原题 二、解答 [root@master ~]# kubectl get node NAME STATUS ROLES AGE VERSION master Ready control-plane,master 25h v1.22.12 node1 Ready worker 25h v1.22.12 node2 Ready worker …...
前后端分离项目部署到云服务器、宝塔(前端vue、后端springboot)详细教程
一、部署介绍 部署的环境是宝塔(宝塔9.0.0)、阿里云服务器(centos 7.6);前端是Vue3项目、后端是springboot3x、jdk11、数据库有redis、mysql;搜索采用的是es。 由于宝塔面板中可以快速进行环境的配置&…...
vue面试题|[2025-1-3]
1.v-if和v-show的区别? 都是可以控制元素的显示和隐藏 1.v-show是控制元素的display值来让元素显示和隐藏;v-if显示(隐藏)时会把整个DOM元素添加(删除) 2.v-show只是简单的css切换;v-if有一个局…...
微信小程序中的 storage(本地存储)和内存是两个完全不同的存储区域
这是一个非常关键且容易混淆的概念 既然 this.globalData.appId appId 是将 appId 存储在内存中,为什么微信小程序中的 wx.getStorage 和 wx.setStorage(本地存储)中没有 appId,并且您提出了一个非常重要的疑问:stor…...
时序优化方法
1.rtl级 1.1避免组合逻辑级数过深 当组合逻辑级数过深时,如果时序允许,可以通过插入时序逻辑来打断组合逻辑链。 1.2寄存器复制 如果是由于fanout过大,可以通过寄存器复制,来减小扇出。 1.3逻辑展平,消除优先级 …...
网络游戏之害
网络游戏之害: 网络游戏于今之世风靡四方,其娱人耳目、畅人心怀之效,固为人知,然所藏之害,若隐伏之暗潮,汹涌而至时,足以覆舟,尤以青年为甚,今且缕析其害,以…...
被催更了,2025元旦源码继续免费送
“时间从来不会停下,它只会匆匆流逝。抓住每一刻,我们才不会辜负自己。” 联系作者免费领💖源💖码。 三联支持:点赞👍收藏⭐️留言📝欢迎留言讨论 更多内容敬请期待。如有需要源码可以联系作者免…...
Springboot - Web
Spring Boot 是一个用于简化 Spring 应用程序配置和部署的框架。它提供了一种快速开发的方式,通过默认配置、自动化配置等特性,使得开发者能够更快捷地构建和部署基于 Spring 的应用。 Spring Boot Web 是 Spring Boot 的一个子模块,它专注于…...
Flutter中的网络请求图片存储为缓存,与定制删除本地缓存
Flutter中的网络请求图片存储为缓存,与定制删除本地缓存 1:封装请求图片函数 2:访问的图片都会转为本地缓存,当相同的请求url,会在本地调用图片 3:本地缓存管理【windows与andriod已经测试】【有页面】【有…...
智汇厦门:苏哒智能携其智能化产品亮相文心中国行现场
2025年1月2日,文心中国行再次踏足美丽的鹭岛厦门。 本次的文心中国行活动不仅有来自政府、高校及企业的精英专家将齐聚一堂,分享AI与大模型的最新研究成果,还正式揭牌百度飞桨(厦门)人工智能产业赋能中心,…...
SQL 分析函数与聚合函数的组合应用
目标:掌握 SQL 中分析函数(窗口函数)与聚合函数的组合使用,通过实际案例实现复杂业务需求,如同比、环比和趋势分析。 1. 分析函数与聚合函数的区别 聚合函数(Aggregate Functions):…...
【Elasticsearch入门到落地】5、安装IK分词器
接上篇《4、Elasticsearch的安装》 上一篇我们进行了Elasticsearch以及Kibana的环境准备及软件安装,本篇我们安装最后一个支持软件IK分词器。 一、IK分词器概念 我们再来回顾一下上一张IK分词器的概念: IK分词器(IK Analyzer)是…...
8、RAG论文笔记(Retrieval-Augmented Generation检索增强生成)
RAG论文笔记 1、 **研究背景与动机**2、方法概述3、RAG 模型架构3.1总体架构3.2 Generator(生成器)3.3 检索器(Retriever)3.4训练(Training)3.5**解码方法**(求近似 )3.6微调的参数 …...
【论文笔记】Contrastive Learning for Sign Language Recognition and Translation
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Contrastive Learning for…...
《C++设计模式》策略模式
文章目录 1、引言1.1 什么是策略模式1.2 策略模式的应用场景1.3 本文结构概览 2、策略模式的基本概念2.1 定义与结构2.2 核心角色解析2.2.1 策略接口(Strategy)2.2.2 具体策略实现(ConcreteStrategy)2.2.3 上下文(Cont…...
细说STM32F407单片机轮询方式CAN通信
目录 一、项目介绍 二、项目配置 1、时钟、DEBUG、USART6、NVIC、GPIO、CodeGenerator 2、CAN1 (1)Bit Timings Parameters组,位时序参数 (2)Basic Parameters组,基本参数 (3)…...
perf:对hutool的BeanUtil工具类做补充
分享一个自定义的BeanUtil,继承的是hutool的工具类,然后自己扩充了几个方法; 1、实现了两个对象覆盖非空属性的功能(经常使用),不需要设置CopyOptions; 2、两个对象,对指定前缀的属…...
【数据结构】栈与队列(FIFO)
在阅读该篇文章之前,可以先了解一下堆栈寄存器和栈帧的运作原理:<【操作系统】堆栈寄存器sp详解以及栈帧>。 栈(FILO) 特性: 栈区的存储遵循着先进后出的原则。 例子: 枪的弹夹,最先装进去的子弹最后射出来,最后装入的子弹…...
02.01、移除重复节点
02.01、[简单] 移除重复节点 1、题目描述 编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。 2、解题思路 为了实现这一目标,我们可以使用一个哈希表(或集合)来记录已经遇到的节点值,逐步遍历链表并删…...
Spring thymeleaf 的快速默认搭建使用
Spring thymeleaf 的快速默认搭建使用 thymeleaf 的搭建Pom 文件 thymeleaf 的使用Controller返回参数String资源文件路径访问端点显示HTML页面 thymeleaf 的搭建 Pom 文件 Pom 文件引入 spring-boot-starter-thymeleaf 依赖 <dependency><groupId>org.springfra…...
unity学习3:如何从github下载开源的unity项目
目录 1 网上别人提供的一些github的unity项目 2 如何下载github上的开源项目呢? 2.1.0 下载工具 2.1.1 下载方法1 2.1.2 下载方法2(适合内部项目) 2.1.3 第1个项目 和第4项目 的比较 第1个项目 第2个项目 第3个项目 2.1.4 下载方法…...
印象笔记07——试一试PDF标注
印象笔记07——试一试PDF标注 [!CAUTION] 根据第六期,我再次查询了资料,印象笔记还是有一些可圈可点的功能的(当然部分有平替),针对会员作用,开发使用场景虽然是逆向的,但我坚信这是一部分人的现…...
Logback的使用
1、基本认识 logback官方文档:http://logback.qos.ch 具体样例:https://www.baeldung.com/logback 从下面依赖关系图可以看见,Springboot的核心启动器spring-boot-stater依赖了spring-boot-starter-looging,而这个就是日志的启动器…...
沙箱模拟支付宝支付3--支付的实现
1 支付流程实现 演示案例 主要参考程序员青戈的视频【支付宝沙箱支付快速集成版】支付宝沙箱支付快速集成版_哔哩哔哩_bilibili 对应的源码在 alipay-demo: 使用支付宝沙箱实现支付功能 - Gitee.com 以下是完整的实现步骤 1.首先导入相关的依赖 <?xml version"1…...