Почему делегаты функций и действий принимают только 4 аргумента?

Почему 4? Я знаю его в документации как 4, но это кажется странным.

Можете ли вы объяснить, зачем вам нужно больше четырех?

Jon Limjap 23.12.2008 06:31

@Jon Limjap, вы можете объяснить, зачем вам нужно больше трех?

Daniel Earwicker 23.12.2008 13:52

Т.е. для построения математической модели прогнозирования, которая разворачивает функции в делегаты на основе предоставленного генокода)

Rinat Abdullin 23.12.2008 17:38

На самом деле мне это не нужно. Мне просто было любопытно. Странно находить такие жестко закодированные и ограниченные вещи в структуре .net, и я хотел знать, есть ли за этим какая-то логика. Что-то более существенное, чем «Если бы еще это было, то ваш код пахнет».

jf26028 28.12.2008 09:19
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
934
6

Ответы 6

Достаточно странно, что людям нужно потреблять четыре типа объектов, инкапсулировать их, манипулировать ими и отслеживать их все в одном классе.

Я бы даже сказал, что за пределами трех различных типов ваш общий класс уже зашел слишком далеко. Обычно вы должны учитывать перестановки того, как ваши типы взаимодействуют друг с другом, например, 1 тип - это хорошо, 1 x 2 - нормально, 3 - у вас есть 6 способов манипулировать вашими типами, на 4 у вас есть 24 комбинации на выбор. , поэтому вы должны учитывать и эту сложность.

Я не знаю точного ответа, но я предполагаю, что это связано с тем фактом, что если вы передаете делегатов с> 4 аргументами, это запах кода, и вы, вероятно, делаете что-то не так. Вам следует подумать об использовании рефакторинга "Ввести объект параметра".

Я рискну и скажу, что это потому, что кому-то нужен делегат Action или Func где-то во фреймворке с 4 аргументами, и никому еще не нужен был делегат с 5. В качестве альтернативы, кто-то решил, что больше 4, и вам следует ввести класс для хранения значений, как говорит @chadmyers.

Браво - это скорее простой прагматичный выбор, который может измениться в будущем, чем любой из этих якобы принципиальных ответов вроде «Если вам нужно больше четырех, вы делаете это неправильно».

Daniel Earwicker 23.12.2008 06:49

И, конечно же, достаточно легко добавить собственную перегрузку Func, если вам нужно 17 параметров. Но 4 кажется хорошим компромиссом в покрытии наиболее распространенных вариантов использования с наименьшим количеством дополнительного кода, добавляемого в BCL.

jalf 23.12.2008 07:21

Во-первых, я согласен с другими, что сигнатура функции с 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 параметров.

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

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