Сопрограмма по сравнению с продолжением по сравнению с генератором

Похоже, вы хотите что-то вроде:

private void foo(string matchText, string sortBy) {
    if (comboBox1.Text == matchText)
    {
        string dgvconn = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\n0740572\Projects\CW\CW\bin\Debug\Database1.mdf;Integrated Security=True";
        string sql = "select * from Records where UserID = @userID Order By " + sortBy;
        SqlConnection connection = new SqlConnection(dgvconn);
        SqlDataAdapter dataadapter = new SqlDataAdapter(sql, connection);
        dataadapter.SelectCommand.Parameters.AddWithValue("@userID", currentUserID);
        DataSet ds = new DataSet();
        connection.Open();
        dataadapter.Fill(ds, "Records");
        connection.Close();
        recordsDataGridView.DataSource = ds;
        recordsDataGridView.DataMember = "Records";
    }     
}//foo

//Call the method
foo("Most recent first", "Date DESC");
foo("Most recent last", "Date");
foo("By Username", "User");
138
задан Benson 19 January 2010 в 21:18
поделиться

2 ответа

Я запущу с генераторов, видя, поскольку они - самый простой случай. Как @zvolkov упомянутый, они - функции/объекты, которые можно неоднократно называть без возврата, но при вызове возвратится (приводят) к значению и затем приостанавливают их выполнение. Когда их назовут снова, они запустят от того, где они в последний раз приостановленное выполнение и делают свою вещь снова.

Генератор является по существу сокращением вниз (асимметричная) сопрограмма. Различие между сопрограммой и генератором - то, что сопрограмма может принять аргументы после того, как это первоначально назвали, тогда как генератор не может.

Немного трудно придумать тривиальный пример того, где Вы использовали бы сопрограммы, но здесь являетесь моей лучшей попыткой. Возьмите это (составило) код Python как пример.

def my_coroutine_body(*args):
    while True:
        # Do some funky stuff
        *args = yield value_im_returning
        # Do some more funky stuff

my_coro = make_coroutine(my_coroutine_body)

x = 0
while True:
   # The coroutine does some funky stuff to x, and returns a new value.
   x = my_coro(x)
   print x

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

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

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

Скажите, что Python назвали функцию callcc(), и эта функция взяла два аргумента, при этом первой была функция и второе, являющееся списком аргументов для вызова ее с. Единственное ограничение на ту функцию было бы то, что последний аргумент это, взятия будут функцией (который будет нашим текущим продолжением).

def foo(x, y, cc):
   cc(max(x, y))

biggest = callcc(foo, [23, 42])
print biggest

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

Результат всего этого состоял бы в том, что наш гипотетический вариант Python распечатает '42'.

Я надеюсь, что это помогает, и я уверен, что мое объяснение может быть изменено к лучшему вполне немного!

121
ответ дан 23 November 2019 в 23:29
поделиться

Сопрограмма является одной из нескольких процедур, которые сменяются, делая их задание и затем паузу для давания контроля к другим сопрограммам в группе.

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

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

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

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