Указатели на напечатанную переменную в C #: Интерфейс, общий, объект или класс? (Бокс / распаковка)

StackOverflow https://stackoverflow.com/questions/4610624

Вопрос

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

Я очень путаюсь со всей проблемой бокса / небоксинга. Скажем, у меня есть поля разных классов, все возвращающиеся напечатанные переменные (например, «двойные»), и я хотел бы иметь переменную точку на любой из этих полей. В простых старых Ci сделали бы что-то вроде:

double * newVar;
newVar = &oldVar;
newVar = &anotherVar;
...

У меня есть таймер вызывает функцию и передает значение ссылочной переменной:

ChartPlotData(*newVar);

Причина, по которой я ищу указателя, это потому, что newvar изменяется во время выполнения, связанные с событием:

public void checkbox_Clicked(object sender ...)
  if (sender == checkbox1) value = &object1.field1;
  if (sender == checkbox2) value = &object2.field1;

Как это можно сделать в C #?

Редактировать1: объяснил цель ссылки.

Редактировать2: сделали некоторые неправильные заявления, удалили их и сократили вопрос.

Это было полезно?

Решение

Вы можете получить событие щелчков, как предложено в вашем редактировании, а затем использовать делегат для выбора данных, которые будут переданы на управление. Я не уверен, что это будет соответствовать вашим требованиям производительности.

ChartPlotData(valueSelector());

// ...

Func<double> valueSelector;

protected void Checkbox_Click(object sender /* ... */)
{
    if (sender == checkbox1) valueSelector = () => object1.field1;
    if (sender == checkbox2) valueSelector = () => object2.field1;
    // ...
}

(Если вы предпочтете, и если вы можете, вы можете перегрузить свой ChartPlotData метод принять Func<double> а не просто double, а затем вызвать селекторный делегат лениво внутри метода, а не на участке вызова.)

Другие советы

Простые типы и структуры имеют тип типа C #. Вы не можете ничего делать с этим, если вы не упомянули, вы используете небезопасный модификатор. Сказав это, ваши варианты ограничены.

  1. Используйте объект вместо примитивных типов.
  2. Используйте массивы размера 1.
  3. Пользовательский универсальный класс прокси, инкапсулируя либо из выше.
  4. ???

Вы можете обратиться к существующему типу значения, используя ref ключевое слово.

public static void ModifyNumber(ref int i)
{
    i += 1;
}

static void Main(string[] args)
{
    int num = 4;
    ModifyNumber(ref num);
    ModifyNumber(ref num);
    ModifyNumber(ref num);
    ModifyNumber(ref num);


    // num now equals 8


}

Я не уверен, почему вам нужен адрес переменной. Дважды - это тип значений и хранится в стеке. Чтобы пройти его путем рестораны в метод, просто используйте ключевое слово C # REF.
Из случаев вы упомянули, я лично предпочел бы что-то вроде этого:

class Program
{
    public class Refferenced<T> where T : struct 
    {
        public T Value { get; set; }
    }

    static void Main(string[] args)
    {
        Refferenced<double> x = new Refferenced<double>();
        Refferenced<double> y = new Refferenced<double>();
        y.Value = 2;
        x = y;
        x.Value = 5;
        Console.WriteLine(x.Value);
        Console.WriteLine(y.Value);
        y.Value = 7;
        Console.WriteLine(x.Value);
        Console.WriteLine(y.Value);

        Console.ReadKey();
    }


Это похоже на NULLBALE C # Nullable.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top