Dobrý den,
chci se jen zeptat, zda v tomto případě dodržovat OOP, či zda mám chybu v návrhu OOP/... Zkrátka mám strukturu, kterážto ve statické funkci Load do nově alokovaného 2D bytového pole vylije bytový soubor.
using System.Windows.Forms;
using System.IO;
namespace Cixu
{
public struct Map
{
const string filter = "MAP files (*.map)|*.map";
static readonly OpenFileDialog openDialog = new OpenFileDialog()
{
Filter = filter,
DefaultExt = "map",
AddExtension = true,
CheckPathExists = true
};
static readonly SaveFileDialog saveDialog = new SaveFileDialog()
{
Filter = filter,
DefaultExt = "map",
AddExtension = true,
CheckPathExists = true
};
public sbyte Direction { get; set; }
public byte[,] Content { get; set; }
public int ActiveX { get; set; }
public int ActiveY { get; set; }
public static Map Load(int width, int height)
{
if (openDialog.ShowDialog() == DialogResult.OK)
{
if (new FileInfo(openDialog.FileName).Length == 1601)
return Load(openDialog.FileName, width, height);
else
throw new FileLoadException("Incorrect map file size!");
}
else
throw new System.Exception("Open file dialog aborted!");
}
public static Map Load(string fileName, int width, int height)
{
Map output = new Map();
using (BinaryReader bw = new BinaryReader(new FileStream(fileName, FileMode.Open)))
{
output.Content = new byte[width, height];
output.Direction = (sbyte)bw.ReadByte();
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
{
byte value = bw.ReadByte();
output.Content[x, y] = value;
if ((value & 240) == 16)
{
output.ActiveX = x;
output.ActiveY = y;
}
}
return output;
}
}
public static void Save(int width, int height, byte[,] map, sbyte direction)
{
if (saveDialog.ShowDialog() == DialogResult.OK)
Save(saveDialog.FileName, width, height, map, direction);
}
public static void Save(string fileName, int width, int height, byte[,] map, sbyte direction)
{
using (BinaryWriter bw = new BinaryWriter(new FileStream(fileName, FileMode.Create)))
{
bw.Write((byte)direction);
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
bw.Write(map[x, y]);
}
}
}
}
Zde tedy dochází k neustálé alokaci místa v RAM. Přitom kdybych to vyléval rovnou do cílové proměnné, alokace by proběhla jednou jedinkrát. Obdobný probém mám i na jiných místech programu. Řeším to, poněvadž se nyní data k načtení budou kupit - přidávám další pomocné bitové mapy. (asi to nakonec sloučím do jednoho formátu) A tak si říkám - co třeba hodit referenci?
Děkuji.