C# StructLayout. Явный вопрос

библиотека Prototype включает объект Хеш-таблицы, с ".toQueryString ()" метод, который позволяет, Вы для легкого превращения объекта/структуры JavaScript в строку запроса разрабатываете строку. Так как сообщение требует, чтобы "тело" запроса было отформатированной строкой строки запроса, это позволяет Вашему запросу Ajax работать правильно сообщением. Вот пример с помощью Прототипа:

$req = new Ajax.Request("http://foo.com/bar.php",{
    method: 'post',
    parameters: $H({
        name: 'Diodeus',
        question: 'JavaScript posts a request like a form request',
        ...
    }).toQueryString();
};

10
задан Mehrdad Afshari 25 July 2009 в 19:38
поделиться

2 ответа

Среда CLR содержит верификатор, который гарантирует, что работающий код (проверяемый IL) не может повредить память в управляемой среде. Это не позволяет вам объявить такую ​​структуру, в которой поля перекрываются. По сути, ваша структура содержит два члена данных. Одно целое число (4 байта) и собственное целое число (размер указателя). В 32-битной среде CLR, в которой вы, вероятно, запускаете свой код, char [] займет 4 байта, поэтому, если вы поместите целое число меньше четырех байтов от начала структуры, вы имеют перекрывающиеся поля. Это'

12
ответ дан 3 December 2019 в 23:50
поделиться

I figured I'd respond with the solution I used to create the union -- which was my original intention. I used an unsafe struct and a fixed array and then used a property to interact with the fixed array. I believe this should do what I want.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace StructTest
{

    [StructLayout(LayoutKind.Explicit)]
    unsafe struct OuterType
    {
        private const int BUFFER_SIZE = 100;

        [FieldOffset(0)]
        private int transactionType;

        [FieldOffset(0)]
        private fixed byte writeBuffer[BUFFER_SIZE];

        public int TransactionType
        {
            get { return transactionType; }
            set { transactionType = value; }
        }

        public char[] WriteBuffer
        {
            set
            {
                char[] newBuffer = value;

                fixed (byte* b = writeBuffer)
                {
                    byte* bptr = b;
                    for (int i = 0; i < newBuffer.Length; i++)
                    {
                         *bptr++ = (byte) newBuffer[i];
                    }
                }
            }

            get
            {
                char[] newBuffer = new char[BUFFER_SIZE];

                fixed (byte* b = writeBuffer)
                {
                    byte* bptr = b;
                    for (int i = 0; i < newBuffer.Length; i++)
                    {
                        newBuffer[i] = (char) *bptr++;
                    }
                }

                return newBuffer;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            OuterType t = new OuterType();
            System.Console.WriteLine(t);
        }
    }
}
1
ответ дан 3 December 2019 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: