Каково различие между Преобразованием. ToInt32 и (интервал)?

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

забор/барьер памяти А является классом инструкций, что среднее чтение-записи памяти происходит в порядке, который Вы ожидаете. Например, 'весь забор' означает все чтение-записи, прежде чем забор будет фиксироваться перед теми после забора.

заборы памяти Примечания являются аппаратным понятием. На высокоуровневых языках мы привыкли иметь дело со взаимными исключениями и семафорами - они могут быть реализованы с помощью заборов памяти на низком уровне, и конкретный вид использования барьеров памяти не необходимы. Использование барьеров памяти требует тщательного исследования аппаратной архитектуры и чаще всего находимый в драйверах устройств, чем код приложения.

переупорядочение ЦП отличается от оптимизаций компилятора - хотя артефакты могут быть подобными. Необходимо принять отдельные меры для остановки компилятора, переупорядочивающего инструкции, если это может вызвать нежелательное поведение (например, использование энергозависимого ключевого слова в C).

52
задан A876 19 July 2017 в 14:13
поделиться

8 ответов

(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) ). Таким образом, результат не только по реализации, но и численно не то же самое.

66
ответ дан 7 November 2019 в 09:20
поделиться

Цитата из этой статьи Эрика Липперта :

Приведение означает две противоречивые вещи: «проверьте, действительно ли этот объект относится к этому типу, бросьте, если он not "и" этот объект не принадлежит данному типу; найдите мне эквивалентное значение, которое принадлежит данному типу ".

Итак, то, что вы пытались сделать в 1.), - это утверждение, что да, String является Int. Но это утверждение не выполняется, поскольку String не является int.

Причина 2.) успешна в том, что Convert.ToInt32 () анализирует строку и возвращает int. Он все равно может дать сбой, например:

Convert.ToInt32("Hello");

приведет к исключению аргумента.

Подводя итог, преобразование из String в Int - это проблема структуры, а не что-то неявное в системе типов .Net.

5
ответ дан 7 November 2019 в 09:20
поделиться

Вы говорите об операции преобразования C # по сравнению с утилитами преобразования .NET

  • C # Language-level casting использует круглые скобки, например (int), и поддержку преобразования для он ограничен, полагаясь на неявную совместимость между типами или явно определенные инструкции разработчиком с помощью операторов преобразования .
  • Многие методы преобразования существуют в .NET Framework, например System.Convert , чтобы разрешить преобразование между одними и теми же или разными типами данных.

(Приведение) синтаксис работает с числовыми типами данных, а также с «совместимыми» типами данных. Совместимость означает типы данных, для которых существует связь, установленная посредством наследования (т. Е. Базовые / производные классы) или посредством реализации (т. Е. Интерфейсы).

Приведение также может работать между разными типами данных, для которых определены операторы преобразования .

Класс System.Convert , с другой стороны, является одним из многих доступных механизмов преобразования. в общем смысле; он содержит логику для преобразования между разрозненными, известными типами данных, которые могут быть логически изменены из одной формы в другую.

Преобразование даже охватывает некоторые из тех же оснований, что и приведение, позволяя преобразование между схожими типами данных.


Помните, что В языке C # есть свои собственные способы выполнения некоторых задач.
И лежащая в основе .NET Framework работает по-своему, помимо любого языка программирования.
(Иногда они пересекаются в своих намерениях.)

Думайте о приведении типов как о функции уровня языка C #, которая более ограничена по своей природе, а о преобразовании через класс System.Convert как о одном из многих доступных механизмов в платформе .NET для преобразования значения между разными видами.

4
ответ дан 7 November 2019 в 09:20
поделиться

Невозможно преобразовать строку в тип int посредством явного преобразования. Он должен быть преобразован с использованием int.Parse .

Convert.ToInt32 в основном является оболочкой для этого метода:

public static int ToInt32(string value)
{
    if (value == null)
    {
        return 0;
    }
    return int.Parse(value, CultureInfo.CurrentCulture);
}
4
ответ дан 7 November 2019 в 09:20
поделиться

В .NET нет преобразования по умолчанию из строки в int. Для этого вы можете использовать int.Parse () или int.TryParse (). Или, как вы это сделали, вы можете использовать Convert.ToInt32 ().

Однако, в вашем примере, зачем вообще выполнять ToString (), а затем преобразовывать его обратно в int? Вы можете просто сохранить int в Session и получить его следующим образом:

int i = Session["name1"];
1
ответ дан 7 November 2019 в 09:20
поделиться

Convert.ToInt32

    return int.Parse(value, CultureInfo.CurrentCulture);

, но (int) - это приведение типа, so (int) "2" не будет работать, так как вы не можете преобразовать строку в int. но вы можете разобрать его, как Convert.ToInt32 do

0
ответ дан 7 November 2019 в 09:20
поделиться

1) C # является типобезопасным языком и не позволяет присваивать строку номеру

2) второй случай анализирует строку для новой переменной. В вашем случае, если сеанс является сеансом ASP.NET, вам не нужно хранить там строку и преобразовывать ее обратно при получении

int iVal = 5;
Session[Name1] = 5;
int iVal1 = (int)Session[Name1];
1
ответ дан 7 November 2019 в 09:20
поделиться

Разница в том, что первый фрагмент - это приведение, а второй - преобразование. Хотя, я думаю, что, возможно, ошибка компилятора вносит здесь больше путаницы из-за формулировки. Возможно, было бы лучше, если бы было сказано: «Невозможно преобразовать тип 'string' в 'int'.

0
ответ дан 7 November 2019 в 09:20
поделиться
Другие вопросы по тегам:

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