【C#进阶】C#语法中一些常用知识点总结
文章目录
- 1.三目运算符
- 2.循环控制语句 (for while do…while foreach)
- 3.访问修饰符
- 4.静态方法和非静态方法
- 5.数组、字典和其他集合类型
- 1. 数组(Array)
- 2. 列表(List)
- 3. 字典(Dictionary)
- 4. 队列(Queue)
- 5. 栈(Stack)
- 6. 散列集(HashSet)
- 总结一下
- 6. out和ref
- 7.属性和变量
- 8.构造函数
- 9.面向对象(封装、继承、多态)
- 10.接口(Interface)
- 11.抽象类
很久没有用写C#代码了,最近花了点时间重温了一下C#语法的一些知识点,查缺补漏!
1.三目运算符
//三目运算符:?:
//如 a>0?1:2
int a = -1;
// 通过?以及:将表达式分为3部分
var result = a > 0 ? 1 : 2;
// ?号前表示条件,得到一个bool值,如果为真,返回:号前面的结果,否则返回:号后面的结果
Console.WriteLine(result);// 当a>0 返回1
// 当a<0 返回2
// 否则 返回0
代码示例:
a = 1;
result = a > 0 ? 1 : (a < 0 ? 2 : 0);//1
Console.WriteLine(result);
a = -1;
result = a > 0 ? 1 : (a < 0 ? 2 : 0);//2
Console.WriteLine(result);
a = 0;
result = a > 0 ? 1 : (a < 0 ? 2 : 0);//0
Console.WriteLine(result);
2.循环控制语句 (for while do…while foreach)
// 针对数据集合进行遍历
int[] values = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine(values);
for (int i = 0; i < values.Length; i++)
{// i:0 1 2 3 4 5 6 7 8 // 0 2 4 6 8if (i % 2 == 0)Console.WriteLine(values[i]);if (i % 2 > 0) continue;Console.WriteLine(values[i]);// break : 跳转循环,循环终止// continue : 结当次循环(后面的代码不执行了),直接执行下次循环
}int index = 0;
// foreach:遍历每一个元素
foreach (int i in values)
{Console.WriteLine(i);index++;
}// while :首先判断条件,条件满足进入循环。可能一次都执行不了
index = 5;
while (index < 5)
{// 死循环 index < 5一直为TrueConsole.WriteLine("Hello");index++;
}
Console.WriteLine("while结束");// do..while 选择执一遍,再判断条件,条件满足,继续执行,不满足即跳出。至少可以执一次
index = 5;
do
{Console.WriteLine("Hello");index++;
} while (index < 5);
3.访问修饰符
你可以把访问修饰符想象成一个家庭的不同房间和钥匙。public
就像是客厅,任何人都可以进入。private
是你的私人房间,只有你自己可以进入。protected
像是家庭成员共用的房间,只有家庭成员(派生类)可以进入。internal
则是整个家(同一程序集)的公共空间,只要是住在这个家里的人都可以进入。protected internal
和private protected
则是钥匙的组合,给予更多灵活的访问控制。
public
:完全公开的。同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。 某一类型的公共成员的可访问性水平由该类型本身的可访问性级别控制。(访问级别 = 0)private
:只有同一 class 或 struct 中的代码可以访问该类型或成员。(访问级别 = 5)protected
:只有同一 class 或者从该 class 派生的 class 中的代码可以访问该类型或成员。(访问级别 = 4)internal
:同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。(访问级别 = 3)protected internal
:该类型或成员可由对其进行声明的程序集或另一程序集中的派生 class 中的任何代码访问。(访问级别 = 2)private protected
:该类型或成员可以通过从 class 派生的类型访问,这些类型在其包含程序集中进行声明。(访问级别 = 1)
4.静态方法和非静态方法
假设一个类是一个“房子”的蓝图。静态方法就像是这个蓝图上标注的固定信息,比如房屋的总平方尺数——你不需要建造一个实际的房子(实例化一个对象)来获取这个信息。非静态方法则像是房子里的开关或电器,你需要进入一个实际的房子(创建一个对象)来操作它们。
静态方法
: 静态方法属于类本身,而不是类的实例。因此,无需创建类的实例就可以调用静态方法, 使用static
关键字进行定义。
- 访问限制:静态方法不能访问类的非静态成员。
- 状态保持:静态方法不能使用或更改非静态字段,因为它们不依赖于对象状态。
- 扩展性:不能被继承或重写。
- 用途:通常用于实现不依赖于对象状态的功能,例如工具函数。
非静态方法
: 非静态方法属于类的实例。需要先创建类的对象,然后才能调用这些方法。通常不需要特殊关键字,除非用于继承或重写等特殊情况。
- 访问限制:非静态方法可以访问类中的所有成员。
- 状态保持:可以使用或更改对象的状态(字段)。
- 扩展性:可以被继承和重写。
- 用途:通常用于实现依赖于或更改对象状态的功能。
5.数组、字典和其他集合类型
- 数组:就像一列有固定数量的停车位,每个停车位只能停一辆特定类型的车。
- 列表:更像一个动态的停车场,可以根据需要增加或减少停车位。
- 字典:就像一个大楼的邮箱,每个邮箱有唯一的标签和里面的邮件。
- 队列:就像排队等候,先来的先得到服务。
- 栈:就像一叠盘子,最后放上去的盘子会先被取下。
- 散列集:就像一个房间里的人,每个人都是唯一的,但你不能预测他们站在房间里的哪个位置。
1. 数组(Array)
-
定义方式: 使用方括号
[]
。 -
特性: 长度固定,元素类型相同。
-
访问: 使用索引,从
0
开始。 -
示例:
int[] numbers = new int[5] {1, 2, 3, 4, 5};
-
常用操作:
Length
获取长度,SetValue
和GetValue
设置和获取值。
2. 列表(List)
-
定义方式: 使用
List<T>
类。 -
特性: 动态大小,元素类型相同。
-
访问: 使用索引,从
0
开始。 -
示例:
List<int> numbers = new List<int> {1, 2, 3, 4, 5};
-
常用操作:
Add
,Remove
,Count
,Contains
。
3. 字典(Dictionary)
-
定义方式: 使用
Dictionary<TKey, TValue>
类。 -
特性: 键值对存储,键唯一。
-
访问: 使用键。
-
示例:
Dictionary<string, int> age = new Dictionary<string, int> {{"Alice", 30},{"Bob", 40} };
-
常用操作:
Add
,Remove
,ContainsKey
,TryGetValue
。
4. 队列(Queue)
-
定义方式: 使用
Queue<T>
类。 -
特性: 先进先出(FIFO)。
-
访问: 不能使用索引。
-
示例:
Queue<int> numbers = new Queue<int>();
-
常用操作:
Enqueue
,Dequeue
,Peek
,Count
。
5. 栈(Stack)
-
定义方式: 使用
Stack<T>
类。 -
特性: 后进先出(LIFO)。
-
访问: 不能使用索引。
-
示例:
Stack<int> numbers = new Stack<int>();
-
常用操作:
Push
,Pop
,Peek
,Count
。
6. 散列集(HashSet)
-
定义方式: 使用
HashSet<T>
类。 -
特性: 元素唯一,无序。
-
访问: 不能使用索引。
-
示例:
HashSet<int> numbers = new HashSet<int> {1, 2, 3};
-
常用操作:
Add
,Remove
,Contains
,Count
。
总结一下
类型 | 长度是否固定 | 元素是否唯一 | 是否有序 | 可通过索引访问 | 使用场景 |
---|---|---|---|---|---|
数组 | 是 | 否 | 是 | 是 | 固定大小 |
列表 | 否 | 否 | 是 | 是 | 动态内容 |
字典 | 否 | 键是 | 否 | 否(通过键访问) | 配置设置 |
队列 | 否 | 否 | 是(FIFO) | 否 | 打印队列、等待列表 |
栈 | 否 | 否 | 是(LIFO) | 否 | 撤销操作、深度优先搜索 |
散列集 | 否 | 是 | 否 | 否 | 停止词、唯一标识符集 |
6. out和ref
假设你要从一个魔法店里取出一些物品。
- 使用
out
就像是你给店主一个空袋子,店主一定会在里面放一些东西。 - 使用
ref
就像是你给店主一个已经有东西的袋子,店主可以查看里面的东西,也可以添加或更改里面的东西。
out
参数用于从方法返回多个值。使用 out
参数时:
- 在方法内必须为
out
参数赋值。 - 调用方法时,传入的变量不需要预先赋值。
public void GetData(out int x, out string y)
{x = 10;y = "hello";
}// 调用
int a;
string b;
GetData(out a, out b); //此时a=10,b="hello"
ref
参数用于双向传递。即:
- 在方法内可以访问
ref
参数的初始值。 - 在方法内可以更改
ref
参数的值,该更改将反映到外部变量。 - 调用方法时,传入的变量必须预先赋值。
public void ModifyData(ref int x)
{x = x * 2;
}// 调用
int a = 5;
ModifyData(ref a); // a 现在是 10
7.属性和变量
变量
(也称为字段)是类、结构或枚举中定义的成员,用于存储数据。它们可以有访问修饰符(如 public
, private
等)。
public class MyClass
{public int MyField; // 公有字段private string anotherField; // 私有字段
}
属性
提供了一种封装字段的方式,允许你通过 get
和 set
访问器来控制字段的读取和写入。这有助于实现更好的数据封装和验证逻辑。
public class MyClass
{public int MyProperty_0 { get; set; }public int MyProperty_1 { get; }// 只有get没有set,表示这个属性是只读public int MyProperty_2 { get; private set; } //外部不可修改//public int MyProperty_2 { set; }// 不允许只写不读//更灵活的写法private int _myField; // 私有字段public int MyProperty // 公有属性{get { return _myField; }set{if (value >= 0) //进行更多操作_myField = value;}}
}
8.构造函数
构造函数
就像是产品(对象)出厂时的“初始化设置”过程。在这个过程中,工厂(构造函数)会根据需求(参数)来设置产品(对象)的各种特性和功能(字段和属性)。
public class Person
{public string Name { get; set; }public int Age { get; set; }public Person(string name, int age) //构造函数{this.Name = name;this.Age = age;}
}
// 使用
Person person = new Person("Alice", 30);
一个类可以拥有多个构造函数
,这被称为构造函数
的重载
。
public class Person
{public string Name { get; set; }public int Age { get; set; }public string Email { get; set; }// 无参数的构造函数public Person(){Name = "Unknown";Age = 0;Email = "unknown@example.com";}// 接受一个参数的构造函数public Person(string name){Name = name;Age = 0;Email = "unknown@example.com";}// 接受两个参数的构造函数public Person(string name, int age){Name = name;Age = age;Email = "unknown@example.com";}// 接受三个参数的构造函数public Person(string name, int age, string email){Name = name;Age = age;Email = email;}
}// 使用无参数构造函数
Person person1 = new Person();// 使用一个参数的构造函数
Person person2 = new Person("Alice");// 使用两个参数的构造函数
Person person3 = new Person("Bob", 30);// 使用三个参数的构造函数
Person person4 = new Person("Charlie", 40, "charlie@example.com");
9.面向对象(封装、继承、多态)
-
封装(Encapsulation):
-
封装是将数据(字段)和相关操作(方法)封装在一个类中的概念。这可以通过访问修饰符(如
public
、private
、protected
)来实现,以控制数据的访问级别,防止直接访问内部数据。 -
这有点像手机的外壳,你可以使用屏幕、按钮等接口来与手机交互,但不能直接触及手机内部的电路。
-
例子:
public class Person {private string name;private int age;public string GetName(){return name;}public void SetName(string newName){name = newName;}public int GetAge(){return age;}public void SetAge(int newAge){if (newAge >= 0){age = newAge;}} } //name和age字段被封装在Person类中,并通过公有方法GetName()、SetName()、GetAge()和SetAge()来访问和修改它们,防止直接访问字段。
-
-
继承(Inheritance):
- 允许一个类(子类)继承另一个类(父类)的成员(字段和方法),并且可以在子类中添加新成员或重写父类的成员。
- 想象一下家庭中的关系,孩子可以继承父母的一些遗传特征,如眼睛颜色,同时也可以拥有自己独特的特征。
- 例子:
public class Vehicle {public string Make { get; set; }public string Model { get; set; }public void StartEngine(){Console.WriteLine("Engine started.");} }public class Car : Vehicle {public int Year { get; set; }public void Accelerate(){Console.WriteLine("Car is accelerating.");} } //在这个例子中,Car类继承了Vehicle类的Make、Model属性和StartEngine()方法,并且添加了自己的属性Year和方法Accelerate()。
-
多态(Polymorphism):
- 允许不同的对象对相同的方法做出不同的响应。这可以通过方法重写和接口来实现。
- 这就像电器插座适配器,不同的电器可以插入同一个插座,但它们在插座中的表现不同。
- 例子:
public class Animal {public virtual void MakeSound(){Console.WriteLine("Some generic animal sound.");} }public class Dog : Animal {public override void MakeSound(){Console.WriteLine("Woof! Woof!");} }public class Cat : Animal {public override void MakeSound(){Console.WriteLine("Meow!");} } //Animal类有一个虚拟方法MakeSound(),Dog和Cat类分别重写了这个方法,使得它们可以表现出不同的声音。其中还使用virtual 和 override 关键字是一种明确的方式来声明和表达方法的重写关系,有助于代码的可读性和维护性。
10.接口(Interface)
- 定义方式:使用
interface
关键字。 - 成员:只能包含方法、属性、事件和索引器的声明,不能包含实现。
- 访问修饰符:所有成员自动为
public
,不允许添加其他访问修饰符。 - 多继承:一个类可以实现多个接口。
- 实现:实现接口的类必须提供接口中所有成员的实现。
示例:
1.定义接口
//假设正在开发一个绘图程序,需要支持多种图形(如圆形、矩形等)。可以定义一个IDrawable接口:
interface IDrawable
{void Draw();
}
2.实现接口定义类
//定义不同的图形类,如Circle和Rectangle,并实现IDrawable接口:
class Circle : IDrawable
{public void Draw(){Console.WriteLine("Drawing a circle.");}
}class Rectangle : IDrawable
{public void Draw(){Console.WriteLine("Drawing a rectangle.");}
}
3.使用
IDrawable[] drawables = new IDrawable[] { new Circle(), new Rectangle() };
foreach (var drawable in drawables)
{drawable.Draw();
}
//Drawing a circle.
//Drawing a rectangle.
11.抽象类
- 定义方式:使用
abstract
关键字。 - 成员:可以包含字段、方法、属性、事件和索引器。方法可以有或没有实现。
- 访问修饰符:成员可以有不同的访问修饰符(
public
、protected
等)。 - 多继承:一个类只能继承一个抽象类。
- 实现:继承抽象类的子类必须实现所有抽象成员。
示例:
1.定义抽象类
public abstract class Shape
{public abstract void Draw(); // 抽象方法public void Move() // 具体方法{Console.WriteLine("Moving the shape.");}
}
2.继承抽象类
//定义Circle和Rectangle类,并继承Shape:
class Circle : Shape
{public override void Draw(){Console.WriteLine("Drawing a circle.");}
}class Rectangle : Shape
{public override void Draw(){Console.WriteLine("Drawing a rectangle.");}
}
3.使用
Shape[] shapes = new Shape[] { new Circle(), new Rectangle() };
foreach (var shape in shapes)
{shape.Draw();shape.Move();
}
//Drawing a circle.
//Moving the shape.
//Drawing a rectangle.
//Moving the shape.
精彩推荐:
【C#进阶一】C#中的数组(Array)、集合(ArrayList,Queue,Stack, HashList)、List<T>、字典(Dictionary<K,T>)和双向链表LinkedList
【C#进阶八】C#中的序列化与反序列化下(二进制序列化、XML序列化及JSON序列化)
希望有所帮助,同时欢迎关注我,后面将更新更多相关内容!
相关文章:
【C#进阶】C#语法中一些常用知识点总结
文章目录 1.三目运算符2.循环控制语句 (for while do…while foreach)3.访问修饰符4.静态方法和非静态方法5.数组、字典和其他集合类型1. 数组(Array)2. 列表(List)3. 字典(Dictionary)4. 队列(…...

加速开发容错量子计算应用!PsiQuantum官宣将在英国干大事
(图片来源:网络) 在STFC-PsiQuantum的新研发实验室PsiDaresbury正式揭幕时,PsiQuantum宣布,在国家安全战略投资基金(NSSIF)的支持下,已与STFC的Hartree中心合作开展一个为期12个月的…...

使用canvas做了一个最简单的网页版画板,5分钟学会
画板实现的效果:可以切换画笔的粗细,颜色,还可以使用橡皮擦,还可以清除画布,然后将画的内容保存下载成一张图片: 具体用到的canvas功能有:画笔的粗细调整lineWidth,开始一个新的画笔…...

自组织映射Python实现
自组织映射(Self-organizing map)Python实现。仅供学习。 #!/usr/bin/env python3""" Self-organizing map """from math import expimport toolzimport numpy as np import numpy.linalg as LAfrom sklearn.base import…...

如何避免阿里云对象储存OSS被盗刷
网站app图片的云端存储离不开对象存储oss,而最难为的问题就是app做的出名了,少不了同行的攻击,包含ddos,cc攻击以及oss外链被盗刷! 防盗链功能通过设置Referer白名单以及是否允许空Referer,限制仅白名单中的域名可以访…...

产品研发团队协作神器!10款提效工具大盘点!
在如今科技驱动的时代,产品研发团队面临着前所未有的竞争压力和不断变化的市场需求。为了在这个激烈的环境中脱颖而出,团队需要高效协作并充分利用先进的工具来提高生产力和创新能力。 本文将为你盘点产品研发团队协作必备的10个提效工具,这…...

LSTM 与 GRU
RNN无法处理长距离依赖问题,通俗点就是不能处理一些较长的序列数据,那么今天就来介绍一下两个能处理长距离依赖问题地RNN变种结构,LSTM和GRU。 1. LSTM(Long short-term memory) 1.1 LSTM结构 上左图是普通RNN结构图…...
代码评审CheckList
代码评审CheckList Author: histonevonzohomail.com Date: 2023/10/24 此博客为笔者在工作中总结的经验,适用于笔者所在的工作,具体情况还需各位自己分析以下的分类并不规范,有好的建议可以给我Email值此1024祝全世界的开发者:天天…...

[尚硅谷React笔记]——第5章 React 路由
目录: 对SPA应用的理解对路由的理解前端路由原理路由的基本使用路由组件与一般组件NavLink的使用封装NavLink组件Switch的使用解决样式丢失问题路由的模糊匹配与严格匹配Redirect的使用嵌套路由向路由组件传递params参数向路由组件传递search参数.向路由组件传递st…...
如何去掉不够优雅的IF-ELSE
不够优雅的IF-ELSE: 在一个方法中根据两个参数的不同值组合来返回四种可能的类型,你可以使用条件语句,例如 if-else 语句或 switch 语句,来实现这个逻辑。以下是一个示例,假设你有两个参数 param1 和 param2ÿ…...
Python中defaultdict的使用
文章目录 Python 中的 defaultdict 与 dictPython 中的 defaultdict Python 中 defaultdict 的有用函数Python 中的 defaultdict.clear()Python 中的 defaultdict.copy()Python 中的 defaultdict.default_factory()Python 中的 defaultdict.get(key, default value) 今天的文章…...

【ccc3.8】虚拟列表
一个简单的虚拟列表,没有任何其他东西。 原理就是向上滚动时,将下面离开屏幕的那一个item塞到上侧来: 主代码仅有两个:ScrollList对应的滚动容器,ScrollListItem对应单项的预制体 当前支持两种:竖向滚动、…...
【23种设计模式】单一职责原则
个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…...
DNS入门学习:什么是TTL值?如何设置合适的TTL值?
TTL值是域名解析中的一个重要参数,TTL值设置的合理与否对于域名解析的效率和准确性有着非常重要的影响,因此对于网站管理者而言,了解什么是TTL值以及如何设置合理的TTL值对于做好域名解析管理,确保网站的安全稳定运行至关重要。 …...

ilr normalize isometric log-ratio transformation
visium_heart/st_snRNAseq/05_colocalization/create_niches_ct.R at 5b30c7e497e06688a8448afd8d069d2fa70ebcd2 saezlab/visium_heart (github.com) 更多内容,关注微信:生信小博士 The ILR (Isometric Log-Ratio) transformation is used in the anal…...
el表单的简单查询方法
预期效果 实现表单页面根据groupid 、type 、errortype进行数据过滤 实现 第一步,在页面中添加输入或者是下拉框,并且用相应的v-model进行绑定 <div style"display: flex;flex-direction: row;"><el-input style"width: auto…...
【USRP】通信总的分支有哪些
概述 通信是一个广泛的领域,涵盖了许多不同的技术、应用和专业分支。以下是通信领域的一些主要分支: 有线通信:这涉及到利用物理媒介(如电缆、光纤)进行通信。 电信:包括电话、电报和传真服务。宽带&#…...
关于服务器网络代理解决方案(1024)
方法一、nginx代理 配置代理服务器 在能够访问外网的服务器上,安装和配置 Nginx。你可以使用包管理器来安装 Nginx,例如: csharpCopy codesudo apt-get install nginx # 对于基于 Debian/Ubuntu 的系统 sudo yum install nginx # 对于基于 C…...

Linux下 /etc/shadow内容详解
/etc/shadow 文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”。 前面介绍了 /etc/passwd 文件,由于该文件允许所有用户读取,易导致用户密码泄露,因此 Linux 系统将用户的密码信息从 /etc/passwd 文件中…...

Go学习第二章——变量与数据类型
Go变量与数据类型 1 变量1.1 变量概念1.2 变量的使用步骤1.3 变量的注意事项1.4 ""的使用 2 数据类型介绍3 整数类型3.1 有符号整数类型3.2 无符号整数类型3.3 其他整数类型3.4 整型的使用细节 4 小数类型/浮点型4.1 浮点型的分类4.2 简单使用 5 字符类型5.1 字符类型…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...