C#中解决字符串在编译后无法修改的情况

文章目录

  • 一、配置文件
  • 二、使用方式
      • 对于.NET Framework应用程序(使用app.config)
      • 对于.NET Core和.NET 5/6应用程序(使用appsettings.json)
  • 三、应用实例

一、配置文件

在C#等编程语言中,硬编码(直接在代码中写入)的字符串和其他配置信息在编译后就无法修改了,因为它们成为了程序的一部分。这在很多情况下是不方便的,尤其是当我们需要根据不同的部署环境(如开发、测试、生产)来改变这些值时。

配置文件允许开发者在不重新编译应用程序的情况下更改这些值。例如,数据库连接字符串、API密钥、服务端点地址等,都可以存储在配置文件中。当应用程序启动时,它会读取这些配置文件,并获取所需的配置信息。这样,如果需要更改配置,只需更改配置文件中的相应字符串,而无需更改代码并重新编译应用程序。

这种方法提高了应用程序的灵活性和可维护性,并且对于管理敏感信息也更加安全,因为我们可以避免在源代码中直接暴露这些信息。此外,配置文件还支持为不同的环境设置不同的配置,这在现代软件开发中是一个非常常见的需求。

常见的配置文件类型包括:

  1. app.configweb.config:这两种类型的配置文件通常用于.NET框架应用程序。app.config 用于Windows应用程序(如Windows窗体应用、控制台应用),而web.config 用于ASP.NET基于Web的应用程序。它们都是XML格式的文件,可以包含数据库连接字符串、应用程序设置、日志配置等。

  2. .json 配置文件:在.NET Core 和 .NET 5/6 应用程序中,配置信息通常存储在JSON格式的文件中,例如appsettings.json。与XML格式的配置文件相比,JSON文件通常更加简洁易读。appsettings.json文件可以包含环境特定的设置,例如开发环境和生产环境可能使用不同的数据库连接字符串。

使用配置文件的好处包括:

  • 灵活性:应用程序的配置可以在不重新编译代码的情况下进行更改,这对于调整设置和修正问题非常有用。
  • 环境适应性:可以为不同的运行环境(如开发环境、测试环境、生产环境)创建不同的配置文件,从而使同一份代码基础能够适用于多个环境。
  • 安全性:敏感信息,如数据库的连接字符串,可以从代码中分离出来,通过使用加密或其他安全机制来保护配置文件,提升应用程序的安全性。
  • 易于维护:由于配置信息集中存储,应用程序的配置和管理相对而言更加集中和简单。

在C#程序中,可以使用.NET框架或.NET Core提供的API来读取和管理这些配置文件中的设置,使得开发者能够以编程方式访问并利用这些配置信息。

二、使用方式

在Windows应用程序中使用配置文件,通常指的是使用app.config文件(对于.NET Framework应用程序)或appsettings.json文件(对于.NET Core和.NET 5/6应用程序)。以下分别说明这两种情况下如何使用配置文件:

对于.NET Framework应用程序(使用app.config)

  1. 创建或编辑app.config文件

    在Visual Studio中的项目中,添加一个名为app.config的配置文件(如果尚未存在)。这个文件在编译时会被自动重命名为[应用程序名称].exe.config

  2. 编辑app.config文件

    app.config文件是一个XML文件,你可以在其中添加自定义的配置节或使用预定义的配置节,比如connectionStringsappSettings部分。例如:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="Setting1" value="This is a setting"/>
      </appSettings>
      <connectionStrings>
        <add name="DatabaseConnectionString" connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"/>
      </connectionStrings>
    </configuration>
    
  3. 在代码中读取配置

    使用System.Configuration命名空间下的ConfigurationManager类来读取配置信息。首先,确保项目引用了System.Configuration程序集。

    读取appSettings部分的设置:

    string setting1 = ConfigurationManager.AppSettings["Setting1"];
    

    读取数据库连接字符串:

    string connectionString = ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString;
    

对于.NET Core和.NET 5/6应用程序(使用appsettings.json)

  1. 创建或编辑appsettings.json文件

    在项目中添加一个名为appsettings.json的JSON格式的配置文件(如果尚未存在)。你也可以为不同的环境创建特定的配置文件,如appsettings.Development.json

  2. 编辑appsettings.json文件

    appsettings.json文件中,我们可以自由定义JSON结构来保存配置信息。例如:

    {
      "AppSettings": {
        "Setting1": "This is a setting"
      },
      "ConnectionStrings": {
        "DatabaseConnectionString": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"
      }
    }
    
  3. 在代码中读取配置

    在.NET Core和.NET 5/6中,通常使用依赖注入来获取配置。首先,确保Microsoft.Extensions.Configuration包已经安装和配置。

    示例代码段(在Startup.cs或相应的初始化代码中):

    public IConfiguration Configuration { get; }
    
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    

    然后,在应用程序的任何部分,你可以通过IConfiguration接口读取配置信息:

    var setting1 = Configuration["AppSettings:Setting1"];
    var connectionString = Configuration.GetConnectionString("DatabaseConnectionString");
    

以上就是在.NET Framework和.NET Core/.NET 5/6 Windows应用程序中使用配置文件的基本方法。

三、应用实例

比如我们要用配置文件存储连接数据库的信息,如下:

 private static string connString =
            "Server=DESKTOP-1JMUPMG\\MSSQLSERVER1;DataBase=StudentManageDB;Uid=sa;Pwd=151423qwe,+";

这是我们连接数据库的信息,注意这里面的数据库用户名是DESKTOP-1JMUPMG\MSSQLSERVER1,可以发现里面少了一个斜杠,这是因为在编译的时候一个“\”,需要用“\”才能表示,要记住这个细节。
接下来我们配置App.config文件,首先注意第一点,这个文件一定要添加在我们的根目录中,也就是我们的最开始的项目,最主要的那个项目。右击这个项目,添加新建项,选择如下,注意一定不要改名字:
在这里插入图片描述
接下来我们看到:
在这里插入图片描述
需要在其中添加:
在这里插入图片描述
具体内容:

<connectionStrings>
    <add name="connString" connectionString =
 "Server=DESKTOP-1JMUPMG\MSSQLSERVER1;DataBase=StudentManageDB;Uid=sa;Pwd=151423qwe,+"/>
    </connectionStrings>

注意和前面的信息做一下对比。这里不用担心“\”的问题,也就不用多加一个斜杠符号了。
接下来我们需要在使用到这段信息的项目中添加一个System.Configuration的引用,并在最上方写好:

using System.Configuration; //引入读取配置文件的命名空间

然后我们只需要写下面这样的代码:

 public  static string connString = ConfigurationManager.ConnectionStrings[""].ToString(); 

运行后就得到了一个这样的文件:
在这里插入图片描述
用记事本打开就可以看到:
在这里插入图片描述
如果要修改信息,直接在这里面修改就好了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript parseInt() 函数

JavaScript parseInt() 函数 从官方理解&#xff1a; parseInt() 函数解析字符串并返回整数。 radix 参数用于指定使用哪种数字系统&#xff0c;例如基数为 16&#xff08;十六进制&#xff09;表示字符串中的数字应从十六进制数解析为十进制数。 如果 radix 参数被省略&…

前缀列表和route-policy

前缀列表和route-policy ACL&#xff1a;访问控制列表 1、它可以用于过滤流量报文 2、又可以过滤路由条目 前缀列表&#xff1a; 1、只能过滤路由条目 2、不能过滤流量报文 ACL&#xff1a;在过滤路由条目时&#xff0c;只能过滤路由前缀。 前缀列表&#xff1a;在过滤…

QT作业day2

自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面。&#xff08;不要使用课堂上的图片和代码&#xff0c;自己发挥&#xff0c;有利于后面项目的完成&#xff09; 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&#xff0c;通…

MySQL的基本操作

目录 引言 一、SQL语句简介 &#xff08;一&#xff09;SQL通用语法 &#xff08;二&#xff09;SQL分类 &#xff08;三&#xff09;数据类型 1.数值类型 2.字符串类型 3.日期/时间类型 4.修饰符 二、登录mysql服务 三、SQL语句操作 &#xff08;一&#xff09;DD…

hexo怎么修改默认主题?

npm install 主题 修改_config.yml文件的theme 复制一份_config.yml 改名为_config.主题.yml hexo clean hexo g hexo s就这么简单 选主题 https://hexo.io/themes/ 比如 fluid npm install --save hexo-theme-fluid修改主题 配置新主题 执行新主题 hexo clean hexo g hexo…

python爬虫之xpath+多进程爬取百度贴吧实战

文章目录 抓取百度贴吧的某一个帖子的评论内容前言先查看贴吧的robots.txt页面结构分析评论者头像&#xff0c;用户抓取评论内容的抓取评论下回复内容的抓取 源码实现贴吧抓取过程源码实现多进程的实现 抓取百度贴吧的某一个帖子的评论内容 前言 本项目实战是用来学习用&#…

网络: 数据链路层

数据链路层: 数据帧的封装与传输 以太网数据帧 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;帧协议类型字段有三种值,分别对应IP、ARP、RARP;帧末尾是CRC校验码 以太网 "以太网" 不是一种具体的网络, 而是一种技术标准; 既…

CCLinkie转Modbus RTU在纺纱设备领域应用

在纺纱设备领域&#xff0c;CCLinkie转Modbus RTU网关可以发挥重要作用。这种网关的主要功能是将CC-Link IE Field总线协议转换为Modbus RTU协议。这种转换在许多自动化设备中都很有用&#xff0c;特别是那些已经使用Modbus RTU协议的系统。 以下是CCLinkie转Modbus RTU网关在纺…

【项目管理后台】Vue3+Ts+Sass实战框架搭建二

Vue3TsSass搭建 git cz的配置mock 数据配置viteMockServe 建立mock/user.ts文件夹测试一下mock是否配置成功 axios二次封装解决env报错问题&#xff0c;ImportMeta”上不存在属性“env” 统一管理相关接口新建api/index.js 路由的配置建立router/index.ts将路由进行集中封装&am…

用户分享 | 飞凌嵌入式i.MX9352开发板外设功能测试

本篇试用报告由发烧友 jinyi7016 提供&#xff0c;感谢jinyi7016的支持。 1、网络测试 飞凌嵌入式OK-MX9352-C开发板有两个千兆网口&#xff0c;其中eth0是静态IP&#xff0c;地址为192.168.0.232&#xff0c;这个地址比较大&#xff0c;也是为了避免与局域网内的其他设备冲突…

蓝桥杯单片机备战——关于573问题的填坑

一、遇到的问题 还记得我前面在封装继电器外设的时候遇到的这个问题嘛&#xff0c;当时我怀疑的是138译码器在切换通道的时候会出现其他暂态导致已经锁定的573解锁。 其实不然&#xff0c;之所以会这样还是因为代码问题&#xff0c;也可以说是573反应时间太快了。下面我就分析…

unity学习(63)——预制体

1.运行发现预制体初始化的时候存在问题 这里有许多技巧&#xff0c;需要细看。 2.预制体在MapHandler.cs的定义如下 3.把MapHandler绑到相机上&#xff0c;在相机的属性栏中找到赋值部分。 4.size设置成2&#xff0c;然后把模型拖拽到1号索引位置上 5.运行之后预制体确实成功实…

Java类的多态作用及解析

多态是面向对象编程中一个重要的特性。简单来说&#xff0c;多态就是指同一个方法在不同的对象上有不同的实现。通过多态&#xff0c;我们可以在运行时根据对象的实际类型来动态地调用相应的方法&#xff0c;从而提高代码的灵活性和可扩展性。 以下是 Java 类中多态的一些作用…

leetcode 3075

leetcode 3075 题目 例子 思路 孩子的幸福值最低也是0&#xff0c;所以选择最大的值&#xff0c;被选孩子的幸福值最高。需要使用排序算法 代码实现 class Solution { public:long long maximumHappinessSum(vector<int>& happiness, int k) {//升序sort(happine…

python之实验二颜色空间转换与分割

1&#xff0e;编写python代码&#xff0c;使用skimag拆分并显示图像RGB空间的三个通道 (我直接用的包中自带的图像) from skimage import data from matplotlib import pyplot as plt import numpy as npif __name__ "__main__":# 载入RGB测试图像image data.astro…

OKR与敏捷开发、精益创业等方法如何协同工作?

在快速变化的市场环境中&#xff0c;企业需要更加灵活和高效地应对各种挑战。目标与关键成果法&#xff08;OKR&#xff09;、敏捷开发以及精益创业等方法&#xff0c;作为现代企业管理的重要工具&#xff0c;各自在推动企业发展、提高团队效率、优化产品迭代等方面发挥着不可或…

使用appuploder上架App Store流程

使用appuploder流程笔记 1.如何没有账号去apple官网注册一个&#xff0c;地址&#xff1a;https://developer.apple.com/account 2.下载解压appuploder&#xff0c;双击打开&#xff0c;用刚刚注册的账号登录&#xff0c;下载地址&#xff1a;http://www.applicationloader.n…

逻辑手册器件解读,需要注意的参数

逻辑器件手册解读 可以实现的功能 上图第一个芯片实现的功能是逻辑电平的转换&#xff0c;1.8V的逻辑电平经过逻辑器件之后转换为3.3V&#xff0c;可以看出逻辑器件的输出最高电平是跟随供电电压的。 第二个芯片实现的是"与的逻辑",两个不同的高电平信号经过逻辑器件…

inputStream.avaliable()方法网络操作读取不全BUG

一、问题描述 公司有个需求&#xff0c;就是调用方&#xff08;我&#xff09;需要把pdf文件转为Base64字符串作为参数传递为被调用方&#xff0c;以下是大致转换过程&#xff1a; URL url new URL("http://xxxx.pdf");HttpURLConnection uc (HttpURLConnection) …

抓住眼前的机会:自我决策与成长的探索

在人生的旅途中&#xff0c;我们常常会遇到各种各样的机会。它们如同璀璨的星辰&#xff0c;在夜空中闪烁着诱人的光芒。然而&#xff0c;机会并非总是会自动降临在我们头上&#xff0c;更多的时候&#xff0c;它们需要我们去主动寻找、去勇敢抓住。那么&#xff0c;当机会摆在…