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;
}
重复自己从来都不是好事
在读取它之前检查文件是否存在,并将所有内容放在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");
你清楚地表明初始化的代价比新建{}