Преобразование типа параметра из C / C ++ в C#: «double *» в «out double»? - PullRequest
1 голос
/ 27 апреля 2020

Мне нужно конвертировать набор функций из C ++ в C#. У них есть объявления методов, такие как

void foo(struct input data*, double* ret1, double *ret2)
{
    // if ret1 is not NULL, return something in it
    if (ret1)
    {
         *ret1 = SomeComplexAndExpensiveMath(data);
    }

    if (ret2)
    {
         *ret2 = MoreComplexAndExpensiveMath(data);
    }
}

Когда я преобразую это в C#, параметры out обычно являются предпочтительным выбором, но передача null аргументу, объявленному как "out double", не допускается:


void foo(input data, out double ret1, out double ret2)
{    
    if (ret1 != null) // Error.
    {
        // ...
    }
}

Использование ref double? в качестве типа параметра также выглядит странно и вызывает дополнительные издержки.

Есть ли способ, которым я могу поддерживать красивый простой тип параметра out double, не вычисляя возвращаемые значения, которые не нужны вызывающей стороне? Есть ли способ узнать, что вызывающий абонент сделал, например, foo(input, out _, out b), чтобы указать, что ему не нужен ret1?

1 Ответ

1 голос
/ 27 апреля 2020

Проверьте документацию . Интересная часть:

Переменные, передаваемые в качестве аргументов, не должны быть инициализированы перед передачей в вызове метода. Однако вызываемый метод должен присвоить значение до его возврата.

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

Последние версии VS сообщат вам об этом, если вы попробуете:

int prs = 1; // Will inform you of unessecary assignment of prs
Int32.TryParse("2", prs);

Таким образом, объявление out предполагает, что по умолчанию оно будет перезаписывать значение. Лучше всего использовать ключевое слово ref, если вы хотите смоделировать ту же функциональность.

Проверить C# Указатели в аргументах метода?

Что такое дополнительные издержки по сравнению с решением C ++?

...