Я вношу изменения в программу сбора данных с буфером, тип которого зависит от ввода пользователя из формы. На данный момент один и тот же код написан 3 раза, за исключением того, что переменная buf, используемая в следующем коде, объявлена по-другому. Следующие строки кода такие же. Приведенный ниже фрагмент кода используется 3 раза, что делает код больше, чем необходимо. Как я могу объявить переменную buf без типа, затем присвоить ей тип в структурах if и написать код, используя переменную buf только 1 раз? Я новичок в C# и пробовал объявить как void и использовать ifs, как я узнал в java, но, похоже, не могу найти решение ...
заранее спасибо
if (...){
double[] buf = olBuffer.GetDataAsVolts();
/*
or ushort[] buf = olBuffer.GetDataAsRawUInt16();
or ushort[] buf = olBuffer.GetDataAsRawUInt16();
*/
}
//lots of code using the buf var
Вы не можете. Не существует общего базового класса для double[], short[] и всех остальных. Пожалуйста, покажите, что вы делаете фактически после определения buf.
Вы можете использовать object[] вместо типа, но имейте в виду упаковку / распаковку. Если вы проделаете с ним математические операции, это станет намного сложнее. Я бы просто выбрал самый широкий шрифт и позже вернул его обратно к узкому.
Не зная, что нужно делать общий, мы не можем дать вам никакого решения. Как уже упоминалось, с возможным типом массива каждый мало что можно сделать, за исключением только массива повторение.
@HimBromBeere, после этого buf используется для создания DataTable и графика, поэтому с помощью buf выполняется только .length и цикл по элементам, чтобы поместить их в DataTable.
Почему бы просто не дать массивам разные имена?
Если все, что вы делаете с массивом, - это повторять, вы можете объявить buf как IEnumerable или как Array впереди.





Это можно сделать разными способами. Очень плохие, такие как динамические (они настолько плохи, что я не буду описывать их, поскольку это приведет вас в неправильном направлении).
И лучше, как object []. Хотя я рекомендую вам проверить, есть ли вам действительно нужно хранить разные типы в одной переменной, вы можете объявить его как object []:
object[] buf =olBuffer.GetDataAsVolts();
Вам нужно будет преобразовать эти данные позже, когда вы захотите их использовать:
double[] dbuf=(double[])buf;
Возможно, вы действительно не сохраняете данные в разных типах, но внутренне всегда можете работать с одним и тем же типом. Поэтому простое приведение его к типу, допускающему оба значения, может быть еще более полезным.
double должен иметь возможность хранить ваши ushort-значения в. Вы можете просто преобразовать или преобразовать его:
double dValue=(double) ushortValue
или же
double dValue=Convert.ToDouble(uShortValue)
Но убедитесь, что диапазоны и точность соответствуют вашим требованиям, прежде чем делать это таким образом.
Но еще раз: проверьте, есть ли лучший способ, используя правильный тип. Переменным C# всегда требуется тип.
Спасибо за информацию. Я написал код, как вы предложили, и когда я снова смогу использовать оборудование на следующей неделе, я попробую его.
Это зависит от вашей логики и от того, нужно ли вам выполнять какие-либо операции, специфичные для int, short или любых других типов, которые вы используете, например, основные математические операции.
Если вам не нужны такие операции, вы можете объявить такой метод и передать ему свой буфер:
private void WorkWithBuffer<T>(T[] buffer) {
// lots of code with your buffer
}
Это предполагает, что вы имеют некоторого общего базового класса или интерфейса, все экземпляры в массиве наследуются от / реализации, что маловероятно в случае числовых типов. Не существует общего числового базового типа.
То же самое. Спасибо Вам за информацию. Я попробую, когда снова смогу использовать оборудование на следующей неделе.
Это C#. Переменные всегда имеют тип.