Указатели универсального типа?

Итак, я хочу создать универсальный класс, который изменит значение типа данных. Причина, по которой я хочу это сделать, заключается в том, что я могу использовать методы отмены и повторения. Я мог бы написать класс для каждого нужного мне значения. И.Е. double, int ... но было бы намного проще, если бы я мог создать универсальный класс для этого.

Это то, что у меня есть

class CommandChangeDouble : Command
{
    double _previous;
    double _new;
    double* _objectRef;

    public unsafe CommandChangeDouble(double* o, double to)
    {
        _objectRef = o;
        _previous = *o;
        _new = to;
        *_objectRef = _new;
    }

    public unsafe void Undo()
    {
        *_objectRef = _previous;
    }
    public unsafe void Redo()
    {
        *_objectRef = _new;
    }
}

это то, что я хочу

class CommandChangeValue : Command
{
    T _previous;
    T _new;
    T* _objectRef;

    public unsafe CommandChangeValue(T* o, T to)
    {
        _objectRef = o;
        _previous = *o;
        _new = to;
        *_objectRef = _new;
    }

    public unsafe void Undo()
    {
        *_objectRef = _previous;
    }
    public unsafe void Redo()
    {
        *_objectRef = _new;
    }
}

но это дает мне ошибку "Ошибка"Невозможно получить адрес, получить размер или объявить указатель на управляемый тип ('T') "

Есть ли лучший способ сделать это или способ обойти эту ошибку?

 SLaks17 июн. 2013 г., 22:25
Обратите внимание, что вам понадобится стек, если вы хотите отменить несколько раз.
 Daniel Johnson17 июн. 2013 г., 23:03
@SLaks Да, я нене хочу использовать указатели, но я не могне думаю о другом способе реализовать то, что я хотел. Также да, у меня есть 2 списка <Command> следить за отменой и повторением
 SLaks17 июн. 2013 г., 22:24
Ответ на этот вопрос всегда таков:использовать указатели
 Renan17 июн. 2013 г., 22:26
Ссылки в .NET являются указателями на безопасные типы ... Использование "чистый» указатели в C # немного излишни.
 IllidanS405 июн. 2015 г., 23:22
Проблема в том, что вы можете сделать только указатель типов значений, которые неt содержат ссылки, и вы не можете ограничить универсальный параметр этими типами.

Ответы на вопрос(4)

Решение Вопроса

Вместо указания указателя на значение укажите сеттер:

class CommandChangeValue<t> : Command
{
    T _previous;
    T _new;
    Action<t> _set;

    public CommandChangeValue(T value, Action<t> setValue, T newValue)
    {
        _previous = value;
        _new = newValue;
        _set = setValue;
        setValue(_new);
    }

    public void Undo() { _set(_previous); }
    public void Redo() { _set(_new); }
}


// ...
double v = 42;
var c = new CommandChangeValue(v, d => v = d, 99);
</t></t></t>
 Daniel Johnson17 июн. 2013 г., 22:51
Хм это похоже на то, что яищу с дополнительным бонусом не использовать указатели. хотя я'мне придется ознакомиться с классом Action.

и любой другой тип, используя эти методы ....

    /// <summary>
    /// Provides the current address of the given element
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t">
    /// <returns></returns>
    [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
    public static System.IntPtr AddressOf<t>(T t)
        //refember ReferenceTypes are references to the CLRHeader
        //where TOriginal : struct
    {
        System.TypedReference reference = __makeref(t);

        return *(System.IntPtr*)(&reference);
    }

    [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
    static System.IntPtr AddressOfRef<t>(ref T t)
    //refember ReferenceTypes are references to the CLRHeader
    //where TOriginal : struct
    {
        System.TypedReference reference = __makeref(t);

        System.TypedReference* pRef = &reference;

        return (System.IntPtr)pRef; //(&pRef)
    }
</t></t>

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

 Jay26 сент. 2018 г., 18:55
Также имейте в виду, что значения, переданные с помощью ref, реализуются как внутренние указатели, и адрес не может измениться, пока значение находится в стеке, просто нене хранить ссылку в поле.
 Jay03 мар. 2017 г., 12:57
Внимательно,net7mma.codeplex.com/SourceControl/latest#Concepts/Classes/... смотри Читать <T> или читать
 Mike Marynowski03 мар. 2017 г., 12:16
Как сделать обратное и вернуться к типу T из IntPtr?
 Mike Marynowski03 мар. 2017 г., 16:46
Вы должны включить функции Read в свой ответ :)
 Arek Bal26 сент. 2018 г., 12:54
Помните, что эти адреса IntPtr могут измениться в середине выполнения из-за очистки GC. Поэтому 'фиксированный' и пиннинг памяти был изобретен и должен использоваться с ними.
 Mike Marynowski03 мар. 2017 г., 16:40
Вау, круто. Как я раньше этого не видел, ага ... я бы упростила мою жизнь, пытаясь извлечь необработанные куски из перечислимых типов. В итоге я использовал обобщенные скомпилированные выражения приведения типов с слишком большим количеством повторяющегося кода, необходимого для каждого базового типа перечисления. Это мило. Интересно, какой из них более производительный.
 tobriand25 окт. 2017 г., 12:46
Бился над этим прошлой ночью. Нужен указатель на первый элемент универсального массива, где онМне известно (но не компилятору), что массив является типом значения фиксированного размера и может фиксировать память, занятую массивом. Что-то говорит мне, что это должно сделать работу. Также заинтригован использованием__makeref, Haven»Я видел это раньше.
Дон»использовать указатели

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

 SLaks04 сент. 2016 г., 15:59
@Ben: Если вам нужно задать вопрос, вы, вероятно, недостаточно опытный, чтобы сделать это правильно.
 Daniel Johnson17 июн. 2013 г., 22:50
проблема в том, что несколько классов будут взаимодействовать с одним и тем же значением. Я тоже могусделать его статичным, потому что тамбудут разные значения тоже.
 SLaks09 окт. 2016 г., 02:43
@Ben: Для начала, CLR через C #. Есть один или два других, которые я неЯ не помню
 Andrew Rondeau03 апр. 2018 г., 20:25
Я чаще всего вижу, что C # noobs используют указатели, когда они приходят из C. Это 'Кодовый запах. Правильный ответ больше похож на "Дон»не используйте указатели, если вы действительно не знаете, что выделаешь ".
 user241501003 сент. 2016 г., 18:06
Вы можете использовать указатели. Указатели действительны и иногда важны для высокопроизводительных приложений. Это глупый ответ.
 SLaks19 сент. 2016 г., 05:17
@Ben: нет; чтобы быть достаточно опытным, чтобы эффективно использовать указатели, вам придется читать целые книги (или сообщения в блоге Ника Крейвера и другие). Такие вопросы выходят за рамки SO. "
 Matt15 июн. 2018 г., 08:42
Большинство людей, которые говорят такие вещи, - это люди, которые не знают, как использовать указатели и проецируют свою неспособность сделать это на других.
 ForeverZer020 авг. 2018 г., 06:21
Я использую указатели всякий раз, когда это необходимо для критичного к производительности кода. Никогда не читайте книгу об этом. Совсем нетрудно, если вы изучите их, как и все остальное, гораздо проще, если исходить из языка Си / Си ++, где они наиболее широко используются, но я никогда не пойму "Я удивительный, потому что я знаю указатели, те, кто нея слишком глуп, чтобы объяснить их склад ума. Я еще не встретил кого-то, кто родился сВсезнающий Указатель " ген, и неЯ не имею понятия о них.
 user241501008 окт. 2016 г., 07:00
Нет; чтобы быть достаточно опытным, чтобы эффективно использовать указатели, вам придется читать целые книги " Ни за что. Тот'смешная вещь. Какие "целые книги " посвящены использованию указателей? Люди могут / должны спросить об их использовании для высокопроизводительных приложений на C #. Я использую их все время. Если вы нене хочу отвечать людямзаконные вопросы о них, хорошо, но нене вводить людей в заблуждение и напугать по этой теме. А использование указателей - это тема, выходящая за рамки SO? Какого черта человек ?!
 user241501017 сент. 2016 г., 03:31
...Вы становитесь "достаточно опытный задавая вопросы. Снова. Глупый ответ.

как сказано в другом ответе и в комментариях. И если вы хотите иметь некоторую функциональность отмены / повтора в вашем приложении, вы можете посмотреть вПамятная картина.

Ваш ответ на вопрос