Указатели на объекты (объект *) в C # - PullRequest
1 голос
/ 23 июня 2011

Что я хочу сделать, так это то, что я хочу передать указатель на функцию, которая может быть переменной любого типа (int, long, string, даже класс, который, я имею в виду, должен иметь возможность передавать указатель любой переменной).Я делаю это так:

unsafe class whatever
{
    whatever(object* variable)
    {
          this.variable = variable;
    }
}

ОШИБКА IS: Невозможно получить адрес, получить размер или объявить указатель на управляемый тип ('объект')

ПочемуЯ хочу сделать, я буду хранить переменные, переданные через конструктор и буду использовать их метод ToString (), я пытаюсь создать класс для консольных приложений, Обновление переменных с их обновленными переменными.

Если бы я мог сделать это, Мой код будет выглядеть так

unsafe class whatever
{
    whatever(object* variable)
    {
        this.variable = variable;
    }

    object* variable;

    public override string ToString()
    {
        return *variable.ToString();
    }
}

Ответы [ 4 ]

3 голосов
/ 23 июня 2011

Возможно, вам следует передать делегата, который ваш класс может использовать для получения «строки объекта».

class MyFancyClass
{
    Func<string> getObjectString;

    public MyFancyClass(Func<string> getObjectString)
    {
        this.getObjectString = getObjectString;
    }

    private MyOtherThread()
    {
        // ...
        string desc = getObjectString();
        // ...
    }
}

// ...
long value = 34;
MyFancyClass fancy = new MyFancyClass(() => value.ToString());

// ...
value = 88;
// getObjectString() should now reflect the new value.
// The variable is captured in the lambdas closure.

Будьте осторожны, потому что делегат вызывается из другого потока, и простой вызов ToString () может быть небезопасным для всех объектов и требует блокировки. Однако делегат позволяет вызывающему сделать это в зависимости от объекта.

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

1 голос
/ 23 июня 2011

Если вы хотите получить адрес переменной, это не может быть сложный управляемый тип.Тем не менее, вы можете сделать что-то вроде этого (предполагая небезопасный контекст):

int a = 1;

IntPtr addr = ( IntPtr )( &a );

( * ( int* ) addr ) = 4;

a = 4;

Это то, что вы ищете?

Править:

Если вы просто хотите сохранить «указатель на функцию» из объекта, просто используйте его для хранения делегата.

class whatever
{
    public whatever(object variable)
    {
        getVariableValue = variable.ToString;
    }

    Func<string> getVariableValue;

    public override string ToString()
    {
        return getVariableValue();
    }
}

void Main()
{
    var type = new { F1 = "test", F2 = "value" };

    whatever w = new whatever( type );

    Console.WriteLine( w ); // This will invoke ToString
}

Вывод: {F1 = test, F2 =значение}

1 голос
/ 23 июня 2011

В C # вы обычно не используете указатели. Если вы хотите сослаться на место хранения, попробуйте это:

whatever(ref object variable)
{

}

Иначе, я бы скорее рекомендовал использовать класс-обертку или другой способ получить некоторую переменную. Оболочка может выглядеть так:

class Wrapper
{
    public object Value { get; set; }
}
0 голосов
/ 19 июля 2018

Вы хотите пустоту *, но будьте осторожны с ними. если вы сделаете неправильный актерский состав, он рухнет. в этом случае может быть разумно создать структуру и привести ее к intptr.

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