Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#并将数据存储在内存中_C#_.net_Winforms_Scope - Fatal编程技术网

C#并将数据存储在内存中

C#并将数据存储在内存中,c#,.net,winforms,scope,C#,.net,Winforms,Scope,我正在使用Visual C#.NET,正在制作一个使用winforms的应用程序。我基本上需要以字符串形式打开多个文件,并在不同的位置操作数据,而无需将信息保存回文件。如何存储这些数据,以便在代码的各个部分使用它?创建一个包含文件字符串作为公共属性的单例,并将该单例公开 我可能会使用静态类,除非您没有提到其他要求 public static class MyFilesAsStrings { public static String FirstFile {get;set;} pu

我正在使用Visual C#.NET,正在制作一个使用winforms的应用程序。我基本上需要以字符串形式打开多个文件,并在不同的位置操作数据,而无需将信息保存回文件。如何存储这些数据,以便在代码的各个部分使用它?

创建一个包含文件字符串作为公共属性的单例,并将该单例公开


我可能会使用静态类,除非您没有提到其他要求

public static class MyFilesAsStrings
{
    public static String FirstFile {get;set;}

    public static LoadData() 
    {
        FirstFile = System.IO.File.ReadAllText(@"C:\Temp\MyFile.dat");
        // and so on
    }
}
为什么要“作为字符串”打开它们?NET中的字符串是不可变的,因此如果您进行大量更改,那么它可能会变得非常昂贵。通常的方法是将数据解析/反序列化到一个对象模型中,并将该对象模型传递到表单中,即

MyModel model = MyModel.Load(path);
MyForm form = new MyForm();
form.Model = model;
或类似的。然后表单可以访问模型的属性:

captionTextBox.Text = model.Title; // etc
如果确实需要,也可以使用数据绑定:

captionTextBox.DataBindings.Add("Text", model, "Title");

(这将启用单向或双向绑定,具体取决于您的模型是否还提供更改通知)

您可以采取多种方法

如果文件大小为中小型,则可以将内容加载到
StringBuilder
StringWriter
中,并将其存储在按文件名索引的
字典中

如果文件很大,你可以做到这一点,但是你可能需要考虑在工作时将 StraseScript < /C>的内容保存到一个临时文件中,并根据需要从临时文件中重新加载。 如果文件很大,您将只从文件中读取部分或页面,并以与小文件相同的方式管理这些部分或页面,不同的是磁盘上每个文件都有许多,因此您可以将它们存储在

列表
或类似文件中


还有“复制到临时文件编辑,然后复制回”的方法。简单、简单、有效,即使它确实大量使用了磁盘。

我不确定我是否理解单例在这种情况下给你带来的好处,除了确保你没有多个字符串副本。它对修改字符串本身没有任何帮助

我理解你的问题的方式是,对内存中字符串的操作(不回写文件)是至关重要的。基于此,有两个主要选项,StringBuilder和MemoryStream

是专门为允许您高效地修改或附加到以字符串表示的数据而设计的。如果文件不太大,无法放入内存,则StringBuilder是最佳选择

只需将文件内容传递给StringBuilder构造函数。然后利用Append()、Insert()、Remove()、Replace()或indexer[]等方法根据需要修改字符串数据。Stringbuilder确保这些操作比在标准字符串上执行相同操作更高效

您还可以将文件加载到中,然后使用(或StringWriter)获取用于操作字符串的流式接口(Read()、Peek()、ReadLine()等)


与StringBuilder相比,它的工作量稍大一些,但如果流式方法更适合您的应用程序,则可能会首选它。

除非您有更具体的问题,否则您可能正在寻找单例模式。定义“我的代码的各个部分”。以不同的形式,从类库中的不同位置调用,它会起作用(至少在有多个线程之前),但单例的过度使用通常是一个设计问题的标志…确保你创建了单例而不是单例。有没有理由认为单例被过度使用?猜测在一个我们对其上下文一无所知的应用程序中可能导致问题的原因似乎有点似是而非。@Russell-简单地说:加载数据a文件不是一个一次只能存在的东西。因此:过度使用。在某个时候,你可以有效地考虑从两个文件中加载两个模型——在并排屏幕上的“前”和“后”。你已经崩溃了。或者你可能想将应用程序重构到web服务器/SaaS(高度线程化)上。每次需要两个位置的信息时,在喊“singleton”之前,请确保你读过“singleton被认为是愚蠢的”,这里:这将很难进行单元测试。请不要这样做。想想孩子们!我不知道怎么做,调用LoadData()然后根据静态类的属性进行断言。它将与任何其他不涉及创建单独数据模型类的选项一样可测试,这将是最好的解决方案,但不会回答OP的问题,它只是提供了一个不同的aproach。Marc,我很喜欢这个建议,但我担心数据无法合理地解析为可预测/可用的属性。然而,对象模型是否仍然要求我使用字符串作为属性,将数据存储在内存中?类似地,您是否有任何链接来解释这种类型的实现?我不是一名C#程序员,但需要将其用于工作中的这个宠物项目。@Brandon数字4294967295可以存储为A)
字符串(使用10个字节)或B)
UInt32(使用4个字节)。4 < 10 ;)@dss539:很好。不幸的是,我几乎只处理无法预测/假设的文本/数字变化。@Brandon祝你好运:(