Есть ли причина, по которой C # не поддерживает ручные встроенные методы? А как насчет необязательных параметров?

2

Есть ли какая-либо причина дизайна для этого (например, причина, по которой они отказались от множественного наследования)?

или это просто не было достаточно важно?

и тот же вопрос применяется для необязательных параметров в методах... это уже было в первой версии vb.net... так что, безусловно, никакой лени, которая заставляет MS не разрешать дополнительные параметры, возможно, решение архитектуры.. и это похоже, они изменили свое отношение к этому, потому что С# 4 включит это.

Кто-нибудь знает, что было решением и почему они отказались?

EDIT:

Может, ты меня не совсем понял. В последнее время я работаю над программой расчета (номера поддержки любого размера, до последней цифры), в которой некоторые методы используются буквально миллионы раз в секунду.

Скажем, у меня есть метод Add (int num), и этот метод используется очень тихо с 1 в качестве параметра (Add(1);), я обнаружил, что быстрее реализовать специальный метод, особенно для одного. И я не имею в виду перегрузку - написание нового метода под названием AddOne и буквально копирование метода Add в него, за исключением того, что вместо использования num я пишу 1. Это может показаться вам ужасно странным, но на самом деле это быстрее.

(насколько это уродливо)

Это заставило меня задаться вопросом, почему С# не поддерживает руководство, которое может быть удивительно полезным здесь.

спасибо. (и почему вы проголосовали за меня: S)

Изменить 2:

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

  • 0
    System.Numerics.BigInteger в .NET 4.0: msdn.microsoft.com/en-us/library/…
  • 0
    Человек не разрушай это для меня!
Показать ещё 1 комментарий
Теги:
inline
optional-parameters

7 ответов

6
Лучший ответ

Чтобы ответить на часть вашего вопроса, см. сообщение в блоге Eric Gunnerson: Почему у С# нет ключевого слова 'inline'?

Цитата из его сообщения:

Для С# вложение происходит в JIT уровня, и JIT обычно делает достойное решение.

EDIT: я не уверен в причине задержки поддержки дополнительных параметров, однако, говоря, что они "сдались", это звучит так, как будто они должны были реализовать его на основе наших ожиданий от того, что предлагают другие языки. Я предполагаю, что он не был высоким в списке приоритетов, и у них были крайние сроки, чтобы получить определенные функции в дверь для каждой версии. Вероятно, до сих пор это не повышалось, тем более что перегрузка метода была доступной альтернативой. Между тем мы получили generics (2.0) и функции, которые делают LINQ возможным и т.д. (3.0). Я доволен прогрессией языка; вышеупомянутые функции важнее для меня, чем на ранней стадии поддержки дополнительных параметров.

  • 0
    да, но иногда это не так! я не просто задаю этот вопрос, иногда это нужно ~
  • 2
    @Itay: не могли бы вы привести пример, когда встраивание помогло бы вам, а JIT не сделал это для вас? Кроме того, вы читали пост Эрика?
Показать ещё 1 комментарий
3

Ручная вставка будет почти бесполезной. Компилятор JIT встрояет методы во встроенную компиляцию кода, где это необходимо, и я думаю, что почти во всех случаях JIT-компилятор лучше угадывает, когда это подходит, чем программист.

Что касается дополнительных параметров, я не знаю, почему их не было в предыдущих версиях. Тем не менее, я не люблю, чтобы они были там на С# 4, потому что я считаю их несколько вредными, потому что параметр запекается в сборку потребления, и вам нужно перекомпилировать его, если вы измените стандартные значения в DLL и хотите, чтобы потребитель чтобы использовать новые.

EDIT:

Дополнительная информация о inlining. Хотя вы не можете заставить компилятор JIT встроить вызов метода, вы можете заставить его НЕ встраивать вызов метода. Для этого вы используете System.Runtime.CompilerServices.MethodImplAttribute, например:

internal static class MyClass
{
    [System.Runtime.CompilerServices.MethodImplAttribute(MethodImplOptions.NoInlining)]
    private static void MyMethod()
    {
        //Powerful, magical code
    }

    //Other code
}
  • 0
    Я думаю, что имена параметров так же важны, как имена методов для открытого интерфейса. Изменение имен методов всегда нарушало код, теперь изменение имен параметров тоже. Очевидно, что лучше не ломаться, если этого можно избежать, но при правильном дизайне, ваши имена параметров должны быть такими же стабильными, как и имена ваших методов.
  • 0
    Я не говорю о названиях параметров. Для необязательного параметра необходимо указать стандартное значение для этого параметра, а если вы измените это стандартное значение, вам придется перекомпилировать каждую потребляющую сборку, чтобы оно использовало новое значение вместо старого, поскольку значения копируются в позвоните на сайт.
Показать ещё 3 комментария
1

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

Затем вы выбрали неправильный язык. Я полагаю, вы действительно профилировали свой код (правильно?) И знаете, что нет ничего, кроме микрооптимизации, которая может вам помочь. Кроме того, вы используете высокопроизводительную собственную библиотеку bigint и не записываете свои собственные, не так ли?

Если это правда, не используйте .NET. Если вы считаете, что можете получить скорость по частичной специализации, перейдите в Haskell, C, Fortran или любой другой язык, который либо делает это автоматически, либо может предоставить вам инкрустировать, чтобы сделать это вручную.

Если Add(1) действительно имеет значение для вас, также важны распределения кучи.

Однако, вы должны действительно посмотреть, что может рассказать профайлер...

1

Мое образованное предположение: причина, по которой более ранние версии С# не имели необязательных параметров, из-за плохого опыта с ними в С++. На первый взгляд они выглядят прямолинейно, но есть несколько неприятных угловых случаев. Я думаю, что одна из книг Херба Саттера описывает это более подробно; в общем, это связано с переопределением методов virtual. Максимилиан упомянул об одном из случаев с .NET в его ответе.

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

Итак, после всех этих лет без них, почему С# 4.0 добавил их? 1) улучшенная четность с VB.NET и 2) более легкое взаимодействие с COM.

0

Java не включает ключевое слово inline. Лучшие JIT Java могут встроить даже виртуальные методы, а также использование ключевых слов, таких как private или final, не имеет никакого значения (раньше оно использовалось, но теперь это древняя история).

0

Даже в таких языках, как С++, вложение чего-то не гарантирует, что это произойдет; это подсказка для компилятора. Компилятор может либо взять подсказку, либо сделать свое дело.

С# - еще один шаг, удаленный из сгенерированного кода сборки (через IL + JIT), поэтому становится еще труднее гарантировать, что что-то будет встроено. Кроме того, у вас есть проблемы, подобные реализациям x86 + x64 JIT, отличающимся поведением.

0

С# добавил их в 4.0: http://msdn.microsoft.com/en-us/library/dd264739(VS.100).aspx

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню