C# 配置文件:app.config 和 web.config

一、引言

在 C# 的应用开发中,配置文件就像是幕后的大管家,默默管理着应用程序的各种设置。今天,我们就来深入探索一下 C# 中极为重要的两个配置文件:app.config 和 web.config。无论是开发 Windows 应用程序,还是构建ASP.NET Web 应用,它们都发挥着关键作用。通过合理运用这两个配置文件,开发者能够轻松调整应用程序的行为,而无需对代码进行繁琐的修改,大大提升了开发效率和应用的灵活性。接下来,就让我们一起揭开它们的神秘面纱吧!

二、初相识:app.config 与 web.config

2.1 两者的定义与用途

app.config 是 Windows 应用程序(如控制台应用程序、Windows Forms 应用程序)的专属配置文件。它如同一个精密的设置箱,将应用程序所需的各种配置信息,如数据库连接字符串、应用程序的默认设置等,以 XML 格式进行存储。这种存储方式使得开发者在后期维护和调整应用程序时,无需重新编译整个项目,只需轻松修改 app.config 文件中的相关配置,就能实现应用程序行为的改变。例如,在一个 Windows Forms 的财务管理应用程序中,通过 app.config 可以方便地配置数据库连接字符串,当数据库服务器地址发生变化时,直接修改配置文件中的地址信息,应用程序就能顺利连接到新的数据库 。

而 web.config 则是ASP.NET Web 应用程序的得力配置助手。它承担着存储 Web 应用程序配置设置的重任,包括但不限于身份验证方式、授权规则、页面编译设置等。以一个在线商城的 Web 应用为例,web.config 可以配置用户的身份验证模式为表单验证,同时指定登录页面的 URL,还能设置页面的编译调试模式,在开发阶段设置为调试模式以便及时发现错误,上线后切换为发布模式提高性能 。

2.2 它们的相同与不同之处

从结构上看,app.config 和 web.config 极为相似,都采用 XML 格式,拥有清晰的层次结构,以作为根节点,内部包含多个子节点用于不同类型配置信息的存储。

在适用场景方面,它们有着明确的分工。app.config 专注于 Windows 应用程序的配置,而 web.config 则全心全意为ASP.NET Web 应用程序服务。例如,一个桌面版的绘图软件使用 app.config 配置画笔颜色、画布尺寸等默认设置;而一个在线绘图的 Web 应用则依靠 web.config 来配置用户的访问权限、页面的布局样式等与 Web 相关的设置 。

部分配置节点在两者中是通用的,像节点,都用于存储简单的键值对配置信息。在一个跨平台的新闻阅读应用中,无论是 Windows 桌面端还是 Web 端,都可以通过节点配置新闻源的 URL。然而,也有一些节点是各自特有的。比如,web.config 中的<system.web>节点,用于全面配置ASP.NET应用程序的各种 Web 相关特性,如身份验证、授权、会话状态等;而 app.config 中则没有这一特定节点,因为 Windows 应用程序不需要处理这些 Web 相关的功能 。

三、创建简单示例深入了解

3.1 基于 C# 控制台应用,创建并配置 app.config

3.1.1 新建控制台应用项目

打开 Visual Studio,在起始页面中点击 “创建新项目”。在弹出的 “创建新项目” 对话框里,左侧筛选器选择 “语言” 为 “C#”,“平台” 选择 “Windows”,“项目类型” 选择 “控制台”。接着,在中间的项目模板列表中,选中 “控制台应用 (.NET Core)” (若使用的是.NET Framework,可选择对应的控制台应用模板),在下方 “名称” 处输入项目名称,比如 “ConsoleAppConfigDemo”,设置好 “位置” 和 “解决方案名称” 后,点击 “创建” 按钮,一个全新的 C# 控制台应用项目便创建完成。

3.1.2 编写核心代码

在项目中找到 “Program.cs” 文件,双击打开。在其中输入如下代码:

using System;
using System.Configuration;namespace ConsoleAppConfigDemo
{class Program{static void Main(string[] args){// 读取配置文件中的值string appName = ConfigurationManager.AppSettings["AppName"];int portNumber = Convert.ToInt32(ConfigurationManager.AppSettings["PortNumber"]);Console.WriteLine("应用程序名称: " + appName);Console.WriteLine("监听端口: " + portNumber);Console.ReadLine();}}
}

上述代码中,通过引入System.Configuration命名空间,利用ConfigurationManager.AppSettings来获取app.config文件中定义的配置值。其中,AppName和PortNumber是我们后续将在app.config文件中配置的键名 。

3.1.3 构建并配置 app.config 文件

在项目的解决方案资源管理器中,右键点击项目名称,选择 “添加” -> “新建项”。在弹出的 “添加新项” 对话框中,选择 “应用程序配置文件”,保持默认名称 “app.config”,点击 “添加” 按钮。此时,项目中便生成了app.config文件。

为app.config文件添加如下内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration><appSettings><!-- 配置应用程序名称 --><add key="AppName" value="我的控制台应用"/><!-- 配置监听端口 --><add key="PortNumber" value="8080"/></appSettings>
</configuration>

在这段配置中,节点用于存储一系列键值对形式的配置信息。标签用于添加具体的配置项,其中key属性指定配置项的键名,value属性指定对应的值。比如这里的AppName键对应的值为 “我的控制台应用”,PortNumber键对应的值为 “8080” 。

3.2 基于ASP.NET Web 应用,创建并配置 web.config

3.2.1 新建 Web 应用项目

打开 Visual Studio,点击 “创建新项目”。在 “创建新项目” 对话框中,左侧筛选器按 “语言” 选择 “C#”,“平台” 选择 “Web”,“项目类型” 选择 “ASP.NET”。中间模板列表里选择 “ASP.NET Web 应用程序 (.NET Core)”(若基于.NET Framework,选择对应的ASP.NET Web 应用程序模板),在下方输入项目名称,如 “WebAppConfigDemo”,设置好存放路径和解决方案名称后,点击 “创建”。在弹出的 “创建ASP.NET Web 应用程序” 对话框中,选择合适的模板,如 “空” 模板,然后点击 “创建”,项目创建完成 。

3.2.2 编写 Web 应用代码

在项目中找到 “Pages” 文件夹(若使用的是传统的ASP.NET Web Forms,找到 “Default.aspx.cs” 文件),在 “Index.cshtml.cs” 文件中添加如下代码:

using System;
using System.Configuration;
using Microsoft.AspNetCore.Mvc.RazorPages;namespace WebAppConfigDemo.Pages
{public class IndexModel : PageModel{public string AppName { get; set; }public int PortNumber { get; set; }public void OnGet(){// 读取配置文件中的值AppName = ConfigurationManager.AppSettings["AppName"];PortNumber = Convert.ToInt32(ConfigurationManager.AppSettings["PortNumber"]);}}
}

在上述代码中,通过ConfigurationManager.AppSettings从web.config文件中读取配置值。AppName和PortNumber属性用于在页面中展示读取到的配置信息。OnGet方法在页面加载时被调用,负责从配置文件中获取数据 。

同时,在 “Index.cshtml” 文件中添加如下代码,用于展示配置信息:

@page
@model WebAppConfigDemo.Pages.IndexModel
@{ViewData["Title"] = "首页";
}
<div><p>应用程序名称: @Model.AppName</p><p>监听端口: @Model.PortNumber</p>
</div>

这段代码通过@Model来访问IndexModel中的属性,将从配置文件中读取到的应用程序名称和监听端口展示在页面上 。

3.2.3 生成并配置 web.config 文件

若项目基于ASP.NET Core,在项目创建完成后,根目录下会自动生成web.config文件(若没有,可手动添加)。若基于传统的ASP.NET Web Forms,同样会自动生成web.config文件。

为web.config文件添加如下内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration><appSettings><!-- 配置应用程序名称 --><add key="AppName" value="我的Web应用"/><!-- 配置监听端口 --><add key="PortNumber" value="8080"/></appSettings><system.web><compilation debug="true" targetFramework="4.8" /><httpRuntime targetFramework="4.8" /></system.web>
</configuration>

在这段配置中,节点的作用与app.config中的类似,用于存储键值对形式的配置信息。<system.web>节点则是ASP.NET应用程序特有的配置节点,其中标签用于配置编译相关的设置,debug="true"表示启用调试模式,在开发过程中便于调试代码;targetFramework指定了应用程序所使用的.NET Framework 版本。标签用于配置ASP.NET应用程序的运行时设置,targetFramework同样指定了.NET Framework 版本 。

四、深入剖析配置文件关键节点

4.1 appSettings 节点

在 C# 的配置文件中,节点就像一个灵活的 “小仓库”,专门用于存储各种简单的配置数据。它以键值对的形式组织信息,使得我们能够轻松地定义和获取应用程序所需的配置项。比如,在一个图片处理应用中,可以在节点中设置默认的图片保存路径。在app.config或web.config文件里添加如下配置:

<appSettings><add key="DefaultImageSavePath" value="C:\Images\Saved\" />
</appSettings>

在代码中,通过以下方式获取该配置值:

using System.Configuration;
string savePath = ConfigurationManager.AppSettings["DefaultImageSavePath"];

这样,在应用程序的不同地方,都能方便地使用这个配置值,当需要修改默认保存路径时,直接在配置文件中更改即可,无需重新编译代码。

4.2 connectionStrings 节点

节点对于需要与数据库交互的应用程序而言,堪称重中之重。它专门用于定义数据库连接字符串,这些连接字符串包含了连接数据库所需的关键信息,如数据库服务器地址、数据库名称、用户名、密码等。以连接 SQL Server 数据库为例,在web.config文件中可以这样配置:

<connectionStrings><add name="MyDbConnection" connectionString="Data Source=YourServerName;Initial Catalog=YourDatabaseName;User ID=YourUsername;Password=YourPassword" providerName="System.Data.SqlClient" />
</connectionStrings>

在上述配置中,name属性为连接字符串指定了一个唯一的名称,方便在代码中引用;connectionString属性详细定义了连接数据库的各项参数;providerName指定了数据库提供程序 。

在代码中,通过如下方式获取并使用该连接字符串:

using System.Configuration;
using System.Data.SqlClient;
string connectionString = ConfigurationManager.ConnectionStrings["MyDbConnection"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{// 执行数据库操作string query = "SELECT * FROM YourTable";SqlCommand command = new SqlCommand(query, connection);connection.Open();// 处理查询结果SqlDataReader reader = command.ExecuteReader();while (reader.Read()){// 读取数据}reader.Close();
}

正确配置节点,能够确保应用程序与数据库之间稳定、准确地连接,为数据的存储和读取提供坚实的基础。

4.3 system.web 节点(针对ASP.NET应用)

<system.web>节点是ASP.NET应用程序配置的核心部分,它涵盖了 Web 应用程序运行的各个关键方面。

在编译设置方面,通过子节点进行配置。例如:

<system.web><compilation debug="true" targetFramework="4.8"><assemblies><add assembly="System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /></assemblies></compilation>
</system.web>

这里debug="true"表示在开发阶段启用调试模式,便于及时发现和解决代码中的问题;targetFramework指定了应用程序所使用的.NET Framework 版本。子节点用于添加应用程序所需的程序集引用 。

在身份验证方面,<system.web>节点也起着关键作用。以表单身份验证为例,配置如下:

<system.web><authentication mode="Forms"><forms loginUrl="~/Account/Login.aspx" timeout="30" /></authentication>
</system.web>

上述配置中,mode="Forms"指定了使用表单身份验证模式,loginUrl指定了登录页面的 URL,timeout设置了用户登录后的超时时间 。

此外,<system.web>节点还可以配置授权规则、会话状态、页面处理等众多与 Web 应用程序运行密切相关的设置,全面掌控着ASP.NET应用程序的行为和性能。

五、熟练掌握配置文件的使用技巧

5.1 读取配置文件中的信息

在 C# 中,读取配置文件中的信息是极为常见的操作。最常用的方式便是借助System.Configuration.ConfigurationManager类。例如,当我们想要读取appSettings节点中的配置值时,假设在app.config或web.config文件中有如下配置:

<appSettings><add key="DatabaseServer" value="YourServerName" /><add key="DatabaseName" value="YourDatabaseName" />
</appSettings>

在代码中,通过以下方式轻松获取:

using System.Configuration;
string server = ConfigurationManager.AppSettings["DatabaseServer"];
string database = ConfigurationManager.AppSettings["DatabaseName"];

对于connectionStrings节点中的数据库连接字符串,若配置如下:

<connectionStrings><add name="MyDbConnection" connectionString="Data Source=YourServerName;Initial Catalog=YourDatabaseName;User ID=YourUsername;Password=YourPassword" providerName="System.Data.SqlClient" />
</connectionStrings>

则在代码中使用如下方式读取:

using System.Configuration;
using System.Data.SqlClient;
string connectionString = ConfigurationManager.ConnectionStrings["MyDbConnection"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{// 执行数据库操作
}

此外,在ASP.NET Core 项目中,还可以通过依赖注入的方式获取配置信息。首先,在Startup.cs文件中配置服务:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;public void ConfigureServices(IServiceCollection services)
{var config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).Build();services.AddSingleton<IConfiguration>(config);
}

然后,在需要使用配置信息的类中,通过构造函数注入IConfiguration:

public class MyService
{private readonly IConfiguration _config;public MyService(IConfiguration config){_config = config;}public void DoSomething(){string value = _config["SomeSetting"];}
}

5.2 更新配置文件(谨慎操作)

在运行时更新配置文件虽然可行,但务必谨慎为之,因为这一操作可能会引发应用程序的不稳定。在传统的 C# 项目中,若要更新app.config或web.config文件,可以使用System.Configuration.ConfigurationManager.OpenExeConfiguration方法。例如,将appSettings节点中的AppName配置值进行更新:

using System.Configuration;
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["AppName"].Value = "新的应用名称";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

上述代码中,首先打开配置文件,接着修改指定配置项的值,随后保存更改,并刷新appSettings节,使修改后的配置能够立即生效。

在ASP.NET Core 项目中,更新配置文件的方式稍有不同。假设配置文件为appsettings.json,要更新其中的配置值,可以通过以下步骤:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
using System.IO;var config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).Build();
var appSettingsSection = config.GetSection("AppSettings");
appSettingsSection["SomeSetting"] = "新的值";
var jsonConfig = JsonConvert.SerializeObject(config.AsEnumerable());
File.WriteAllText("appsettings.json", jsonConfig);

在此过程中,先构建配置对象,获取需要更新的配置节,修改配置值后,将配置对象重新序列化为 JSON 格式,并写回配置文件。不过,在实际应用中,尤其是在生产环境下,这种直接在运行时更新配置文件的操作应经过充分的测试和评估,以避免对应用程序的正常运行造成不良影响。

六、其他进阶配置选项拓展

6.1 自定义配置节

在实际的项目开发中,有时现有的标准配置节点无法满足复杂的业务需求,这时自定义配置节就派上了用场。自定义配置节允许我们根据项目的特定需求,灵活地定义和组织配置信息。

实现自定义配置节主要分为两个关键步骤。首先,需要编写一个配置节处理器类。这个类要继承自ConfigurationSection类,通过它来定义我们所需的配置属性。例如,我们创建一个用于管理系统用户权限配置的类:

using System.Configuration;public class UserPermissionsSection : ConfigurationSection
{[ConfigurationProperty("adminPermissions", IsRequired = true)]public string AdminPermissions{get { return (string)this["adminPermissions"]; }set { this["adminPermissions"] = value; }}[ConfigurationProperty("userPermissions", IsRequired = true)]public string UserPermissions{get { return (string)this["userPermissions"]; }set { this["userPermissions"] = value; }}
}

在上述代码中,UserPermissionsSection类定义了两个属性adminPermissions和userPermissions,用于存储管理员和普通用户的权限信息。ConfigurationProperty特性用于指定属性的相关配置,如是否为必需属性等 。

接着,在app.config或web.config文件中声明这个自定义配置节。在文件的节点内添加如下内容:

<configSections><section name="userPermissions" type="Namespace.UserPermissionsSection, AssemblyName" />
</configSections>

这里的name属性指定了在配置文件中引用该配置节时使用的名称,type属性指定了配置节处理器类的完整命名空间和所在程序集名称。随后,在节点下添加自定义配置节的具体配置:

<userPermissions><adminPermissions>FullAccess</adminPermissions><userPermissions>LimitedAccess</userPermissions>
</userPermissions>

这样,在代码中就可以通过ConfigurationManager.GetSection方法获取自定义配置节的信息,并进行相应的处理。例如:

UserPermissionsSection userPermissions = (UserPermissionsSection)ConfigurationManager.GetSection("userPermissions");
string adminPermissions = userPermissions.AdminPermissions;
string userPermissionsValue = userPermissions.UserPermissions;

6.2 加密配置文件敏感信息

在当今注重数据安全的环境下,配置文件中的敏感信息,如数据库连接字符串、API 密钥等,一旦泄露,可能会给应用程序带来严重的安全风险。因此,对配置文件中的部分或全部内容进行加密就显得尤为重要。

在 C# 中,可以借助aspnet_regiis.exe工具来实现配置文件的加密。以加密web.config文件中的节点为例,在命令提示符中,切换到.NET Framework对应的版本目录(例如C:\Windows[Microsoft.NET](http://Microsoft.NET)\Framework\v4.8.04084),然后执行以下命令:

aspnet_regiis -pe "connectionStrings" -app "/YourApplicationName" -prov "DataProtectionConfigurationProvider"

上述命令中,-pe表示加密操作,"connectionStrings"指定了要加密的节点名称,-app指定了应用程序的虚拟路径,-prov指定了加密提供程序。执行该命令后,web.config文件中的节点内容将被加密,加密后的内容类似如下:

<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider"><EncryptedData><CipherData><CipherValue>...</CipherValue></CipherData></EncryptedData>
</connectionStrings>

当应用程序运行时,.NET 会自动使用指定的加密提供程序对加密内容进行解密,开发人员在代码中无需额外编写解密代码,就可以像往常一样通过ConfigurationManager.ConnectionStrings获取连接字符串 。

如果需要对app.config文件进行加密,由于aspnet_regiis.exe工具主要针对web.config,可以先将app.config重命名为web.config,执行加密操作后再改回原名。同时,在实际应用中,要妥善保管加密密钥,避免密钥泄露导致加密失去意义。例如,可以将密钥存储在安全的服务器配置中,只有授权的系统管理员才能访问。

七、总结回顾

在本次 C# 配置文件的探索之旅中,我们深入了解了 app.config 和 web.config 的诸多奥秘。从它们的基础定义、创建与配置方法,到关键节点的剖析,再到读取、更新以及进阶的自定义配置节和加密敏感信息等操作,每一步都为我们在 C# 应用开发中灵活管理配置提供了有力支持。

这两个配置文件就如同开发中的得力助手,让我们能够轻松应对各种配置需求,无论是简单的应用程序设置,还是复杂的数据库连接、安全配置等。希望大家在今后的 C# 开发项目中,能够熟练运用这些知识,根据项目的实际需求,巧妙地配置 app.config 和 web.config,为打造高效、稳定且安全的应用程序奠定坚实的基础。让我们在代码的世界里,借助配置文件的力量,创造出更加优秀的软件作品 。

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

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

相关文章

深入Node.js集群:原理、优势与搭建实战,如何应对高并发

文章目录 一、Node.js 集群简介二、Node.js 集群原理剖析2.1 主从模型2.2 负载均衡机制2.3 进程间通信&#xff08;IPC&#xff09; 三、Node.js 集群优势详解3.1 性能提升3.2 高可用性3.3 资源利用率优化 四、Node.js 集群搭建实战4.1 准备工作4.2 创建主控制节点4.3 工作节点…

数字普惠金融对新质生产力的影响研究(2015-2023年)

基于2015—2023年中国制造业上市公司数据&#xff0c;探讨了数字普惠金融对制造业企业新质生产力的影响及作用机理。研究发现&#xff0c;数字普惠金融有助于促进制造业企业新质生产力的发展&#xff0c;尤其是在数字普惠金融的使用深度较大的情况下&#xff0c;其对新质生产力…

数据仓库基础常见面试题

1.数据仓库是什么 ‌数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的、集成的、非易失的、随时间变化的数据集合&#xff0c;用于支持企业的管理决策‌。它不同于传统的操作型数据库&#xff0c;后者主要用于处理日常业务交易和实时查询&#xff0c;而数据仓库…

记一次OpenEuler Linux磁盘分区表损坏的数据恢复

问题复现 原本有一台GIS地图服务器存放大量数据&#xff0c;突然有一天磁盘满了&#xff0c;于是运维人员照常进行磁盘扩容。但由于误操作&#xff0c;导致使用fdisk的时候把分区表损坏了&#xff0c;表现如下&#xff1a; 这里可以看到启动时能看到xvda被分为了xvda1和xvda2…

分布式数据存储基础与HDFS操作实践(副本)

以下为作者本人撰写的报告&#xff0c;步骤略有繁琐&#xff0c;不建议作为参考内容&#xff0c;可以适当浏览&#xff0c;进一步理解。 一、实验目的 1、理解分布式文件系统的基本概念和工作原理。 2、掌握Hadoop分布式文件系统&#xff08;HDFS&#xff09;的基本操作。 …

APP推荐:全新TV端来了,8K原画电视版

▌ 软件介绍 B站都不陌生吧&#xff0c;一个能追番、学习、娱乐的多元平台&#xff0c;之前也分享过几款第三方TV端&#xff0c;其中的BV最近更新了全新版本。 使用了全新的UI界面&#xff0c;由之前的顶部菜单栏改成了侧边布局&#xff0c;已解锁限制&…

【数据结构】基础知识

目录 1.1 什么是数据结构 1.2数据 1.3 逻辑结构 1.4 存储结构 1.4.1 顺序存储 1.4.2 链式存储 1.4.3 索引存储 1.4.4 散列存储 1.5 操作 1.1 什么是数据结构 数据的逻辑结构以及存储操作 数据结构没有那么复杂&#xff0c;它就教会你一件事&#xff1a;如何更有效的…

【Rust】变量与可变性

目录 思维导图 1. 变量与可变性 1.1 不可变性 1.2 可变性 2. 常量 2.1 定义与特性 3. 变量遮蔽&#xff08;shadowing) 3.1 影子机制 3.2 遮蔽与可变性的区别 4.示例 4.1 变量和可变性示例 4.2 可变变量示例&#xff1a; 4.3 常量示例&#xff1a; 4.4 遮蔽示例&a…

Mycat读写分离搭建及配置超详细!!!

目录 一、Mycat产生背景二、Mycat介绍三、Mycat安装四、Mycat搭建读写分离1、 搭建MySQL数据库主从复制2、 基于mysql主从复制搭建MyCat读写分离 五、Mycat启动常见错误处理1、Caused by: io.mycat.config.util.ConfigException: SelfCheck### schema TESTDB refered by user u…

【6】Word:海名公司文秘❗

目录 题目 List.docx Word.docx List.docx和Word.docx 题目 List.docx 选中1/4全角空格复制→选中全部文本→开始→替换&#xff1a;粘贴将1/4全角空格 替换成 空格选中全部文本→插入→表格→将文本转化成表格→勾选和布局→自动调整→勾选 选中第一列&#xff0c;单机右键…

【Rust】引用与借用

目录 思维导图 1. 引用与借用的基本概念 1.1. 引用示例 2. 借用的规则 2.1. 可变借用示例 2.2. 借用的限制 3. 引用的生命周期 思维导图 1. 引用与借用的基本概念 引用的定义&#xff1a;引用是一种指向数据的指针&#xff0c;但与裸指针不同&#xff0c;Rust的引用在编…

贪心算法详细讲解(沉淀中)

文章目录 1. 什么是贪心算法&#xff1f;&#xff08;贪婪鼠目寸光&#xff09;经典例题1.1.1 找零问题1.1.2最小路径和1.1.3 背包问题 2.贪心算法的特点2.1 证明例1 3.学习贪心的方向心得体会 1. 什么是贪心算法&#xff1f;&#xff08;贪婪鼠目寸光&#xff09; 贪心策略&a…

【专题】2025年节日营销趋势洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p38813 在当今复杂多变且竞争激烈的消费市场环境下&#xff0c;节日营销已成为企业获取市场份额、提升品牌影响力的关键战略时机。我们深知深入洞察节日营销趋势对于企业决策的重要性。 本报告汇总基于对 2024 年多个关键消费节点及…

51c自动驾驶~合集46

我自己的原文哦~ https://blog.51cto.com/whaosoft/13050104 #世界模型会是L3自动驾驶的唯一解吗 三维空间占有率&#xff08;3D Occupancy&#xff09;预测的目的是预测三维空间中的每个体素是否被占有&#xff0c;如果被占有&#xff0c;则对应的体素将被标记。3D Semant…

Linux-----线程操作(创建)

目录 创建线程 示例&#xff1a; 创建线程 #include <pthread.h>/*** 创建一个新线程* * pthread_t *thread: 指向线程标识符的指针,线程创建成功时,用于存储新创建线程的线程标识符* const pthread_attr_t *attr: pthead_attr_t结构体,这个参数可以用来设置线程的属性…

华三S6520交换机配置console和ssh

目录 一、实验目的 二、实验设备 三、实验拓扑图 四、实验步骤 1、console用户名和密码 2、ssh用户名和密码 3.配置系统时间 一、实验目的 实现对华三 S6520 交换机的 console 本地登录和 ssh 远程登录配置,确保能够通过 console 线在本地进行管理,并使用 SSH 协议进…

Vue3组件设计模式:高可复用性组件开发实战

Vue3组件设计模式:高可复用性组件开发实战 一、前言 在Vue3中&#xff0c;组件设计和开发是非常重要的&#xff0c;它直接影响到应用的可维护性和可复用性。本文将介绍如何利用Vue3组件设计模式来开发高可复用性的组件&#xff0c;让你的组件更加灵活和易于维护。 二、单一职责…

1月13日学习

[HITCON 2017]SSRFme 直接给了源代码&#xff0c;题目名称还是ssrf&#xff0c;那么该题大概率就是SSRF的漏洞&#xff0c;进行代码审计。 <?php// 检查是否存在 HTTP_X_FORWARDED_FOR 头&#xff0c;如果存在&#xff0c;则将其拆分为数组&#xff0c;并将第一个 IP 地址…

linux RT-Preempt spin lock实现

一、spin_lock概述 Spinlock是linux内核中常用的一种互斥锁机制&#xff0c;和mutex不同&#xff0c;当无法持锁进入临界区的时候&#xff0c;当前执行线索不会阻塞&#xff0c;而是不断的自旋等待该锁释放。正因为如此&#xff0c;自旋锁也是可以用在中断上下文的。也正是因为…

设计模式-工厂模式/抽象工厂模式

工厂模式 定义 定义一个创建对象的接口&#xff0c;让子类决定实列化哪一个类&#xff0c;工厂模式使一个类的实例化延迟到其子类&#xff1b; 工厂方法模式是简单工厂模式的延伸。在工厂方法模式中&#xff0c;核心工厂类不在负责产品的创建&#xff0c;而是将具体的创建工作…