次の方法で共有


Поднимайте вес ногами, а не спиной

В C# можно «lift» (накрывать), «raise» (возбуждать) и «hoist» (вытягивать), и всё это означает разные вещи*.

«Накрыть» оператор означает взять оператор, который действует на не-Nullable типы-значения, и создать на его основе похожий оператор, каторый работает с Nullable типами. (Мы немного противоречим сами себе в деталях употребления термина «lifted», что я описал здесь).

Например, если у вас есть

public static Complex operator +(Complex x, Complex y) { ... }

то мы автоматически генерируем для вас накрывающий оператор, который в основном делает вот что:

public static Complex? operator +(Complex? x, Complex? y)
{
  return (x == null || y == null) ?
(Complex?) null :
(Complex?) (x.Value + y.Value);
}

«Возбуждение» относится к событиям – не к исключениям, которые, конечно же, «бросают». Другой общепринятый термин для возбуждения событий – «fire» (выстрелить). Поскольку имеет смысл стандартизовать либо тот, либо другой вариант, участники комитета по использованию решили, что из терминов «возбуждать» и «выстреливать» они выберут менее воинственно звучащий. Может быть это не слишком умно, но если нужно выбрать что-то одно, то я считаю этот критерий не хуже любого другого.

Наконец, «вытягиванием» (hoisting) мы называем процесс, при котором компилятор порождает поле для того, что выглядит как локальная переменная, потому что она на самом деле – внешняя переменная, захваченная анонимной функцией (или локальная переменная в блоке итератора). Когда у вас есть:

class C
{
  void M()
  {
    int x = 123;
    Func<int, int> f = y=>x+y;
...

то мы переписываем его так, как будто вы написали что-то вроде:

class C
{
  private class Locals
  {
    public int x;
    public int Method(int y) { return this.x + y }
  }
  void M()
  {
    Locals locals = new Locals();
    locals.x = 123;
    Func<int, int> f = locals.Method;
...

Видите, локальная переменная «x» была «вытянута» из места её декларации.

Даже после нескольких лет, проведенных в команде разработки компиляторов, я всё еще неверно употребляю «raise», «lift» и «hoist» в случайных разговорах; то, что они имеют близкие значения в английском языке, но различный смысл в жаргоне – неудачно, но обычно не приводит к слишком большому непониманию.

*******

(*) Эти слова не слишком похожи друг на друга на русском языке; в оригинале они все являются синонимами термина «поднимать», что и обыгрывает автор в заголовке статьи – прим. перев.