c#文件为空,在创建实例时崩溃

本文关键字:创建 实例 崩溃 文件 | 更新日期: 2023-09-27 18:13:57

这是我的settings.cs class:

    public class Settings
    {
        static FileIniDataParser _parser = new FileIniDataParser();
        IniData _data = _parser.ReadFile("Config.ini");
        public int GetInt(string section, string key)
        {
            string keyValue = _data[section][key];
            int setting = int.Parse(keyValue);
            return setting;
        }
}

如果Config.ini不存在,这将崩溃,因为它试图从一个不存在的文件中读取。但是为了创建文件,我首先需要创建对象的实例。但是当创建实例时,它崩溃了。

我总是可以这样做,使它工作,但如果我这样做,我必须重复我自己当执行GetBool

        public int GetInt(string section, string key)
    {
        FileIniDataParser _parser = new FileIniDataParser();
        IniData _data = _parser.ReadFile("Config.ini");
        string keyValue = _data[section][key];
        int setting = int.Parse(keyValue);
        return setting;
    }

重复自己从来都不是好事

c#文件为空,在创建实例时崩溃

在读取它之前检查文件是否存在,并将所有内容放在Settings类的默认构造函数的_data字段的定义中:

public class Settings
{
        static FileIniDataParser _parser = new FileIniDataParser();
        IniData _data;
        public Settings()
        {
            if (!File.Exists("Config.ini"))
            {
              // create the config file 
            }
            _data = _parser.ReadFile("Config.ini");
        }
        public int GetInt(string section, string key)
        {
            string keyValue = _data[section][key];
            int setting = int.Parse(keyValue);
            return setting;
        }
}

除了斯蒂芬斯的回答提供了"如何解决"之外,这里还有"为什么要这样做"。

一般来说,永远不要创建不能使用的实例。创建一个Setting的实例,明确地需要一个文件,而这个文件不存在,应该总是抛出一个异常。在这样的实例上使用任何方法都是没有意义的,因为它们都将失败。

检查该文件是否存在(参见Steffens关于如何存在的回答),如果不存在则抛出异常。

使用FactoryMethod,在(静态)构造函数中使用IO初始化对象总是一个坏主意。

public class Settings
    {
        private readonly IniData _data;
        private Settings(IniData data){
            _data = data;
        }
        public static Settings InitFrom(string fname){
           var _parser = new FileIniDataParser();
           var data = _parser.ReadFile(fname);
           return new Settings(data);
        }
        public int GetInt(string section, string key)
        {
            string keyValue = _data[section][key];
            int setting = int.Parse(keyValue);
            return setting;
        }
}

现在你可以用一种可控的方式创建设置:

try{
   var settings = Settings.InitFrom("Config.ini");
}
catch(IOException iox){
    //something useful
}
var x = settings.GetInt("section","key");

你清楚地表明初始化的代价比新建{}

要高