Что такое безопасный тип в .net? - программирование
Подтвердить что ты не робот

Что такое безопасный тип в .net?

Что такое безопасный тип?

Что это значит и почему это важно?

4b9b3361

Ответ 1

Если вы спрашиваете, что означает понятие "безопасный тип" в целом, это характеристика кода, которая позволяет разработчику быть уверенным, что значение или объект будут обладать определенными свойствами (то есть быть определенного типа), чтобы он/она мог использовать его определенным образом, не опасаясь неожиданного или undefined поведения.

Например, в С# можно сказать, что класс ArrayList не является безопасным для типов, поскольку он может хранить любой объект, что означает, что вы можете сделать что-то вроде следующего:

var integers = new ArrayList();
integers.Add(1);
integers.Add(2);
integers.Add("3");

for (int i = 0; i < integers.Count; ++i) {
    int integer = (int)integers[i];
    // do something
}

Вышеприведенное будет компилироваться, потому что значение "3", даже если оно является строкой, а не целой, может быть юридически добавлено к ArrayList, поскольку String выводит (например, Int32) из Object. Однако при попытке установить integer на (int)integers[2] он будет бросать InvalidCastException, потому что String нельзя отнести к Int32.

С другой стороны, класс List<T> безопасен по типу по совершенно противоположной причине, т.е. код выше не, если integers был List<int>. Любое значение, которое вы получаете от разработчика в безопасном типе List<int>, может быть определенным - это int (или любой другой T для любого общего List<T>); и вы можете быть уверены, что сможете выполнять такие операции, как кастинг на int (очевидно) или, скажем, long.

Ответ 2

C - Вы объявляете int, передаете его в char и получаете доступ к памяти за пределами границы

int i = 10;
char *s = (char*)i;
print(*(s+10));

С# - Типы безопасны

int i = 10;
char *s //This is invalid unless you are using unsafe context. 

Указатели напрямую не поддерживаются .NET.

Ответ 3

Тип-безопасный код обеспечивает доступ только к памяти, разрешено доступ. Например, безопасный код не может читать значения из другого объектов. Он обращается к типы только в четко определенных, допустимых пути.

Во время компиляции точно в срок (JIT) дополнительный процесс проверки анализирует метаданные и Microsoft промежуточный язык (MSIL) метод, который должен быть скомпилирован JIT в native машинный код, чтобы убедиться, что они безопасный тип. Этот процесс пропускается, если код имеет разрешение на обход проверка

Хотя проверка безопасности типов не является обязательным для запуска управляемого кода, тип безопасности играет решающую роль в изоляция и безопасность сборки правоприменение. Когда код безопасен по типу, общий язык выполнения может полностью изолировать сборки от друг друга. Эта изоляция помогает убедитесь, что сборки не могут отрицательно влияют друг на друга, и это повышает надежность приложения.

Подробнее см. ссылка msdn

Хорошая статья, объясняющая это здесь

Ответ 4

Вы имели в виду тип-безопасный в частности или тип-безопасность в целом?

Я не согласен с принятым ответом: ArrayList безопасен по типу (не безопасен по типу и не относится к типу): fooobar.com/questions/115871/...

Richter - CLR через С#, 4-е издание (стр. 93):

Тип-безопасность является основной особенностью CLR. Вы всегда можете обнаружить объектного типа, вызвав невиртуальный метод GetType System.Object.

Например, класс Hero не может переопределить метод GetType, чтобы стать типом SuperHero.

Эта функция System.Object позволяет CLR проверять возможность создания объектов во время выполнения. Например:

internal class Employee { ... }

public sealed class Program 
{

    public static Main() 
    {
        DateTime dt = new DateTime(2016, 1, 1);
        PromoteEmployee(newYears);
    }

    public static PromoteEmployee(Object o)
    {
        Employee e = (Employee)o; //InvalidCastException, runtime error
    }
}

Приведение типа DateTime к типу Employee является примером небезопасной попытки создания.

Ответ 5

Введена безопасность типа в .NET, чтобы объекты одного типа не заглядывали в память, назначенную для другого объекта.

Например, и подробное обсуждение перейдите по этой ссылке

Ответ 6

Я не согласен с некоторыми ответами здесь. С# имеет несколько уровней безопасности.

EDIT: Тип безопасности имеет два уровня значения (если мы вообще обсуждаем языки программирования, как в этом потоке)

Один из них - это тип времени скомпилированного типа, рядом с рефакторингом и т.д., опечатки улов компилятора, ошибочное присвоение значений неправильным переменным (свойствам), т.е. строка для переменной int. Типичный код С# является безопасным по типу, известным способом отключения этой функции является ключевое слово dynamic или не общие контейнеры, такие ошибки, как указано выше, задерживаются во время выполнения. Пример: не-взломать код C/С++ (обычно) безопасен во время компиляции. Я думаю, что возможно писать (взломать) кастинг в С#, которые скрывают конфликты типов.

Следующий уровень - это тип безопасности во время выполнения, С# в целом безопасен (без небезопасных разделов). Даже динамическое значение проверяется во время выполнения. Напротив: C/С++ не безопасен во время выполнения. Если компилятор принимает код, нечетное присвоение не проверяется во время выполнения, обеспечивая странный/странный/системный уровень или поздние ошибки, характерные для языка C.

Немногие из ответчиков в этой теме смешивают другие области, где С# безопасен (безопасность памяти, безопасность диапазона, нулевой указатель и т.д.). Чтобы быть строгим, это разные виды безопасности.

Теория: https://en.wikipedia.org/wiki/Type_safety