当前位置: 首页 > news >正文

C#入门学习记录(三)C#中的隐式和显示转换

C#类型转换:隐式与显式转换的机制与应用

        在C#的强类型体系中,数据类型转换是实现数据交互和算法逻辑的基础操作。当数值类型范围存在包含关系,或对象类型存在继承层次时,系统通过预定义的转换规则实现类型兼容处理。隐式转换(Implicit Conversion)与显式转换(Explicit Conversion)构成了C#类型安全体系的核心机制,二者在编译器行为、数据安全性以及使用场景上存在本质差异。理解其工作原理对避免运行时异常、优化内存使用以及设计健壮的类型系统至关重要。

隐式转换:

        以下是在C#中的一些系统提供的可以直接进行隐式转换的情况:

一、数值类型隐式转换(Numeric Promotions)

        原则是要求数值隐式转换遵循精度不丢失。

// 整型提升
sbyte  a = 100;     short  b = a;    // sbyte → short
short  c = 200;     int    d = c;    // short → int
int    e = 300;     long   f = e;    // int → long// 浮点提升
float  g = 3.14f;   double h = g;    // float → double// 混合提升
decimal i = 123.45m; double j = (double)i; // 需要显式转换(decimal→double无隐式)

转换路径
sbyte → short → int → long → float → double
byte → short → ushort → int → uint → long → ulong → float → double
char → ushort → int → uint → long → ulong → float → double

Tips:大的数据范围装小的数据范围,浮点数装整型。

下面是各个类型的值的范围:

二、可空类型(Nullable)隐式转换

        什么是可空类型(Nullable Types)?

        在C#中,​可空类型允许值类型(如 intdoubleDateTime 等)表示为“有值”或“无值”(即 null)。这是为了解决值类型默认不能为 null 的限制,尤其在处理数据库字段、可选参数或未知数据时非常有用。就把值类型变成了一个引用类型。


为什么需要可空类型?
  1. 表示缺失值
    值类型(如 int)默认必须有值,无法直接表示“无数据”状态。例如,数据库中的某个数字字段可能允许为 NULL,此时需要用可空类型来映射这种场景。

  2. 避免魔数(Magic Numbers)​
    不再需要用特殊值(如 -1 或 int.MinValue)表示“无数据”,代码更清晰。

  3. 与数据库交互
    数据库中的 NULL 字段可以直接映射到C#的可空类型变量。

可空类型的语法:

1.利用结构体进行声明:

Nullable<int> number = null;

2.T? 简写形式

int? number = null;   // 等价于 Nullable<int>
double? price = 9.99;
bool? isActive = true;

可空类型的关键特性:

        1. 判断是否有值:HasValue 属性

这个函数返回的是一个bool值

int? age = 25;
if (age.HasValue)
{Console.WriteLine($"年龄是:{age.Value}"); // 输出:年龄是:25
}
else
{Console.WriteLine("年龄未填写");
}

        2. 安全获取值:GetValueOrDefault()

int? score = null;
int actualScore = score.GetValueOrDefault(); // 无值时返回默认值(0)
Console.WriteLine(actualScore); // 输出:0int safeScore = score.GetValueOrDefault(60); // 指定默认值
Console.WriteLine(safeScore); // 输出:60

        3. 直接取值:Value 属性(需谨慎)

int? count = 10;
int total = count.Value; // 有值时正常获取int? invalid = null;
int error = invalid.Value; // 抛出 InvalidOperationException

可空类型的转换与运算:

在C#的可空类型(Nullable<T>)运算中,​任何涉及 null 的算术操作都会导致结果为 null。这是由可空类型的特殊设计规则决定的,具体原理如下:


关键原因:可空类型的"空值传播"特性

当可空类型(如 int?)参与运算时:

  1. 操作数全为有效值 → 执行常规计算

  2. 任一操作数为 null → ​整个表达式结果自动为 null

1. 与非可空类型的转换

int? a = 10;
int b = 20;int? sum = a + b;    // ✅ 结果为 30(int?)
int? invalid = a + null; // ✅ 结果为 null

2. 合并运算符 ??(提供默认值)

为空的话就返回??右边的值

int? nullableNumber = null;
int actualNumber = nullableNumber ?? 100; // 若为null,返回100

3. 条件访问 ?.

判空处理,如果不为空才会使用这个对象,一般是用于委托,事件

DateTime? birthDate = GetBirthDate();
int? year = birthDate?.Year; // 若birthDate为null,year也为null

好了扯了这么多该回归主线了!

所以int是可以隐式转换为空的,对应其他基础类型也可以这样

int? nullableInt = 42;        // int → int? 隐式
double? nullableDouble = nullableInt; // int? → double?(基础类型支持隐式转换)

三、常量表达式隐式转换

const int max = int.MaxValue;
long bigNumber = max;         // 编译时确定值不会溢出byte magic = 255;            // 字面量255在byte范围内
// byte invalid = 256;       // 编译错误(超出范围)

        这里说明bigNumber可以装下int 类型的常量,还是和前面是一样的,大的数据类型可以直接装小的数据类型。

四、数组协变(Array Covariance)

        数组协变是C#中一种特殊的类型转换机制,允许将派生类的数组隐式转换为基类的数组。但是!请注意,只能将引用类型的数组转换为基类,而不能将值类型的数组转换,而且!不可逆转。其实还有个泛型协变,我们后面再聊。

        核心规则

​1、仅支持引用类型数组

// 值类型数组不支持协变
int[] ints = { 1, 2 };
// object[] objArr = ints; // ❌ 编译错误

2、协变方向不可逆

object[] objs = new object[2];
// string[] strs = objs; // ❌ 编译错误(逆变不允许)

3、 运行时类型不变

        这个是什么意思呢,我认为是只是换了个父类进行存储,但本身自己是什么还是不会改变。就像你是你老汉生的,但是你始终只是你!

Console.WriteLine(objects.GetType()); // 输出:System.String[]
string[] strings = { "a", "b" };
object[] objects = strings;   // string[] → object[] 隐式转换(协变)
// 仅支持引用类型数组

隐式转换示例:

string[] strings = { "a", "b" };
object[] objects = strings;   // string[] → object[] 隐式转换(协变)
// 仅支持引用类型数组

小结:

            //有符号 long->int->short->sbyte //大范围装小范围
            //无符号 ulong->uint->ushort->byte 同上

            //浮点数 decimal double float
            //decimal这个类型 没有办法用隐式转换的形式 去储存 double和float

            //特殊类型 bool char string
            //他们之间不存在隐式转换

            //1.无符号 不能够 装 有符号
            //有符号的变量不能隐式转换为无符号的变量
            //2.有符号的变量不能装范围和自己相等的或者大的变量 只能装比自己小(范围)的变量

            //3.浮点数可以装任意整数 包括decimal
            //double->float->所有整型
            //4.整数不能隐式装载浮点数

            //bool没有办法和其他类型 相互隐式转换

            //char 没有办法隐式存储 其他类型的变量

            // char 类型可以隐式转换成整型和浮点型(ASCII码)

            //string 无法和其它类型相互转换

显示转换:

大体上有三种方式进行转换

一、括号强制转换(显式类型转换)

        适用场景:已知类型兼容的转换
// 1. 数值类型收缩转换
double d = 3.1415;
int i = (int)d; // 结果为3(截断小数)// 2. 引用类型向下转型
object obj = "Hello";
string str = (string)obj;// 3. 可空类型转换
int? nullableInt = 42;
int normalInt = (int)nullableInt;

二、Parse系列方法 将字符串转换为整型

            //作用:把字符串类型 转换为对应的类型
            //语法:变量类型.Parse("字符串")
            //注意:转换的字符串必须是能够转换的

        一、基本数值类型 Parse 方法
1. ​整数类型
string intStr = "123";
int numInt = int.Parse(intStr); // 输出:123string longStr = "9876543210";
long numLong = long.Parse(longStr);
2. ​浮点数类型
string floatStr = "3.14";
float numFloat = float.Parse(floatStr); // 输出:3.14string doubleStr = "2.71828";
double numDouble = double.Parse(doubleStr);
3. ​十进制类型

decimal就是能够存数据存的很准确,28位呢

string decimalStr = "12345.67";
decimal numDecimal = decimal.Parse(decimalStr); // ✅ 精确存储为十进制数
Console.WriteLine(numDecimal); // 输出:12345.67(完全一致)
二、布尔类型 Parse
string trueStr = "True";
bool isTrue = bool.Parse(trueStr); // 输出:Truestring falseStr = "False";
bool isFalse = bool.Parse(falseStr);
三、日期和时间
1. ​DateTime.Parse
string dateStr = "2025-3-01";
DateTime date = DateTime.Parse(dateStr); // 输出:2023/3/1 0:00:00
2. ​DateTimeOffset.Parse
string offsetStr = "2023-10-01T12:00:00+08:00";
DateTimeOffset offset = DateTimeOffset.Parse(offsetStr); // 带时区信息
四、枚举类型 Enum.Parse 
enum Color { Red, Green, Blue }string colorStr = "Green";
Color color = (Color)Enum.Parse(typeof(Color), colorStr); // 输出:Color.Green

这里就比较麻烦,先记住吧

五、特殊类型 Parse 方法

1. ​Guid.Parse

string guidStr = "a0a0a0a0-1234-5678-9012-abcdefabcdef";
Guid guid = Guid.Parse(guidStr); // 转换为全局唯一标识符

2. ​TimeSpan.Parse

string timeSpanStr = "12:34:56";
TimeSpan duration = TimeSpan.Parse(timeSpanStr); // 输出:12小时34分56秒
六、其他 Parse 方法

1. ​IPAddress.Parse

string ipStr = "192.168.1.1";
IPAddress ip = IPAddress.Parse(ipStr); // 转换为IP地址对象

2. ​Version.Parse

string versionStr = "2.3.4.5";
Version ver = Version.Parse(versionStr); // 输出:主版本2,次版本3
七、Parse 方法的重载参数
// 标准格式:Parse(string)
int.Parse("123");// 带格式控制:Parse(string, NumberStyles)
int.Parse("(123)", NumberStyles.AllowParentheses);
关键参数 NumberStyles:
//AllowLeadingWhite:允许前导空格
//AllowTrailingWhite:允许后置空格
//AllowParentheses:允许括号表示负数(如 (123))
//AllowThousands:允许千位分隔符(如 1,234)
//AllowCurrencySymbol:允许货币符号(如 $、¥)// 允许括号表示负数
int negative = int.Parse("(123)", NumberStyles.AllowParentheses); // 输出:-123// 允许千位分隔符
int bigNumber = int.Parse("1,234", NumberStyles.AllowThousands); // 输出:1234// 组合多个格式
decimal money = decimal.Parse("$1,234.56", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowThousands);
// 带格式和文化信息:Parse(string, NumberStyles, IFormatProvider)
double.Parse("$1,234.56", NumberStyles.Currency, CultureInfo.InvariantCulture);
//关键参数 IFormatProvider:
//CultureInfo.InvariantCulture:通用文化规则(常用于数据存储)
//CultureInfo.CurrentCulture:系统当前文化规则
//new CultureInfo("fr-FR"):指定法语文化规则// 解析美元金额(使用通用文化规则)
double usd = double.Parse("$1,234.56", NumberStyles.Currency, CultureInfo.InvariantCulture); // 输出:1234.56// 解析法语格式数字(逗号作小数点)
double frenchNumber = double.Parse("1 234,56", NumberStyles.Number, // 允许千位分隔符和小数点new CultureInfo("fr-FR")); // 输出:1234.56// 解析德语负数(括号和逗号分隔符)
int germanNegative = int.Parse("(1.234)", NumberStyles.AllowParentheses | NumberStyles.AllowThousands,new CultureInfo("de-DE")); // 输出:-1234
八、Parse 方法的异常处理

所有 Parse 方法在转换失败时会抛出以下异常:

        ​FormatException:输入字符串格式无效        

        ​OverflowException:数值超出目标类型范围

优先使用 TryParse 方法避免异常:

if (int.TryParse("abc", out int result)) {// 转换成功
} else {Console.WriteLine("转换失败");
}

  TryParse 方法是一种 ​安全且高效的类型转换机制,用于将字符串或其他数据格式尝试转换为目标类型,同时避免因转换失败而抛出异常。

        核心作用:

  1. 避免异常:不抛出 FormatException 或 OverflowException,提升代码健壮性。
  2. 简化逻辑:通过返回布尔值明确指示转换成功与否。
  3. 性能优化:减少 try-catch 块的开销,适合高频调用场景。
方法签名解析
public static bool TryParse(string s, out int result)
  • 输入参数s 是待转换的字符串。
  • 输出参数result 存储转换成功后的值(需用 out 关键字)。
  • 返回值true 表示转换成功,false 表示失败

注意必须使用out进行处理 parse能用的参数 TryParse都能使用

特性ParseTryParse
异常风险高(转换失败时抛出)无异常(返回布尔值)
性能低(需异常处理开销)高(无异常处理)
适用场景确定输入合法的内部逻辑用户输入、外部数据解析
代码简洁性需 try-catch 包裹直接条件判断
  1. 始终优先使用 TryParse:处理用户输入、文件数据或网络请求等不可信来源。
  2. 明确指定文化规则:避免因系统区域设置不同导致解析错误。
  3. 组合格式控制:通过 NumberStyles 精确匹配输入格式。
  4. 验证结果后再使用:检查返回的布尔值后再操作 out 参数。

几乎所有基础类型都提供 TryParse 方法:

  • int.TryParse
  • double.TryParse
  • DateTime.TryParse
  • bool.TryParse
  • Guid.TryParse
  • Enum.TryParse<T>
九、当然你也可以自己定义相关逻辑,然后使用parse
public struct Temperature {public double Celsius { get; }public static Temperature Parse(string input) {if (input.EndsWith("°C")) {double value = double.Parse(input.Replace("°C", ""));return new Temperature { Celsius = value };}throw new FormatException("无效的温度格式");}
}Temperature temp = Temperature.Parse("25°C"); // 自定义解析逻辑

三、使用Convert法

            // 作用:更准确的将 各个类型之间进行相互转换
            // 语法:Convert.To目标类型(变量或常量)

Convert的作用:

  Convert 类是 System 命名空间下的静态工具类,用于 ​在不同基础类型之间进行安全转换,相比强制转换 ((type)value) 和 Parse 方法,它具备以下优势:

  1. 处理 null 值:将 null 转换为目标类型的默认值。
  2. 支持更多类型转换:如 bool ↔ intDateTime ↔ string 等。
  3. 兼容 DBNull:常用于数据库操作,处理 DBNull.Value
  4. 格式化控制:提供四舍五入、进制转换等功能。

示例:

1. 基本类型转换
// 字符串 → 整数
int num = Convert.ToInt32("123");       // 123// 字符串 → 浮点数
double d = Convert.ToDouble("3.14");    // 3.14// 布尔值 → 整数
int flag = Convert.ToInt32(true);        // 1(false → 0)// 整数 → 布尔值(非零为 true)
bool isTrue = Convert.ToBoolean(1);      // true
2. 处理 null 和 DBNull
// 转换 null 值
int nullToInt = Convert.ToInt32(null);   // 0(不会抛异常)// 处理数据库中的 DBNull
object dbValue = DBNull.Value;
int dbNullResult = Convert.ToInt32(dbValue); // 0(而不是抛异常)
3. 四舍五入与精度控制
// 四舍五入为整数
double pi = 3.14159;
int rounded = Convert.ToInt32(pi);       // 3(直接截断)
rounded = Convert.ToInt32(Math.Round(pi)); // 3(推荐手动四舍五入)// 指定小数位数
decimal money = 123.4567m;
decimal truncated = Math.Round(money, 2); // 123.46
4.进制转换
// 十进制 → 二进制字符串
string binary = Convert.ToString(42, 2); // "101010"// 二进制字符串 → 十进制
int fromBinary = Convert.ToInt32("101010", 2); // 42// 十六进制 → 十进制
int fromHex = Convert.ToInt32("FF", 16);       // 255
5. 日期与时间转换
// 字符串 → DateTime
DateTime dt = Convert.ToDateTime("2023-10-01"); // DateTime → 字符串
string dateStr = dt.ToString("yyyy-MM-dd");   // "2023-10-01"// 时间戳(Unix时间)转换
long timestamp = 1696147200; // 2023-10-01 00:00:00 UTC
DateTime fromTimestamp = DateTimeOffset.FromUnixTimeSeconds(timestamp).UtcDateTime;

四、类型转字符串方法

1. ToString() 基础方法
// 值类型转字符串
int num = 42;
string s1 = num.ToString(); // "42"// 引用类型转字符串
DateTime now = DateTime.Now;
string s2 = now.ToString("yyyy-MM-dd"); // "2023-10-01"
2. 字符串插值
double price = 19.99;
string msg = $"价格:{price:C2}"; // "价格:¥19.99"
3. 格式化方法
// 数值格式化
string hex = 255.ToString("X4");       // "00FF"
string percent = 0.85.ToString("P1"); // "85.0%"// 自定义格式
string custom = 123.456.ToString("#,##0.00"); // "123.46"

总结:

方法优点缺点适用场景
括号强转执行效率高类型不安全易抛异常确定类型兼容的数值转换
Parse精确控制格式必须处理异常严格格式的字符串解析
TryParse安全无异常需要out参数用户输入等不确定数据
Convert统一接口、支持null部分转换有隐式规则数据库交互、通用转换
ToString灵活性高可能返回类型名称(如对象未重写)需要定制格式的输出
字符串插值代码简洁无法处理null快速构建格式化字符串

本文最后需要讲述的是try catch语法

            // 必备部分try {//希望进行异常捕获的代码块 放到 try 中// 若出错 会执行 catch 中的代码 捕获异常}catch {}//可选部分finally {// 最后执行的代码 不管有无出错 都会执行 }

示例:

try {string content = File.ReadAllText("missing.txt");
} 
catch (FileNotFoundException) {Console.WriteLine("文件不存在,请检查路径");
} 
catch (IOException ex) {Console.WriteLine($"读取文件失败: {ex.Message}");
} 
catch (Exception ex) {Console.WriteLine($"未知错误: {ex.GetType().Name}");
}

这个比较消耗性能,注意不要在反复的循环中调用!

try {// 代码
} 
catch (Exception ex) when (ex.Message.Contains("network")) {Console.WriteLine("网络相关错误");
} 
catch (Exception ex) when (ex is SocketException || ex is HttpRequestException) {Console.WriteLine("通信错误");
}

场景推荐方法原因
用户输入验证TryParse避免异常开销,直接返回状态码
文件/网络操作try-catch必须处理不可预测的 I/O 错误
数学运算检查预防性条件检查如 if (divisor != 0) 避免异常

附:异常表格

异常类型(Type)命名空间触发场景示例代码
System.ExceptionSystem所有异常的基类throw new Exception("通用错误");
System.SystemExceptionSystem系统级异常的基类(如 NullReferenceException通常不直接使用,由其子类继承
System.ArgumentExceptionSystem方法接收到无效参数void SetAge(int age) { if (age < 0) throw new ArgumentException("年龄不能为负"); }
ArgumentNullExceptionSystem参数为 nullvoid Print(string text) { if (text == null) throw new ArgumentNullException(nameof(text)); }
ArgumentOutOfRangeExceptionSystem参数超出有效范围List<int> list = new List<int>(); list[0] = 1; // 列表为空,索引越界
FormatExceptionSystem字符串格式不符合目标类型要求int.Parse("12A3"); // 包含非数字字符
OverflowExceptionSystem数值运算或转换导致溢出checked { int max = int.MaxValue; int x = max + 1; }
InvalidCastExceptionSystem无效的类型转换object obj = "hello"; int num = (int)obj;
NullReferenceExceptionSystem访问 null 对象的成员string s = null; int len = s.Length;
IndexOutOfRangeExceptionSystem数组/集合索引越界int[] arr = new int[3]; arr[5] = 10;
DivideByZeroExceptionSystem整数除法中除数为零int x = 5 / 0;
NotImplementedExceptionSystem未实现的方法或功能public override void Execute() { throw new NotImplementedException(); }
NotSupportedExceptionSystem调用不支持的操作ReadOnlyCollection<int>.Add(1); // 只读集合尝试添加元素
InvalidOperationExceptionSystem对象状态不适合执行操作Queue<int> queue = new Queue<int>(); queue.Dequeue(); // 队列为空时出队
KeyNotFoundExceptionSystem.Collections.Generic在字典中访问不存在的键Dictionary<string, int> dict = new Dictionary<string, int>(); int val = dict["missing"];
FileNotFoundExceptionSystem.IO访问不存在的文件File.ReadAllText("missing.txt");
DirectoryNotFoundExceptionSystem.IO访问不存在的目录Directory.GetFiles("C:\\InvalidPath");
IOExceptionSystem.IO广义的 I/O 错误(如文件被占用)File.Move("file.txt", "locked_file.txt"); // 目标文件被其他进程锁定
UnauthorizedAccessExceptionSystem.IO无权限访问文件/目录File.WriteAllText("C:\\System\\file.txt", "test"); // 无管理员权限
SqlExceptionSystem.Data.SqlClientSQL Server 数据库操作错误sqlConnection.Open(); // 数据库连接失败
TimeoutExceptionSystem操作超时HttpClient().GetAsync(url).Wait(TimeSpan.FromSeconds(1));
TaskCanceledExceptionSystem.Threading.Tasks异步任务被取消await Task.Delay(1000, cancellationToken); // 若 cancellationToken 被取消
TypeInitializationExceptionSystem类的静态构造函数抛出异常class MyClass { static MyClass() { throw new Exception(); } } // 首次访问时触发
OutOfMemoryExceptionSystem内存不足(如创建超大数组)byte[] hugeArray = new byte[int.MaxValue];
StackOverflowExceptionSystem无限递归导致堆栈溢出(无法捕获)

相关文章:

C#入门学习记录(三)C#中的隐式和显示转换

C#类型转换&#xff1a;隐式与显式转换的机制与应用 在C#的强类型体系中&#xff0c;数据类型转换是实现数据交互和算法逻辑的基础操作。当数值类型范围存在包含关系&#xff0c;或对象类型存在继承层次时&#xff0c;系统通过预定义的转换规则实现类型兼容处理。隐式转换&…...

【Linux网络-网络层】TCP与IP的关系+IP协议基本概念+网段划分+路由+IP分片与组装

网络层 在复杂的网络环境中确定一个合适的路径 一、TCP与IP的关系 TCP&#xff08;传输控制协议&#xff09;和IP&#xff08;互联网协议&#xff09;是互联网协议栈中的两个核心协议&#xff0c;属于不同的层级&#xff0c;分别在传输层和网络层&#xff0c;共同实现数据的可…...

【第K小数——可持久化权值线段树】

题目 代码 #include <bits/stdc.h> using namespace std;const int N 1e5 10;int a[N], b[N]; int n, m, len; int rt[N], idx; // idx 是点分配器struct node {int l, r;int s; } tr[N * 22];int getw(int x) {return lower_bound(b 1, b len 1, x) - b; }int bui…...

需要使用新应用以打开此ms-gamingoverlay链接怎么解决

要解决Windows系统提示“需要使用新应用以打开此ms-gamingoverlay链接”的问题&#xff0c;通常与系统自带的游戏工具栏&#xff08;Game Bar&#xff09;或Xbox相关应用缺失或配置错误有关。以下是综合多个来源的详细解决方法&#xff1a; 方法1&#xff1a;关闭游戏栏功能 这…...

五子棋小游戏-简单开发版

一、需求分析 开发一个基于 Pygame 库的五子棋小游戏&#xff0c;允许两名玩家在棋盘上轮流落子&#xff0c;当有一方达成五子连珠时游戏结束&#xff0c;显示获胜信息&#xff0c;并提供退出游戏和重新开始游戏的操作选项。 1.棋盘显示 &#xff1a; 显示一个 15x15 的五子棋…...

C语言内存函数讲解

&#xff08;一&#xff09;memcpy函数 这是memcpy函数的说明。它的头文件是string.h。函数原型是 void* memcpy(void* destination, const void* source, size_t num) 第一个参数是一个指向一个字符串的指针&#xff0c;第二个也是一样的。而第三个参数是复制的字节个数。这…...

2018年全国职业院校技能大赛高职组-计算机网络应用竞赛竞赛样题C卷

目录 总体规划 模块二:设备基础信息配置 模块三:网络搭建与网络冗余备份方案部署 模块四:移动互联网搭建与网优 模块五:出口安全防护与远程接入 总体规划 CII教育公司在进行企业大学信息化建设的过程中,为了保证北京校区、广州校区与本部校区的日常OA办公通信等关键业务,…...

《解锁Flutter:跨平台开发的未来之光》:此文为AI自动生成

《解锁Flutter&#xff1a;跨平台开发的未来之光》&#xff1a;此文为AI自动生成 Flutter&#xff1a;崭新时代的跨平台框架 在当今数字化浪潮中&#xff0c;移动应用已成为人们生活中不可或缺的一部分。无论是购物、社交、娱乐还是办公&#xff0c;我们都离不开各种手机应用…...

基于大数据的酒类商品数据可视化分析系统

【大数据】基于大数据的酒类商品数据可视化分析系统 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统充分利用Python与Flask的强大后端处理能力&#xff0c;结合前端Layui框架&#xff0…...

【数学建模】一致矩阵的应用及其在层次分析法(AHP)中的性质

一致矩阵在层次分析法(AHP)中的应用与性质 在层次分析法(AHP)中&#xff0c;一致矩阵是判断矩阵的一种理想状态&#xff0c;它反映了决策者判断的完全合理性和一致性&#xff0c;也就是为了避免决策者认为“A比B重要&#xff0c;B比C重要&#xff0c;但是C又比A重要”的矛盾。…...

【YOLOv8】YOLOv8改进系列(7)----替换主干网络之LSKNet

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;YOLOv8入门改进专栏&#x1f341; &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 【YOLOv8改进系列】&#xff1a; 【YOLOv8】YOLOv8结构解读…...

【MySQL】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法

在DQL的基础查询中&#xff0c;我们已经学过了多表查询的一种&#xff1a;联合查询&#xff08;union&#xff09;。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先&#xff0c;我们想要查询emp表和stu表两个表&#xff0c;按照我们之前的知识栈&#xff0c;我们直接使用…...

练习-平方拆分问题(线性筛法-筛质数)

问题描述 小蓝非常热爱数学&#xff0c;一天老师给小蓝出了一道数学题&#xff0c;想锻炼锻炼小蓝的思维能力。题目是这样的&#xff1a;给定两个数 a 和 b&#xff0c;在 a 到 b&#xff08;包括 a,b&#xff09;之间所有数的平方当中&#xff0c;试问有几个数能够表示为 xy …...

CVE-2018-2628(使用 docker 搭建)

介绍&#xff1a; 是一个影响 Oracle WebLogic Server 的严重漏洞&#xff0c;属于 远程代码执行&#xff08;RCE&#xff09; 漏洞。以下是对该漏洞的详细分析&#xff1a; ● 漏洞类型: 远程代码执行(RCE) ● 影响范围:Oracle WebLogic Server 10.3.6.0, 12.1.3.0, 12.2.1.2…...

【深度学习与大模型基础】第5章-线性相关与生成子空间

线性相关是指一组向量中&#xff0c;至少有一个向量可以表示为其他向量的线性组合。具体来说&#xff0c;对于向量组 v1,v2,…,vn&#xff0c;如果存在不全为零的标量 c1,c2,…,cn使得&#xff1a; c1v1c2v2…cnvn0 则称这些向量线性相关。否则&#xff0c;它们线性无关。 举…...

使用 PaddlePaddle 官方提供的 Docker 镜像

CUDA版本高PaddlePaddle不支持时&#xff0c;可以使用 PaddlePaddle 官方提供的 Docker 镜像 1. 安装 Docker Desktop1.1 下载 Docker Desktop1.2 安装 Docker Desktop1.3 启用 WSL 2 或 Hyper-V1.4 启动 Docker Desktop1.5 Docker不运行解决方法 2. 拉取 PaddlePaddle Docker …...

LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 论文阅读

一、TL&#xff1b;DR 为什么要这么做&#xff1f;预训练模型越来越大&#xff0c;比如GPT-3 175B训练独立变得越来越不可行方法&#xff1a;冻结预训练模型的权重&#xff0c;在Transformer架构的每一层中注入可训练的低秩分解矩阵效果&#xff1a;训练参数量减少10000x&…...

企业的应用系统

一、人力资源系统 负责管理员工信息&#xff0c;处理入职&#xff0c;离职&#xff0c;调岗。 1、一般员工的信息有电子档和纸质档两份。 电子档经常是excel文件。 2、高级的公司会建立一套Web应用系统。 3、实现的功能&#xff1a; 新员工入职登记 (登记信息一般是&#xff1a…...

SpringBoot手动注册定时任务

一、背景 项目存在这样一个场景。程序启动过程中&#xff0c;在Spring的Bean组件注册完毕后&#xff0c;会初始化一些基础数据到数据库中&#xff0c;而项目中有部分定时任务需要依赖这些基础数据才能正常运行。如果直接使用Scheduled注解标注定时任务方法&#xff0c;会导致定…...

通过 Python 爬虫提高股票选股胜率

此贴为Python爬虫技术学习贴 在股票中&#xff0c;即便有了选股规则&#xff0c;从5000多只股票中筛选出符合规则的股票也是十分困难的&#xff0c;于是想通过爬虫来实现自动化的快速选股。全文用GP代替股票 实现方案 1、指定两套规则&#xff0c;第一套弱约束&#xff0c;第…...

InternVL:论文阅读 -- 多模态大模型(视觉语言模型)

更多内容&#xff1a;XiaoJ的知识星球 文章目录 InternVL: 扩展视觉基础模型与通用视觉语言任务对齐1.概述2.InternVL整体架构1&#xff09;大型视觉编码器&#xff1a;InternViT-6B2&#xff09;语言中间件&#xff1a;QLLaMA。3&#xff09;训练策略&#xff08;1&#xff09…...

代码随想录算法训练营第三十五天(20250303) |01背包问题 二维,01背包问题 一维,416. 分割等和子集 -[补卡20250316]

01背包问题 二维 链接 遍历物品没有大小顺序要求重点是模拟&#xff0c;推导出递推公式 #include <iostream> #include <vector>int main(){int m, n;std::cin>>m>>n;std::vector<int> weight(m,0),value(m,0);for(int i{0}; i<m; i){std:…...

RGV调度算法(三)--遗传算法

1、基于时间窗 https://wenku.baidu.com/view/470e9fd8b4360b4c2e3f5727a5e9856a57122693.html?_wkts_1741880736197&bdQuery%E7%8E%AF%E7%A9%BF%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95 2.2019年MathorCup高校数学建模挑战赛B题 2019-mathorcupB题-环形穿梭机调度模型&a…...

并发编程-

一、简述 线程&#xff1a;线程是cpu可执行的最小单位&#xff0c;而进程是操作系统可分配的最小资源单位。一个进程中可以有多个线程。 线程的五个状态&#xff1a; 新建&#xff08;new Thread()&#xff09; 就绪 &#xff08;thread.start()&#xff09; 运行&#xff08…...

Mac中nvm切换node版本失败,关闭终端再次打开还是之前的node

Mac中使用 nvm 管理 node 版本&#xff0c;在使用指令&#xff1a;nvm use XXX 切换版本之后。 关闭终端&#xff0c;再次打开&#xff0c;输入 node -v 还是得到之前的 node 版本。 原因&#xff1a; 在这里这个 default 中有个 node 的版本号&#xff0c;使用 nvm use 时&a…...

C语言(25)

一.数据在内存中的存储 1.整数在内存中的存储 整数在内存中以二进制的形式储存&#xff0c;分别为原码&#xff0c;补码&#xff0c;反码 有符号的整数&#xff0c;在上述三种形式都有符号位和数值位两个部分&#xff0c;符号位为0是正数&#xff0c;1是负数&#xff0c;最高…...

HTML、CSS

什么是HTML、CSS HTML结构标签及特点 CSS引入方式 CSS颜色表示形式&#xff1a; CSS引入方式、颜色表示、颜色属性 CSS选择器 超链接...

c#:主窗体与子控件之间的数据传递:基于事件和委托的实现

1. 概述 在WPF中&#xff0c;主窗体与子控件之间的数据传递通常通过以下两种方式实现&#xff1a; 事件&#xff08;Event&#xff09;&#xff1a;主窗体触发事件&#xff0c;子控件订阅事件并接收数据。 委托&#xff08;Delegate&#xff09;&#xff1a;通过委托将子控件…...

Dynamics 365 启用用户安全角色变更的审核功能

D365自身的审核功能这里就不说了&#xff0c;是一个很古老的功能&#xff0c;用过D365的人应该都知道&#xff0c;今天要说的是用户安全角色变更的审核记录。 很多人用系统的审核功能&#xff0c;更多的是用来追踪用户的登录记录&#xff0c;或者记录的修改记录。 而实际的项目…...

MyBatis注解

MyBatis 的注解&#xff08;Annotations&#xff09;提供了一种简洁的方式来配置 SQL 映射&#xff0c;而无需使用 XML 文件。通过在 Mapper 接口的方法上使用注解&#xff0c;可以直接在 Java 代码中定义 SQL 语句和相关映射。这种方式使得代码更加集中和易于维护&#xff0c;…...

1.Windows+vscode+cline+MCP配置

文章目录 1.简介与资源2.在windows中安装vscode及Cline插件1. 安装vscode2. 安装Cline插件3. 配置大语言模型3. 配置MCP步骤(windows) 1.简介与资源 MCP官方开源仓库 MCP合集网站 参考视频 2.在windows中安装vscode及Cline插件 1. 安装vscode 2. 安装Cline插件 Cline插件…...

94.HarmonyOS NEXT动画系统实现教程:深入理解FuncUtils

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT动画系统实现教程&#xff1a;深入理解FuncUtils 文章目录 HarmonyOS NEXT动画系统实现教程&#xff1a;深入理解FuncUtils1. 动画系…...

Python----数据分析(Pandas一:pandas库介绍,pandas操作文件读取和保存)

一、Pandas库 1.1、概念 Pandas是一个开源的、用于数据处理和分析的Python库&#xff0c;特别适合处理表格类数 据。它建立在NumPy数组之上&#xff0c;提供了高效的数据结构和数据分析工具&#xff0c;使得数据操作变得更加简单、便捷和高效。 Pandas 的目标是成为 Python 数据…...

设计模式之原型模式:原理、实现与应用

引言 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过复制现有对象来创建新对象&#xff0c;而不是通过实例化类。原型模式特别适用于创建成本较高的对象&#xff0c;或者需要动态配置的对象。本文将深入探讨原型模式的原理、实现方…...

平方矩阵问题

Ⅰ 回字形二维数组 #include <iostream> #include <iomanip> using namespace std; int main(){int n;while(cin>>n,n){for(int i0; i<n;i){for(int j0; j<n; j){int upi, downn-i1, leftj, rightn-j1;cout<<min(min(up,down),min(left,right)…...

C语言之链表

文章目录 前言 一、链表基本概念 1、声明节点结构 2、创建节点变量 3、链表所有节点 4、遍历链表 二、add添加 三、insert插入 四、remove删除 五、查找 总结 前言 链表是一种重要的数据结构&#xff0c;用于存储和组织数据。它是由一系列节点组成的数据结构&#x…...

RabbitMQ延迟消息

文章目录 延迟消息死信交换机延迟消息延迟消息应用场景 延迟消息 生产者在发送消息的时候指定一个时间&#xff0c;消费者不会立即收到该消息&#xff0c;而是在指定时间之后才收到消息&#xff0c;这就是延迟消息。 比如说这么一个场景&#xff0c;用户下单后将商品库存进行…...

Unity中WolrdSpace下的UI展示在上层

一、问题描述 Unity 中 Canvas使用World Space布局的UI&#xff0c;想让它不被3d物体遮挡&#xff0c;始终显示在上层。 二、解决方案 使用shader解决 在 UI 的材质中禁用深度测试&#xff08;ZTest&#xff09;&#xff0c;强制 UI 始终渲染在最上层。 Shader "Custo…...

【从零开始学习计算机科学】算法分析(一)算法、渐进分析、递归分析

【从零开始学习计算机科学】算法分析(一)算法、渐进分析、递归分析 算法算法分析正确性算法完成需要的时间使用的存储空间简单性渐进分析递归分析主方法求解递归式递归树求解代入法概率分析和随机算法顺序统计量算法 什么是算法?算法(Algorithm)是指解题方案的准确而完整…...

【菜鸟飞】Conda安装部署与vscode的结合使用

介绍 Conda 是一个跨平台的开源工具&#xff0c;用于管理软件包和环境。最初由 Anaconda 公司开发&#xff0c;它的设计目标是支持数据科学和机器学习领域&#xff0c;但其功能不仅局限于此。 以下是 Conda 的核心特点&#xff1a; 包管理&#xff1a;安装、更新、卸载各种库…...

LeetCode2593 标记所有元素后数组的分数

贪心算法实战&#xff1a;数组标记与分数计算&#xff08;LeetCode 同类题解析&#xff09; 一、问题描述 给定一个正整数数组 nums&#xff0c;按以下规则计算最终分数&#xff1a; 初始分数 score 0每次选择最小且未被标记的元素&#xff08;值相同选下标最小&#xff09…...

【C++多线程】thread

C中的std::thread是C11引入的线程库的一部分&#xff0c;提供了创建和管理线程的能力。它封装了操作系统的线程接口&#xff0c;使得在C中更方便地进行多线程编程。 1. std::thread 的定义 std::thread 类位于<thread>头文件中&#xff0c;定义在std命名空间下&#xff…...

补充二分LIS

B3637 最长上升子序列 题目描述 这是一个简单的动规板子题。 给出一个由 n ( n ≤ 5000 ) n(n\le 5000) n(n≤5000) 个不超过 1 0 6 10^6 106 的正整数组成的序列。请输出这个序列的最长上升子序列的长度。 最长上升子序列是指&#xff0c;从原序列中按顺序取出一些数字排…...

airtest用法

安装python3.7.9 64 python3 -m pip install -U airtest 或者&#xff1a; git clone https://github.com/AirtestProject/Airtest.git pip install -e airtest 下载adb 可以开始无界面的airtest 下载AirtestIDE 安装与启动 - Airtest Project Docs Airtest Project...

30天学习Java第四天——设计模式

设计模式概述 设计模式是一套被广泛接受的、经过试验的、可反复使用的基于面向对象的软件设计经验总结&#xff0c;它是开发人员在软件设计时&#xff0c;对常见问题的解决方案的总结和抽象。 一句话就是&#xff0c;设计模式是针对软件开发中常见问题和模式的通用解决方案。 …...

MongoDB 和 Elasticsearch的区别、优缺点对比,以及选型建议

MongoDB 和 Elasticsearch 在存储和搜索方面各有特点&#xff0c;适用于不同的场景。以下是它们的区别、优缺点对比&#xff0c;以及选型建议。 1. 概述 MongoDB&#xff1a;分布式 NoSQL 文档数据库&#xff0c;基于 BSON&#xff08;类似 JSON&#xff09;的文档存储&#x…...

在Android中,子线程可以更新UI吗

目录 为什么子线程不能直接更新UI&#xff1f; 如何正确在子线程更新UI&#xff1f; 1. 使用runOnUiThread方法 2. 通过Handler发送消息到主线程 3. 使用View.post(Runnable)方法 4. 结合AsyncTask&#xff08;已过时&#xff0c;仅作了解&#xff09; 5. 使用Kotlin协程…...

unittest vs pytest区别

unittest vs pytest 对比 ​unittest 像“手动挡汽车”&#xff1a;操作步骤多&#xff0c;规则严格&#xff0c;适合老司机。​pytest 像“自动挡汽车”&#xff1a;开起来轻松&#xff0c;功能强大&#xff0c;适合新手和高效开发。 区别点​unittest​&#xff08;你学过的&…...

OpenAI与谷歌DeepMind新品同日竞技,谁能引领机器人现实任务新潮流?

2025年3月12日&#xff0c;科技巨头谷歌DeepMind与OpenAI均发布了与机器人执行现实任务相关的新产品&#xff1a;谷歌DeepMind的新AI模型、OpenAI的Agents工具集&#xff0c;二者在技术路径、应用场景、安全机制设计等方面存在明显差异&#xff0c;其发展态势备受行业关注。 …...

JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal

并发编程2 synchronized锁实现**AQS****ReentrantLock实现****JUC 常用类**池的概念 ThreadLocalThreadLocal原理内存泄露强引用:软引用弱引用虚引用ThreadLocal内存泄露 synchronized锁实现 synchronized是一个关键字,实现同步,还需要我们提供一个同步锁对象,记录锁状态,记录…...