Здравствуйте, Sharov, Вы писали:
R>>Все это справедливо только, если работаешь с локальной переменной или аргументом метода. В этом случае, джит уверен, что никто не изменит ссылку из вне метода, в остальном случае — гарантий нет, и джит вставит проверки на выход за границы массива
S>А как jit убедиться, что никто не изменит аргумент в вызывающем коде? Всяческая многопоточность и т.д.
Длина массива не может меняться. С вариантом, когда массив локальный, ведь тоже не всё здорово:
void Foo()
{
var a = new int[10];
Bar(a);
for (int i = 0; i < a.Length; i++)
{
...
}
}
Внутри Bar() ссылка на массив могла где-то дополнительно сохраниться и успеть прочитаться другими потоками, которые могут начать менять содержимое массива одновременно с циклом внутри Foo().