在C#中,有没有办法在代码中检测当前运行的代码块是以检查还是未检查的模式运行?
例如 - 如果您的库中有一个方法供其他人使用,并且您想要决定是否要溢出您在自定义数据类型上执行的算术运算。
答案 0 :(得分:5)
给定方法是使用已检查还是未经检查的运算符与调用者无关。它在编译时静态知道。没有办法动态检查它,因为没有必要或点,它不能动态改变。
只要您使用所需的已选中/未选中的设置编译库,或者根据需要在代码中使用已选中/未选中的块,那么您的代码就可以了,任何调用方都没有任何方法你的库改变了你正在使用的运算符。
如果希望您的库的使用者能够确定您是使用已检查还是未选中的操作,那么您将需要提供多种方法(一种已检查且一种未经检查),分发项目的两个版本,一个编译为未选中,一个已检查,或沿着这些行。没有办法在运行时更改算术运算符绑定的代码。
答案 1 :(得分:0)
您可以在try
... catch
中运行溢出操作,看看是否有异常,但这可能非常慢。此外,C#语言规范说check / unchecked是方法的本地,而不是在方法之外进行的函数调用。
当然,如果您尝试使用户定义的数字类型的行为类似于内置算术,那么这并不是非常有用。