Можно ли улучшить данный класс

199
26 мая 2018, 03:50

Имеется сей класс, для копирования UTF8 массива символов в неуправляемую память подобно char**, все ли в нем нормально, и можно ли его улучшить?

public class IntPtrUtf8ArrayStr : IDisposable
{
    private bool isDispoed;
    public IntPtrUtf8ArrayStr(params string[] value)
    {
        int summarySize = 0;
        Length = value.Length;
        byte[][] tmpBytes = new byte[Length][];
        for (int i = 0; i < Length; i++)
        {
            int countBytes = Encoding.UTF8.GetByteCount(value[i]) + 1;
            summarySize += countBytes;
            tmpBytes[i] = new byte[countBytes];
            Array.Copy(Encoding.UTF8.GetBytes(value[i]), tmpBytes[i], countBytes - 1);
            tmpBytes[i][countBytes - 1] = (byte)'\0';
        }
    #if DEBUG
        Trace.WriteLine($"Summary bytes in array: {summarySize}", "INFO");
    #endif // ! DEBUG
        Pointer = Marshal.AllocHGlobal(summarySize);
        for (int i = 0; i < Length; i++)
        {
            for (int j = 0; j < tmpBytes[i].Length; j++)
            {
                Marshal.WriteByte(Pointer, i * j, tmpBytes[i][j]);
            }
        }
        GC.KeepAlive(this);
    }
    public IntPtr Pointer { get; private set; }
    public int Length { get; private set; }
    ~IntPtrUtf8ArrayStr()
    {
        ReleaseUnmanagedResources();
    }
    private void ReleaseUnmanagedResources()
    {
        if (isDisposed)
            return;
        Marshal.FreeHGlobal(Pointer);
        Length = 0;
        Pointer = IntPtr.Zero;
        isDisposed = true;
        GC.SuppressFinalize(this);
    }
    public void Dispose()
    {
        if (isDisposed)
            return;
        ReleaseUnmanagedResources();
    }
}
Answer 1
  1. Нужно использовать Метод Marshal.Copy (Byte[], Int32, IntPtr, Int32)
  2. Ну и про использование рваных многомерных массивов https://blogs.msdn.microsoft.com/ruericlippert/2009/08/16/2313/
READ ALSO
Ошибка при десериализации из json [дубликат]

Ошибка при десериализации из json [дубликат]

На данный вопрос уже ответили:

227
Невозможно записать или создать файл - С# .NET Core + UWP

Невозможно записать или создать файл - С# .NET Core + UWP

Всем доброго времени суток! Есть проблема, мне выбивает такую ошибку:

249
При задании значения в своём свойстве в xaml оно всегда null в конструкторе контрола

При задании значения в своём свойстве в xaml оно всегда null в конструкторе контрола

Добавляю своё свойство в контрол, чтобы его можно было задавать через xaml

215