C# 我应该为缓存数据读取器提供Load()方法吗?

C# 我应该为缓存数据读取器提供Load()方法吗?,c#,C#,我正在创建一个基于缓存的数据读取器,它将解析一个基于文本的文件,并将内容加载到内部数据结构中。加载数据后,可以通过各种方法访问数据。reader类是否应该自动从构造函数中的磁盘加载数据 using(CachedDataReader reader = new CachedDataReader(@"C:\someFile.txt")) // Load data now { string getValue = reader.GetValue(264); } 或者我应该显式地使用Op

我正在创建一个基于缓存的数据读取器,它将解析一个基于文本的文件,并将内容加载到内部数据结构中。加载数据后,可以通过各种方法访问数据。reader类是否应该自动从构造函数中的磁盘加载数据

using(CachedDataReader reader = new CachedDataReader(@"C:\someFile.txt"))  // Load data now
{    
    string getValue = reader.GetValue(264);
}
或者我应该显式地使用Open/Read/Load方法来加载数据吗

using(CachedDataReader reader = new CachedDataReader(@"C:\someFile.txt")) 
{
    reader.Load() // Load data now
    string getValue = reader.GetValue(264);
}
或者,我可以向构造函数添加一个可选的布尔参数来自动加载数据

public CachedDataReader(string filePath, bool autoLoad = true) 
{
     if(autoLoad) 
         Load();     
}
reader类是否应该自动从构造函数中的磁盘加载数据

using(CachedDataReader reader = new CachedDataReader(@"C:\someFile.txt"))  // Load data now
{    
    string getValue = reader.GetValue(264);
}
不符合:

在构造函数中做最少的工作。构造函数除了捕获构造函数参数外,不应该做太多工作。任何其他处理的成本应推迟到需要时

这可能是个坏主意的一个实际原因是,如果在加载数据之前必须设置属性。如果您在构造函数中完成所有的工作,那么实现这一点的唯一方法就是为每个可能的属性组合使用构造函数重载。

从某种意义上说,我的答案是“两者都不是,或者两者都是”

正如D Stanley所写,构造函数不应该做任何实际工作,更不用说磁盘I/O了

Separate
Load
方法可能很有用,人们似乎喜欢两阶段初始化,但这也意味着当您忘记加载数据时,您可以在不正确的半初始化状态下访问对象

考虑在第一次访问数据时延迟加载数据,在您的情况下,使用
GetValue
方法。BCL包含您可以使用的

结果可能如下所示:

class CachedDataReader
{
     private readonly Lazy<YourLoadedData> data;

     public CachedDataReader(string filePath)
     {
         // Prepare loading logic, but don't do anything yet.
         data = new Lazy<YourLoadedData>(() => Load(filePath));
     }

     private YourLoadedData Load(string filePath) { } // Load your data here.

     public string GetValue(int param)
     {
         // Access data.Value here to read cached data.
         // The Load method will be called the first time only,
         // all subsequent calls will use the cached value.
     }
}
class CachedDataReader
{
私有只读惰性数据;
公共CachedDataReader(字符串文件路径)
{
//准备加载逻辑,但不要做任何事情。
data=newlazy(()=>Load(filePath));
}
私有YourLoadedData加载(字符串文件路径){}//在此处加载数据。
公共字符串GetValue(int参数)
{
//访问数据。此处的值用于读取缓存数据。
//仅在第一次调用Load方法时,
//所有后续调用都将使用缓存的值。
}
}

或者,您可以使用单独的
Load
方法,并提供方便的工厂方法来创建实例,设置必要的属性,调用
Load
,然后返回完全初始化的
CachedDataReader

。在这种情况下,实际上不需要在读取之前设置任何属性。