2010-01-29 4 views
5

Я использую Visual C# .NET и создаю приложение, которое использует winforms. Мне необходимо открыть несколько файлов в виде строк и манипулировать данными в разных местах, не сохраняя информацию обратно в файл. Как мне хранить данные, чтобы я мог использовать их в разных частях моего кода?C# и хранение данных в памяти

+1

Если у вас нет более конкретного вопроса, вы, вероятно, ищете одноэлементный шаблон. –

+0

Определите «различные части моего кода». В разных формах, называемых из разных мест в библиотеке классов,? –

ответ

0

Почему их открывают «как строки»? Строки в .NET неизменяемы, поэтому они могут стать дорогими, если вы вносите много изменений. Нормальный подход будет разобрать/десериализации данных из в объектной модели, и передать эту объектную модель в ваших формах - то есть

MyModel model = MyModel.Load(path); 
MyForm form = new MyForm(); 
form.Model = model; 

или аналогичный. Тогда ваша форма может получить доступ к свойствам модели:

captionTextBox.Text = model.Title; // etc 

или использовать привязку данных, если вы действительно хотите:

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

(что позволит 1-так или 2-полосные связываниям, в зависимости от того, ваша модель также предоставляет уведомления об изменениях)

+0

Марк, мне нравится это предложение, но я обеспокоен тем, что данные не могут быть обоснованно проанализированы в предсказуемых/используемых свойствах. Тем не менее, не будет ли объектная модель требовать от меня использовать строку в качестве свойств, чтобы хранить данные в памяти? – Brandon

+0

Аналогичным образом, есть ли у вас ссылки, которые объясняют реализацию такого рода? Я не программист на C# по профессии, но мне нужно использовать его для этого проекта на рабочем месте. – Brandon

+0

@Brandon Номер 4294967295 может быть сохранен как A) 'string', который использует 10 байтов или B)' UInt32', который использует 4 байта. 4 <10;) – dss539

3

Создайте синглтон, который содержит файловые строки как общедоступные свойства, и сделайте одноэлемент открытым.

http://msdn.microsoft.com/en-us/library/ms998558.aspx

+4

Это будет работать (по крайней мере, до тех пор, пока у вас не будет несколько потоков), но чрезмерное использование синглтонов обычно является признаком проблем дизайна на дороге ... –

+0

Убедитесь, что вы создаете синглтон, а не * S * ingleton. http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/ – dss539

+2

Есть ли причина думать, что синглтоны злоупотребляют? Размышление о том, что может вызвать проблему в приложении, контекст, о котором мы ничего не знаем, кажется довольно показательным. –

0

я бы, вероятно, использовать статический класс, если нет других требований, вы не упоминалась.

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 
    } 
} 
+1

Это будет сложно провести тестирование. Пожалуйста, не делай этого. Подумайте о детях! – dss539

+0

Я не вижу, как вызвать LoadData(), а затем делать утверждения, основанные на свойствах статического класса. Он будет таким же тестируемым, как и любой другой вариант, который не предполагает создания отдельного класса DataModel, который был бы лучшим решением, но не отвечает на вопрос OP, он просто предоставляет другой подход. – Nate

0

Существует несколько подходов, которые вы могли бы предпринять.

Если файлы являются малыми и средними, вы можете загрузить содержимое в StringBuilder или StringWriter и сохранить их в файле Dictionary с индексом по имени файла.

Если файлы большие, вы можете это сделать, но вам может потребоваться сохранить содержимое файла StringWriter во временный файл при работе с ними и перезагрузить его из временного файла.

Если файлы огромны, вы можете читать только части или страницы из файла и управлять ими так же, как небольшие файлы, за исключением того, что на каждом отдельном файле на диске должно быть много, и поэтому вы могут хранить их в List или аналогичных.

Существует также метод «копирование в темп-файл-редактирование, а затем копирование-назад». Простой, легкий и эффективный, даже если он много использует диск.

0

Я не уверен, что я понимаю, что Синглтон дает вам в этой ситуации, кроме того, что вы не имеете нескольких копий строк, висящих вокруг. Он ничего не помогает, чтобы изменить сами строки.

Способ, которым я читаю ваш вопрос, состоит в том, что манипуляция строками в памяти (без записи в файл) имеет решающее значение. На основе этого есть два основных варианта: StringBuilder и MemoryStream.

StringBuilder специально разработан для эффективного использования изменить или добавить к данным, представленным в виде строки. Если файл не слишком велик, чтобы он поместился в память, StringBuilder - лучший выбор.

Вы просто передаете содержимое файла конструктору StringBuilder. Затем используйте такие методы, как Append(), Insert(), Remove(), Replace() или indexer [], чтобы изменить строковые данные по мере необходимости. Stringbuilder гарантирует, что эти операции намного эффективнее, чем выполнение стандартной строки.

Вы также можете загрузить файл в MemoryStream, а затем использовать StringReader (или StringWriter), чтобы получить интерфейс Stream (Read(), Peek(), ReadLine() и т. Д.) Для управления строкой.

Это немного больше работы, чем StringBuilder, но может быть предпочтительнее, если подход стиля Stream лучше подходит для вашего приложения.

Смежные вопросы