Почему 4? Я знаю его в документации как 4, но это кажется странным.
@Jon Limjap, вы можете объяснить, зачем вам нужно больше трех?
Т.е. для построения математической модели прогнозирования, которая разворачивает функции в делегаты на основе предоставленного генокода)
На самом деле мне это не нужно. Мне просто было любопытно. Странно находить такие жестко закодированные и ограниченные вещи в структуре .net, и я хотел знать, есть ли за этим какая-то логика. Что-то более существенное, чем «Если бы еще это было, то ваш код пахнет».





Достаточно странно, что людям нужно потреблять четыре типа объектов, инкапсулировать их, манипулировать ими и отслеживать их все в одном классе.
Я бы даже сказал, что за пределами трех различных типов ваш общий класс уже зашел слишком далеко. Обычно вы должны учитывать перестановки того, как ваши типы взаимодействуют друг с другом, например, 1 тип - это хорошо, 1 x 2 - нормально, 3 - у вас есть 6 способов манипулировать вашими типами, на 4 у вас есть 24 комбинации на выбор. , поэтому вы должны учитывать и эту сложность.
Я не знаю точного ответа, но я предполагаю, что это связано с тем фактом, что если вы передаете делегатов с> 4 аргументами, это запах кода, и вы, вероятно, делаете что-то не так. Вам следует подумать об использовании рефакторинга "Ввести объект параметра".
Я рискну и скажу, что это потому, что кому-то нужен делегат Action или Func где-то во фреймворке с 4 аргументами, и никому еще не нужен был делегат с 5. В качестве альтернативы, кто-то решил, что больше 4, и вам следует ввести класс для хранения значений, как говорит @chadmyers.
Браво - это скорее простой прагматичный выбор, который может измениться в будущем, чем любой из этих якобы принципиальных ответов вроде «Если вам нужно больше четырех, вы делаете это неправильно».
И, конечно же, достаточно легко добавить собственную перегрузку Func, если вам нужно 17 параметров. Но 4 кажется хорошим компромиссом в покрытии наиболее распространенных вариантов использования с наименьшим количеством дополнительного кода, добавляемого в BCL.
Во-первых, я согласен с другими, что сигнатура функции с 5 аргументами может стать немного длинной. При этом за время работы в качестве разработчика я написал множество длинных сигнатур функций.
Вы всегда можете написать свои собственные перегруженные универсальные делегаты. Вы даже можете поместить их в Систему (я бы не стал).
namespace System
{
public delegate void Action<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2,
T3 arg3, T4 arg4, T5 arg5);
public delegate ReturnT Action<ReturnT, T1, T2, T3, T4, T5>(T1 arg1,
T2 arg2, T3 arg3, T4 arg4, T5 arg5);
}
Обновлено: с тех пор, как я написал этот пост, .Net 4. прибыл, а вместе с ним и более длинные версии этих делегатов.
Потому что иметь делегатов с таким количеством аргументов - плохая модель разработки. Это делает ваш код чрезвычайно связным и сложным.
В .NET 4.0 вы получаете гораздо больше - до 16 параметров.
Хотя использование такого обычно может увести немного далеко с точки зрения удобочитаемости ...
Можете ли вы объяснить, зачем вам нужно больше четырех?