Я уверен, что вы найдете это полезным: 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 );
}
Когда вы хотите рассматривать лямбда-выражения как деревья выражений и заглядывать в них, а не выполнять их. Например, 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.Compile
) или выполнить другие действия (например, пример LINQ to SQL). Процедура обработки лямбда-выражений как анонимных методов и деревьев выражений - это просто вещь времени компиляции.
Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }
будет эффективно компилироваться в метод IL, который ничего не получает и возвращает 10.
Expression<Func<int>> myExpression = () => 10;
будет преобразован в структуру данных, которая описывает выражение, которое не получает параметров и возвращает значение 10:
Хотя они оба выглядят одинаково во время компиляции, сгенерированный компилятором полностью отличается .
Вы можете использовать это описание, чтобы преобразовать его в реальный метод (с помощью Expression.Compile
) или выполнить другие действия (например, пример LINQ to SQL). Процедура обработки лямбда-выражений как анонимных методов и деревьев выражений - это просто вещь времени компиляции.
Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }
будет эффективно компилироваться в метод IL, который ничего не получает и возвращает 10.
Expression<Func<int>> myExpression = () => 10;
будет преобразован в структуру данных, которая описывает выражение, которое не получает параметров и возвращает значение 10:
Хотя они оба выглядят одинаково во время компиляции, сгенерированный компилятором полностью отличается .
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]
Вы бы использовали выражение, когда хотите рассматривать свою функцию как данные, а не как код. Вы можете сделать это, если хотите манипулировать кодом (как данными). В большинстве случаев, если вы не видите необходимости в выражениях, вам, вероятно, не нужно их использовать.