Подставляемые функции в C#?

Насколько я понимаю, если вы используете webbrowser.open(), невозможно избежать получения новой вкладки каждый раз; с помощью веб-браузера можно убедиться, что он открывается в том же окне браузера, но не на той же вкладке. Чтобы настроить таргетинг на одно и то же окно, вам необходимо установить new=0, например:

webbrowser.open('http://Sonoff_IP/cm?cmnd=POWER%20TOGGLE', 0);

. Однако, если вы можете открыть ссылку, используя библиотеку selenium, это возможно.

Прочитайте документы для selenium и webdriver здесь: https://selenium-python.readthedocs.io/api.html

Основная проблема с Делая это с помощью Selenium, я думаю, вы теряете возможность нацеливаться на веб-браузер пользователя по умолчанию, и по умолчанию Selenium, по-видимому, использует Firefox по умолчанию, поскольку облегченный порт Firefox включен в саму библиотеку Selenium.

Пример открытия ссылки в Selenium будет выглядеть следующим образом:

from selenium import webdriver

link1="https://www.google.com"
link2="https://www.youtube.com/"
driver=webdriver.Firefox()
driver.get(link1)
driver.get(link2)

Selenium поддерживает множество различных браузеров, так что если вы можете получить веб-браузер пользователя по умолчанию из webbrowser модуль или каким-либо другим способом, вы сможете использовать эту информацию, чтобы открыть URL-адреса на той же вкладке с браузером пользователя по умолчанию.

Надеюсь, это поможет и удачи! :)

264
задан Community 23 May 2017 в 02:10
поделиться

10 ответов

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

static void Main(string[] args)
{
    int a = 1;

    Action inline = () => a++;
    inline();
    //here a = 2
}
-7
ответ дан Yordan Pavlov 23 November 2019 в 02:28
поделиться

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

-7
ответ дан cordellcp3 23 November 2019 в 02:28
поделиться

Нет, в C# нет такой конструкции, но JIT-компилятор.NET мог решить сделать, подставляемая функция обращается ко времени JIT. Но я на самом деле не знаю, делает ли это действительно такую оптимизацию.
(я думаю, что это должно:-))

0
ответ дан Dinah 23 November 2019 в 02:28
поделиться

У Cody есть он правильный, но я хочу обеспечить пример того, какова подставляемая функция.

Скажем, у Вас есть этот код:

private void OutputItem(string x)
{
    Console.WriteLine(x);

    //maybe encapsulate additional logic to decide 
    // whether to also write the message to Trace or a log file
}

public IList<string> BuildListAndOutput(IEnumerable<string> x)
{  // let's pretend IEnumerable<T>.ToList() doesn't exist for the moment
    IList<string> result = new List<string>();

    foreach(string y in x)
    {
        result.Add(y);
        OutputItem(y);
    }
    return result;
}

<забастовка> компилятор Своевременный оптимизатор мог принять решение изменить код, чтобы неоднократно стараться не заказывать телефонный разговор с OutputItem () на стеке, так, чтобы это было, как будто Вы записали код как это вместо этого:

public IList<string> BuildListAndOutput(IEnumerable<string> x)
{
    IList<string> result = new List<string>();

    foreach(string y in x)
    {
        result.Add(y);

        // full OutputItem() implementation is placed here
        Console.WriteLine(y);   
    }

    return result;
}

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

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

20
ответ дан Joel Coehoorn 23 November 2019 в 02:28
поделиться

Вы имеете в виду подставляемые функции в смысле C++? В котором содержание нормальной функции автоматически копируется встроенное в callsite? Эффект конца, являющийся, что никакого вызова функции на самом деле не происходит при вызывании функции.

Пример:

inline int Add(int left, int right) { return left + right; }

Раз так тогда не, нет никакого эквивалента C# этому.

Или Вы имеете в виду функции, которые объявляются в другой функции? Раз так тогда да, C# поддерживает это с помощью анонимных методов или лямбда-выражений.

Пример:

static void Example() {
  Func<int,int,int> add = (x,y) => x + y;
  var result = add(4,6);  // 10
}
21
ответ дан JaredPar 23 November 2019 в 02:28
поделиться

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

, С другой стороны, функции лямбды являются просто семантическим понятием. Нет никакого требования к тому, как они должны быть реализованы или выполнены, пока они выполняют набором поведения до конца в спецификации языка. Они могут быть встроены, если JIT-компилятор чувствует себя подобно ему, или не, если это не делает.

в C# нет никакого встроенного ключевого слова, потому что это - оптимизация, которую можно обычно оставлять компилятору, особенно на языках JIT'ed. JIT-компилятор имеет доступ к статистике во время выполнения, которая позволяет ему решить, что встроить намного более эффективно, чем Вы можете при записи кода. Функция будет встроена, если компилятор решит, и нет ничего, что можно делать с этим так или иначе.:)

33
ответ дан jalf 23 November 2019 в 02:28
поделиться

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

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

Редактирование: Для разъяснения существует две основных причины, они должны использоваться экономно:

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

, Лучше оставлять вещи в покое и позволять компилятору сделать свою работу, затем представить и выяснить, если встроенный лучшее решение для Вас. Конечно, некоторые вещи просто имеют смысл быть встроенным (математические операторы особенно), но разрешение дескриптору компилятора это обычно - лучшая практика.

85
ответ дан Cody Brocious 23 November 2019 в 02:28
поделиться

Да Точно, единственное различие является фактом, это возвращает значение.

Упрощение (не использующий выражения):

List<T>.ForEach Принимает меры, они не ожидают результат возврата.

Так Action<T> делегат был бы достаточен.. скажите:

List<T>.ForEach(param => Console.WriteLine(param));

совпадает с высказыванием:

List<T>.ForEach(delegate(T param) { Console.WriteLine(param); });

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

, Где как [1 116]

List<T>.Where Берет функцию, ожидая результат.

Так Function<T, bool> ожидался бы:

List<T>.Where(param => param.Value == SomeExpectedComparison);

, который совпадает с:

List<T>.Where(delegate(T param) { return param.Value == SomeExpectedComparison; });

можно также объявить, что эти методы встраивают и присваивают им IE переменных:

Action myAction = () => Console.WriteLine("I'm doing something Nifty!");

myAction();

или

Function<object, string> myFunction = theObject => theObject.ToString();

string myString = myFunction(someObject);

я надеюсь, что это помогает.

6
ответ дан Quintin Robinson 23 November 2019 в 02:28
поделиться

Обновление: PER Ответ Конрада.Кружинского , следующее верно для версий .NET до и в том числе 4.0.

Вы можете использовать методимPlattribute Class , чтобы предотвратить метод от включения ...

[MethodImpl(MethodImplOptions.NoInlining)]
void SomeMethod()
{
    // ...
}

... Но нет способа сделать обратное и Сила Это должно быть установлено.

52
ответ дан 23 November 2019 в 02:28
поделиться

Бывают случаи, когда я действительно хочу принудительно встроить код.

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

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

2
ответ дан 23 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

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