这是我的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;
}
重复你的自我永远不会好。
答案 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");
你明确表示初始化比新的{}
更昂贵