Почему вы должны использовать Expression < Func < T > > а не Func < T & gt ;?

Я уверен, что вы найдете это полезным: http://jsdo.it/tsmallfield/uint8array .

Перейдите на вкладку javascript. Появится код для преобразования Uint8Array в строку. Автор показывает 2 метода:

  • Первый заключается в создании представления.
  • Второе смещение байтов.

EDIT: report код полноты

var buffer = new ArrayBuffer( res.length ), // res is this.response in your case
    view   = new Uint8Array( buffer ),
    len    = view.length,
    fromCharCode = String.fromCharCode,
    i, s, str;    

/**
 *  1) 8bitの配列に入れて上位ビットけずる
 */
str = "";

for ( i = len; i--; ) {
  view[i] = res[i].charCodeAt(0);
}

for ( i = 0; i < len; ++i ) {
  str += fromCharCode( view[i] );
}    

/**
 *  2) & 0xff で上位ビットけずる
 */
str = "";

for ( i = 0; i < len; ++i ) {
  str += fromCharCode( res[i].charCodeAt(0) & 0xff );
}

877
задан Mehrdad Afshari 27 April 2009 в 14:36
поделиться

3 ответа

Когда вы хотите рассматривать лямбда-выражения как деревья выражений и заглядывать в них, а не выполнять их. Например, LINQ to SQL получает выражение и преобразует его в эквивалентный оператор SQL и передает его на сервер (а не выполняет лямбда-выражения).

Концептуально, Выражение > равно полностью отличается от Func . Func обозначает делегата , который в значительной степени является указателем на метод, а выражение > обозначает древовидную структуру данных для лямбда-выражения. Эта древовидная структура описывает, что делает лямбда-выражение , а не выполняет действительные действия. Он в основном содержит данные о составе выражений, переменные, вызовы методов, ... (например, он содержит такую ​​информацию, как эта лямбда - некоторая константа + некоторый параметр). Вы можете использовать это описание, чтобы преобразовать его в реальный метод (с помощью Expression.Compile ) или выполнить другие действия (например, пример LINQ to SQL). Процедура обработки лямбда-выражений как анонимных методов и деревьев выражений - это просто вещь времени компиляции.

Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }

будет эффективно компилироваться в метод IL, который ничего не получает и возвращает 10.

Expression<Func<int>> myExpression = () => 10;

будет преобразован в структуру данных, которая описывает выражение, которое не получает параметров и возвращает значение 10:

Expression vs Func увеличенное изображение

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

Вы можете использовать это описание, чтобы преобразовать его в реальный метод (с помощью Expression.Compile ) или выполнить другие действия (например, пример LINQ to SQL). Процедура обработки лямбда-выражений как анонимных методов и деревьев выражений - это просто вещь времени компиляции.

Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }

будет эффективно компилироваться в метод IL, который ничего не получает и возвращает 10.

Expression<Func<int>> myExpression = () => 10;

будет преобразован в структуру данных, которая описывает выражение, которое не получает параметров и возвращает значение 10:

Expression vs Func увеличенное изображение

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

Вы можете использовать это описание, чтобы преобразовать его в реальный метод (с помощью Expression.Compile ) или выполнить другие действия (например, пример LINQ to SQL). Процедура обработки лямбда-выражений как анонимных методов и деревьев выражений - это просто вещь времени компиляции.

Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }

будет эффективно компилироваться в метод IL, который ничего не получает и возвращает 10.

Expression<Func<int>> myExpression = () => 10;

будет преобразован в структуру данных, которая описывает выражение, которое не получает параметров и возвращает значение 10:

Expression vs Func увеличенное изображение

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

1096
ответ дан 22 November 2019 в 21:03
поделиться

LINQ - это канонический пример (например, разговор с базой данных), но, по правде говоря, в любое время о выражении , что делать, а не делать это на самом деле. Например, Я использую этот подход в стеке RPC protobuf-net (чтобы избежать генерации кода и т. Д.) - поэтому вы вызываете метод с:

string result = client.Invoke(svc => svc.SomeMethod(arg1, arg2, ...));

Это деконструирует дерево выражений для разрешения SomeMethod (и значение каждого аргумента), выполняет вызов RPC, обновляет любые аргументы ref / out и возвращает результат удаленного вызова. Это возможно только через дерево выражений. Я расскажу об этом подробнее здесь .

Другой пример - это когда вы строите деревья выражений вручную с целью компиляции в лямбду, как это делается с помощью универсального кода . 1131098] обновляет любые ref / out args и возвращает результат удаленного вызова. Это возможно только через дерево выражений. Я расскажу об этом подробнее здесь .

Другой пример - это когда вы строите деревья выражений вручную с целью компиляции в лямбду, как это делается с помощью универсального кода . 1131098] обновляет любые ref / out args и возвращает результат удаленного вызова. Это возможно только через дерево выражений. Я расскажу об этом подробнее здесь .

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

37
ответ дан 22 November 2019 в 21:03
поделиться

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

19
ответ дан 22 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

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