Указатели на напечатанную переменную в C #: Интерфейс, общий, объект или класс? (Бокс / распаковка)
Вопрос
Прежде всего, я прошу прощения, если это было задано тысячу раз. Я прочитал свою книгу 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.
- Пользовательский универсальный класс прокси, инкапсулируя либо из выше.
- ???
Вы можете обратиться к существующему типу значения, используя 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.