действительно ли возможно сделать подставляемую функцию в vb.net?

Я думаю, что мы можем перефразировать вашу логику здесь, чтобы она работала так, как вы хотите:

WITH cte AS (
    SELECT ColumnA, ROW_NUMBER() OVER (ORDER BY index DESC) rn
    FROM yourTable
)

(your query here)
WHERE (SELECT ColumnA FROM cte WHERE rn = 1) = 1;

Приведенное выше предложение WHERE вернет либо true, либо false, и будет применяться ко всем записям в потенциальной набор результатов из вашего запроса. То есть, если бы значение ColumnA из «последней» записи было равно 1, вы бы вернули весь набор результатов, в противном случае это был бы пустой набор.

Предполагая, что ваша версия MariaDB не поддерживает ни ROW_NUMBER, ни CTE, используйте:

(your query here)
WHERE (SELECT ColumnA FROM yourTable ORDER BY index DESC LIMIT 1) = 1;
6
задан Fredou 10 January 2009 в 21:52
поделиться

5 ответов

Встраивание является ответственностью CLR (JIT) и существуют некоторые условия относительно того, когда функция встраивается:

  1. Размер кода меньше, чем 32 байта IL.
  2. Функция не содержит "сложные" конструкции, например, циклы, переключается и т.д.
  3. Функция не содержит попытку/выгоду/наконец.
  4. Функция не объявляется как виртуальная.

Как Вы, вероятно, узнаете, 32 байта не очень с точки зрения кода, это подходит для быстрого и маленького если еще тестирование условия, свойство, getters/setters. Я не думаю, что можно получить любую скорость от встраивания большего объема кода.

7
ответ дан 8 December 2019 в 03:02
поделиться

Ответы, которые я видел, предполагают, что Вы говорите о компиляции или разовом JIT встраивании - и они совершенно корректны. Однако другое использование слова, "встроенного", который я услышал, для вещей как лямбда-выражения - в C#, вещах как:

public IEnumerable<int> Foo()
{
    int[] numbers = new[] { 1, 5, 2, 5, 6 };

    return numbers.Select(x => x+10);
}

x => x+10 (лямбда-выражение), может рассматриваться как "подставляемая функция" в терминах исходного кода, в которых это - дополнительная функция, объявленная "встроенной" в другом методе.

И да, VB9 имеет это:

Dim len As Func(Of String, Integer) = Function(x) x.Length       
Console.WriteLine(len("foo"))

Я полагаю, что существует больше ограничений в VB9 по сравнению с C#, хотя - например, я не думаю, что можно создать Action<T> (или любой другой делегат вводит с пустым типом возврата), использование лямбда-выражения в VB9, тогда как это легко в C#. Аналогично я полагаю, что лямбда должна быть просто отдельным выражением в VB9, тогда как в C# это может быть целый блок в фигурных скобках.

С VB10 можно создать многострочные лямбда-выражения в VB также.

Конечно, если вопрос действительно относился к выполнению, а не исходному коду, все это не важно :)

14
ответ дан 8 December 2019 в 03:02
поделиться

Команда.NET мудро решила, что такие функции не имеют никакого места на самом языке программирования, так как компилятор лучше в решении, что встроить так или иначе. Это помещает его скорее настойчиво, но факт - то, что современный C++ на самом деле часто игнорирует inline инструкция для их процесса принятия решений, о который функции встроить.

2
ответ дан 8 December 2019 в 03:02
поделиться

Вы не можете объявить функцию как встроенную явно, но оптимизатор JIT свободен к подставляемым функциям, если он видит преимущество.

1
ответ дан 8 December 2019 в 03:02
поделиться

Вот один сценарий, когда это было бы неплохим средством:

У нас есть стандартная функция ведения журнала, в которую часто бывает полезно передать имя вызывающего. Однако, если ведение журнала установлено на низкий уровень детализации, функция ведения журнала просто возвращается, чтобы повысить производительность. Чтобы вызывающий абонент не делал дорогостоящих для процессора вызовов System.Reflection.MethodBase.GetCurrentMethod.Name, только для того, чтобы функция ведения журнала не использовала их, было бы неплохо, если бы мы могли создать встроенную функцию, которая заранее решала, стоит ли беспокоиться об обнаружении имя метода:

Public Inline Function GetMyname(iLogLevel) as string
  if iLogLevel < 3 then return ""
  return System.Reflection.MethodBase.GetCurrentMethod.Name()
End Function 

Затем в вызывающей программе мы могли бы поместить аккуратную строку вроде:

Log (2, GetMyname (2) & «: Что-то произошло»)

Но если компилятор решит не встраивать GetMyname () (как и должно быть), тогда имя метода, которое будет отображаться в журнале, всегда будет «GetMyName» - вообще бесполезно.

Назовите меня старомодным, но если мы начнем оставлять все решения компилятору (или CLR!), Тогда мы можем с таким же успехом искать новую карьеру и оставить это «команде .Net». Иногда разработчики программного обеспечения ДЕЙСТВИТЕЛЬНО знают лучше всех?

2
ответ дан 8 December 2019 в 03:02
поделиться
Другие вопросы по тегам:

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