C# - Синтаксический сахар для параметров?

Я запустил это на IDEOne и обнаружил, что если я этого не сделаю #include , я получу неправильные результаты

#include 
//#include             // <== This line is crucial

int main(void) {
    char* temp   = "6.345e-2";
    float result = atof(temp);

    printf("%f\n", result);

    return 0;
}

с stdlib.h:

Success #stdin #stdout 0s 9424KB
0.063450

Без stdlib.h:

Success #stdin #stdout 0s 9424KB
0.000000

8
задан JoshJordan 14 April 2009 в 17:43
поделиться

9 ответов

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

Я не могу сказать, что использую параметры из достаточно часто, чтобы это действительно вызывало у меня серьезную озабоченность (есть и другие функции, которые я ' Я бы предпочел, чтобы команда C # потратила на это время, но я согласен, что это немного раздражает.

9
ответ дан 5 December 2019 в 06:54
поделиться

.NET 4 будет добавлять концепцию Tuple, которая занимается этим. К сожалению, язык C # не предоставляет никакой языковой поддержки для «деструктурирования связывания».

5
ответ дан 5 December 2019 в 06:54
поделиться

Personally, I like the inconvience introduced when using out parameters. It helps me to think about whether my method is really doing what it should be or if I've crammed too much functionality into it. That said, perhaps dynamic typing in C#4.0/.Net 4 will address some of your concerns.

dynamic participant = message.GetParticipants();

var sender = participant.Sender;
var recipient = participant.Recipient;

where

public object GetParticipants()
{
     return new { Sender = ..., Recipient = ... };
}
4
ответ дан 5 December 2019 в 06:54
поделиться

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

В perl вы можете присвоить массив списку переменных в круглых скобках. Так что вы можете, например, сделать так

($user, $password) = split(/:/,$data);
2
ответ дан 5 December 2019 в 06:54
поделиться

Вы также можете вернуть кортеж или что-то похожее. Однако, так как вы хотите вернуть две строки, это может привести к путанице.

Я использую структуры Tuples библиотеки BclExtras , что очень удобно (нашел ее в SO, спасибо JaredPar!).

2
ответ дан 5 December 2019 в 06:54
поделиться

Где это меня больше всего беспокоит: так как нет перегрузки (скажем) DateTime.TryParse который не принимает из параметра , вы не можете написать

if (DateTime.TryParse(s, out d))
{
   return new ValidationError("{0} isn't a valid date", s);
}

без объявления d . Я не знаю, если это проблема с параметрами out или просто с тем, как реализован метод TryParse , но это раздражает.

2
ответ дан 5 December 2019 в 06:54
поделиться

В лучшем случае вам придется использовать var , а не явный тип, если вы не хотите ограничить все множественные возвращаемые значения одним и тем же типом (вряд ли практично). Вы также ограничивали бы область действия переменной; в настоящее время вы можете объявить переменную в более высоком объеме и инициализировать ее в параметре out. При таком подходе переменная выходит из области действия в том же блоке, что и ее назначение. Очевидно, что в некоторых случаях это применимо, но я бы не хотел применять это в качестве общего правила. Очевидно, что вы можете оставить опцию « out » на месте, но есть вероятность, что люди собираются писать код для одного или другого подхода.

0
ответ дан 5 December 2019 в 06:54
поделиться

Я думаю, что это не то, что вы хотите. Возможно, вы столкнулись с фрагментом кода, где вы бы имели понравилось это. Но переменные появляются из ниоткуда, потому что они были введены в список параметров будет личный кошмар (для меня :))

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

вы можете открывать ящик Пандоры; -)

Для сжатия строк:

string s1, s2; s1 = foo.bar(s2);

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

-1
ответ дан 5 December 2019 в 06:54
поделиться

Попробуйте следующий код

Participants p = message.GetParticipants();
log(p.sender,p.receiver);
-1
ответ дан 5 December 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: