关键字"unsafe" - 放在方法或代码块之前?

3

在方法前或代码块前使用关键字unsafe有什么区别吗?

如果我有少量的不安全代码和数百行安全代码,那么在方法之前使用它是否会出错?


2
如果你在一个方法中有数百行代码,无论你的修饰符说什么,我都不会认为它是“安全”的。 - jeffora
1
我知道,那只是一个例子,找不到更好的词来描述它。 - apocalypse
3个回答

6

这是一个主观的答案,但我会在方法级别上使用unsafe,像这样:

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

当你在函数体内使用unsafe时,它会被隐藏起来,很难找到,而像这样的东西应该非常明显。每个人都会阅读函数声明,但并不是每个人都会进入函数体,除非他们需要。在声明中使用unsafe可以使其更加突出。

我像你一样做,但是其他不安全的操作在不安全模式下是否也能正常工作? - apocalypse
1
@zgnilec,很抱歉,我不确定我正确理解了你的问题。你是指“在不安全模式下,其他安全操作是否仍然有效”吗?如果是这样,答案是肯定的:所有“安全”的操作都像以前一样工作。unsafe只是让你能够声明和使用指向各种.NET类型的指针。混合使用安全和不安全代码是可以的,只要你小心不要破坏内存并清理你使用的非托管资源即可。 - xxbbcc

2
回答你的第一个问题:请参考C# 4.0规范中的第18.1章节。
引入不安全上下文需要在类型或成员的声明中包含一个unsafe修饰符,或使用unsafe语句: • 类、结构、接口或委托的声明可以包含unsafe修饰符,在这种情况下,该类型声明的整个文本范围(包括类、结构或接口的主体)被视为不安全上下文。 • 字段、方法、属性、事件、索引器、运算符、实例构造函数、析构函数或静态构造函数的声明可以包含unsafe修饰符,在这种情况下,该成员声明的整个文本范围被视为不安全上下文。 • unsafe语句允许在块内使用不安全上下文。与其关联的整个文本范围被视为不安全上下文。
第二个问题:根据第一个问题的结论,当然是没错的。但我更喜欢用unsafe语句来包装一些不安全的代码行,因为这样更清晰易懂,更容易找到。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接