Использовать XMLHttpRequest .
Простой запрос GET
httpRequest = new XMLHttpRequest()
httpRequest.open('GET', 'http://www.example.org/some.file')
httpRequest.send()
Простой запрос POST
httpRequest = new XMLHttpRequest()
httpRequest.open('POST', 'http://www.example.org/some/endpoint')
httpRequest.send('some data')
Мы можем указать, что запрос должен быть асинхронным (true), по умолчанию или синхронным (false) с необязательным третьим аргументом.
// Make a synchronous GET request
httpRequest.open('GET', 'http://www.example.org/some.file', false)
Мы можем установить заголовки перед вызовом httpRequest.send()
httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
Мы можем обработать ответ, установив httpRequest.onreadystatechange
в функцию перед вызовом httpRequest.send()
httpRequest.onreadystatechange = function(){
// Process the server response here.
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
alert(httpRequest.responseText);
} else {
alert('There was a problem with the request.');
}
}
}
Я думаю, что вы обнаружили небольшую ошибку в оптимизаторе. Там есть всевозможный специальный код для массивов. Спасибо, что обратили на него мое внимание.
Это приблизительное предположение, но я думаю, что это связано с отношением массива к его универсальному IEnumerable.
В .NET Framework версии 2.0 класс Array реализует System.Collections.Generic.IList, System.Collections.Generic.ICollection, {{1 }} и общие интерфейсы System.Collections.Generic.IEnumerable . Реализации предоставляются массивам во время выполнения и поэтому не видимы для инструментов сборки документации . В результате общие интерфейсы не отображаются в синтаксисе объявления для класса Array , а также отсутствуют справочные темы для элементов интерфейса, которые доступен только путем преобразования массива в общий тип интерфейса (явные реализации интерфейса). Ключевое , о чем следует помнить при преобразовании массива в один из этих интерфейсов, - это элементы, которые добавляют, вставляют или удаляют элементы, выбрасывают { {1}} NotSupportedException.
См. Статья MSDN .
Неясно, относится ли это к .NET 2.0+, но в этом особом случае было бы совершенно понятно, почему компилятор не может оптимизировать ваше выражение, если оно становится действительным только во время выполнения.
Это не похоже на просто упущенную возможность компилятора подавить приведение типов. Он будет работать, если вы напишете его так:
ICollection<object> col = array as ICollection<object>;
, что предполагает, что он становится слишком консервативным, потому что приведение типов может вызывать исключения. Однако это работает при приведении к неуниверсальной коллекции ICollection. Я пришел к выводу, что они просто не заметили этого.
Здесь работает более серьезная проблема оптимизации: JIT-компилятор не применяет оптимизацию подъема, инвариантную для цикла. Он должен был переписать код следующим образом:
object[] array = new object[1];
ICollection<object> col = (ICollection<object>)array;
for (int i = 0; i < 100000; i++)
{
col.Contains(null);
}
Это стандартная оптимизация, например, в генераторе кода C / C ++. Тем не менее, оптимизатор JIT не может затратить много циклов на анализ, необходимый для обнаружения таких возможных оптимизаций. Радует то, что оптимизированный управляемый код все еще достаточно поддается отладке. И что у программиста на C # все еще есть роль писать высокопроизводительный код.