winforms 在C#中的配置文件中使用const int

q3qa4bjr  于 2023-06-06  发布在  C#
关注(0)|答案(1)|浏览(403)

我正在尝试在应用程序中创建一个变量,以便在App.config文件中进行编辑。但是我得到一个错误说:无法将字符串转换为int。
代码片段:

/* This is in the .cs file */
private readonly System.Timers.Timer statusEventTimer = new();
private const int statusEventTime = ConfigurationManager.AppSettings["statusTime"];

statusEventTimer.Interval = statusEventTime;
statusEventTimer.Elapsed += StatusEventTimerElapsed;
statusEventTimer.Start();

这在App.config文件中

<configuration>
  <appSettings>
    <add key="statusTime" value="3000"/>
  </appSettings>
</configuration>

我尝试使用ToInt32转换statusTime,但没有成功。你猜我能做些什么来让这个工作?

yqkkidmi

yqkkidmi1#

这段代码有两个问题:第一个,正如其他人在评论中提到的,配置文件中的字符串可能根本不能作为int值解析-没有什么可以阻止任何部署您的软件的人使用“Banana”作为statusTime的值。
另一个问题是C#中的常量必须在编译时已知。事实上,编译器在编译c#程序时会将任何出现的常量替换为它的值。
因此,您不能将配置中的值用于常量。
但是,您可以做的是将常量更改为静态只读字段-它几乎具有常量的所有优点,但可以在运行时获取其值,这意味着它也可以用于保存编译时未知的值。
所以,总结一下

private const int statusEventTime = ConfigurationManager.AppSettings["statusTime"];

使用

private static readonly int statusEventTime =  
    int.Parse(ConfigurationManager.AppSettings["statusTime"]);

也就是说,如果您希望在配置中的statusTime的值不能作为int解析时抛出异常。
如果您确实希望有一个默认的、硬编码的值,以便在值配置不正确的情况下使用,请像这样使用int.TryParse

private const int defaultStatusEventTime = 3000; // or any other value, for that matter...
private static readonly int statusEventTime =  
    int.TryParse(ConfigurationManager.AppSettings["statusTime"], out var statusTime) 
        ? statusTime 
        : defaultStatusEventTime;

相关问题