c # unsafe - перед методом или блоком кода? - PullRequest
3 голосов
/ 27 февраля 2012

Есть ли какая-либо разница между использованием -unsafe- ключевого слова перед методом или перед блоком кода?

Будет ли неправильно, если я использую -unsafe- ключевое слово перед методом, когда у меня всего несколько строк небезопасного кода и сотнибезопасного кода?

Ответы [ 3 ]

6 голосов
/ 27 февраля 2012

Это субъективный ответ, но я бы использовал unsafe на уровне метода, например:

private unsafe int MyFunc ( ... )
{
    ...
}

Когда вы используете unsafe внутри тела функции, оно скрыто, и его трудно найти, хотя что-то подобное должно быть очень очевидным. Все прочтут объявление функции, но не все войдут в тело функции, если только им это не нужно.

Наличие unsafe в объявлении делает его более заметным.

2 голосов
/ 27 февраля 2012

Чтобы ответить на ваш первый вопрос: см. Главу по спецификации C # 4.0: 18.1

Небезопасные функции C # доступны только в небезопасных контекстах.Небезопасный контекст вводится с помощью включения небезопасного модификатора в объявление типа или члена или с помощью оператора unsafe:

• Объявление класса, структуры, интерфейса или делегата может включать небезопасныймодификатор, в этом случае весь текстовый экстент этого объявления типа (включая тело класса, структуры или интерфейса) считается небезопасным контекстом.

• Объявление поля, метода, свойства, события, индексатора, оператора, конструктора экземпляра, деструктора или статического конструктора может включать небезопасный модификатор, и в этом случае рассматривается весь текстовый экстент этого объявления члена.небезопасный контекст.

• Небезопасный оператор позволяет использовать небезопасный контекст внутри блока.Весь текстовый экстент связанного блока считается небезопасным контекстом.

Второй: конечно, НЕ НЕПРАВИЛЬНО в соответствии с заключением первого вопроса.Но я бы предпочел обернуть несколько строк небезопасных кодов с помощью оператора unsafe, потому что его проще и легче найти.

1 голос
/ 27 февраля 2012

Небезопасный код позволяет вам обращаться к памяти напрямую, и поэтому он может иметь свои плюсы и минусы. В этой статье я прочел несколько вопросов по вашему вопросу: http://www.codeproject.com/Articles/2363/Unsafe-programming-in-C и надеюсь, что это может привести вас в правильном направлении. Удачи!

...