C# с использованием буфера разных типов (double, uint, ushort), но с тем же именем

Я вношу изменения в программу сбора данных с буфером, тип которого зависит от ввода пользователя из формы. На данный момент один и тот же код написан 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

Это C#. Переменные всегда имеют тип.

user47589 09.03.2018 16:08

Вы не можете. Не существует общего базового класса для double[], short[] и всех остальных. Пожалуйста, покажите, что вы делаете фактически после определения buf.

HimBromBeere 09.03.2018 16:08

Вы можете использовать object[] вместо типа, но имейте в виду упаковку / распаковку. Если вы проделаете с ним математические операции, это станет намного сложнее. Я бы просто выбрал самый широкий шрифт и позже вернул его обратно к узкому.

Ron Beyer 09.03.2018 16:08

Не зная, что нужно делать общий, мы не можем дать вам никакого решения. Как уже упоминалось, с возможным типом массива каждый мало что можно сделать, за исключением только массива повторение.

HimBromBeere 09.03.2018 16:12

@HimBromBeere, после этого buf используется для создания DataTable и графика, поэтому с помощью buf выполняется только .length и цикл по элементам, чтобы поместить их в DataTable.

ceschepe 09.03.2018 16:16

Почему бы просто не дать массивам разные имена?

user47589 09.03.2018 16:17

Если все, что вы делаете с массивом, - это повторять, вы можете объявить buf как IEnumerable или как Array впереди.

HimBromBeere 09.03.2018 16:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
75
2

Ответы 2

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

И лучше, как object []. Хотя я рекомендую вам проверить, есть ли вам действительно нужно хранить разные типы в одной переменной, вы можете объявить его как object []:

object[] buf =olBuffer.GetDataAsVolts();

Вам нужно будет преобразовать эти данные позже, когда вы захотите их использовать:

double[] dbuf=(double[])buf;

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

double должен иметь возможность хранить ваши ushort-значения в. Вы можете просто преобразовать или преобразовать его:

double dValue=(double) ushortValue

или же

double dValue=Convert.ToDouble(uShortValue)

Но убедитесь, что диапазоны и точность соответствуют вашим требованиям, прежде чем делать это таким образом.

Но еще раз: проверьте, есть ли лучший способ, используя правильный тип. Переменным C# всегда требуется тип.

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

ceschepe 09.03.2018 18:05

Это зависит от вашей логики и от того, нужно ли вам выполнять какие-либо операции, специфичные для int, short или любых других типов, которые вы используете, например, основные математические операции.

Если вам не нужны такие операции, вы можете объявить такой метод и передать ему свой буфер:

private void WorkWithBuffer<T>(T[] buffer) {
    // lots of code with your buffer
}

Это предполагает, что вы имеют некоторого общего базового класса или интерфейса, все экземпляры в массиве наследуются от / реализации, что маловероятно в случае числовых типов. Не существует общего числового базового типа.

HimBromBeere 09.03.2018 16:32

То же самое. Спасибо Вам за информацию. Я попробую, когда снова смогу использовать оборудование на следующей неделе.

ceschepe 09.03.2018 18:06

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