Для увеличения производительности современные центральные процессоры часто выполняют инструкции не в порядке для создания максимального использования доступного кремния (включая чтение-записи памяти). Поскольку аппаратные средства осуществляют целостность инструкций, Вы никогда не замечаете это в единственном потоке выполнения. Однако для нескольких потоков или сред с энергозависимой памятью (ввод-вывод с отображенной памятью, например) это может привести к непредсказуемому поведению.
забор/барьер памяти А является классом инструкций, что среднее чтение-записи памяти происходит в порядке, который Вы ожидаете. Например, 'весь забор' означает все чтение-записи, прежде чем забор будет фиксироваться перед теми после забора.
заборы памяти Примечания являются аппаратным понятием. На высокоуровневых языках мы привыкли иметь дело со взаимными исключениями и семафорами - они могут быть реализованы с помощью заборов памяти на низком уровне, и конкретный вид использования барьеров памяти не необходимы. Использование барьеров памяти требует тщательного исследования аппаратной архитектуры и чаще всего находимый в драйверах устройств, чем код приложения.
переупорядочение ЦП отличается от оптимизаций компилятора - хотя артефакты могут быть подобными. Необходимо принять отдельные меры для остановки компилятора, переупорядочивающего инструкции, если это может вызвать нежелательное поведение (например, использование энергозависимого ключевого слова в C).
(int) foo
- это просто приведение к типу Int32
( int
в C #). Это встроено в среду CLR и требует, чтобы foo
была числовой переменной (например, float
, long
и т. Д.). В этом смысле она очень похожа на приведение в C.
Convert.ToInt32
спроектировано как обычная функция преобразования. Это гораздо больше, чем просто кастинг; а именно, он может преобразовать из любого примитивного типа в int
(в первую очередь, синтаксический анализ строки
). Вы можете увидеть полный список перегрузок для этого метода здесь, в MSDN .
И как Стефан Штайгер упоминает в комментарии :
Также, обратите внимание, что на числовом уровне
(int) foo
усекаетfoo
(ifoo = Math.Floor (foo)
), аConvert.ToInt32 (foo)
использует округление от половины до четного (округляет x,5 до ближайшего ЧЕТНОГО целого числа, что означаетifoo = Math.Round (foo)
). Таким образом, результат не только по реализации, но и численно не то же самое.
Цитата из этой статьи Эрика Липперта :
Приведение означает две противоречивые вещи: «проверьте, действительно ли этот объект относится к этому типу, бросьте, если он not "и" этот объект не принадлежит данному типу; найдите мне эквивалентное значение, которое принадлежит данному типу ".
Итак, то, что вы пытались сделать в 1.), - это утверждение, что да, String является Int. Но это утверждение не выполняется, поскольку String не является int.
Причина 2.) успешна в том, что Convert.ToInt32 () анализирует строку и возвращает int. Он все равно может дать сбой, например:
Convert.ToInt32("Hello");
приведет к исключению аргумента.
Подводя итог, преобразование из String в Int - это проблема структуры, а не что-то неявное в системе типов .Net.
Вы говорите об операции преобразования C # по сравнению с утилитами преобразования .NET
(Приведение) синтаксис работает с числовыми типами данных, а также с «совместимыми» типами данных. Совместимость означает типы данных, для которых существует связь, установленная посредством наследования (т. Е. Базовые / производные классы) или посредством реализации (т. Е. Интерфейсы).
Приведение также может работать между разными типами данных, для которых определены операторы преобразования .
Класс System.Convert , с другой стороны, является одним из многих доступных механизмов преобразования. в общем смысле; он содержит логику для преобразования между разрозненными, известными типами данных, которые могут быть логически изменены из одной формы в другую.
Преобразование даже охватывает некоторые из тех же оснований, что и приведение, позволяя преобразование между схожими типами данных.
Помните, что В языке C # есть свои собственные способы выполнения некоторых задач.
И лежащая в основе .NET Framework работает по-своему, помимо любого языка программирования.
(Иногда они пересекаются в своих намерениях.)
Думайте о приведении типов как о функции уровня языка C #, которая более ограничена по своей природе, а о преобразовании через класс System.Convert как о одном из многих доступных механизмов в платформе .NET для преобразования значения между разными видами.
Невозможно преобразовать строку в тип int посредством явного преобразования. Он должен быть преобразован с использованием int.Parse
.
Convert.ToInt32 в основном является оболочкой для этого метода:
public static int ToInt32(string value)
{
if (value == null)
{
return 0;
}
return int.Parse(value, CultureInfo.CurrentCulture);
}
В .NET нет преобразования по умолчанию из строки в int. Для этого вы можете использовать int.Parse () или int.TryParse (). Или, как вы это сделали, вы можете использовать Convert.ToInt32 ().
Однако, в вашем примере, зачем вообще выполнять ToString (), а затем преобразовывать его обратно в int? Вы можете просто сохранить int в Session и получить его следующим образом:
int i = Session["name1"];
Convert.ToInt32
return int.Parse(value, CultureInfo.CurrentCulture);
, но (int) - это приведение типа, so (int) "2" не будет работать, так как вы не можете преобразовать строку в int. но вы можете разобрать его, как Convert.ToInt32 do
1) C # является типобезопасным языком и не позволяет присваивать строку номеру
2) второй случай анализирует строку для новой переменной. В вашем случае, если сеанс является сеансом ASP.NET, вам не нужно хранить там строку и преобразовывать ее обратно при получении
int iVal = 5;
Session[Name1] = 5;
int iVal1 = (int)Session[Name1];
Разница в том, что первый фрагмент - это приведение, а второй - преобразование. Хотя, я думаю, что, возможно, ошибка компилятора вносит здесь больше путаницы из-за формулировки. Возможно, было бы лучше, если бы было сказано: «Невозможно преобразовать тип 'string' в 'int'.