C#文件为null,在创建实例时崩溃。

时间:2015-09-21 13:28:21

标签: c#

这是我的settings.cs类:

    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;
    }

重复你的自我永远不会好。

3 个答案:

答案 0 :(得分:4)

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

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;
        }
}

答案 1 :(得分:2)

除了Steffens的答案之外,还提供了如何解决"这是"为什么要这样做"。

通常,您永远不应创建无法使用的实例。创建一个Setting的实例,该实例需要一个文件不存在的文件,应该ALLWAYS抛出一个exeption。在这样的实例上使用任何方法都没有任何意义,因为所有这些方法都会失败。

因此检查ctor中是否存在该文件(请参阅Steffens回答如何),如果不是则抛出异常。

答案 2 :(得分:1)

使用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");

你明确表示初始化比新的{}

更昂贵