C ++ / CLI良好的编码实践,索引属性if-check或try..catch?

时间:2011-02-09 11:14:51

标签: .net c++-cli

一个相当简短的问题。

让我们使用这段代码:

public ref class Foo
{
private:
    System::Collections::Generic::Dictionary<System::String ^,System::String ^> ^ aDictionary;

public:

    property System::String ^ SomeIndexedProperty[System::String ^]
    {
    public: System::String ^ get(System::String ^ index)
            {
                return aDictionary[index];
            }
    }

public:
    Foo(void)
    {
        aDictionary = gcnew System::Collections::Generic::Dictionary<System::String ^,System::String ^>();
    }
};

用if语句(if( aDictionary->ContainsKey(index) ))包围/预先检查返回会不会更好?或者用try..catch块包围return语句会更好吗?

在两种情况下,当失败时返回nullptr。

速度并非真正的问题。但只是一般性的“这样做更好”就足够了。

2 个答案:

答案 0 :(得分:2)

我坚信,如果您合理地允许合法条件,您不应该发现异常来检测它。换句话说,使用if语句。这类似于让数组上的所有循环都运行,直到你得到ArrayIndexOfBoundsException并尝试将其捕获为遗忘。

在相关的说明中,属性可能有意义抛出KeyNotFoundException而不是返回null。调用者可能会使用此null并尝试取消引用它,这会转移焦点并使查找错误变得更加困难。

答案 1 :(得分:1)

Givent你所描述的情况,我认为这仅取决于你的偏好。 无论如何,当失败的条件是确定性的,你可以预料到它时,它总是一个更好的解决方案,不使用try..catch块,只留下非确定性和不可预测的错误。

所有反对异常的参数而不是“if”块,只是关于性能(速度,内存,堆栈,ecc ......)并且是有效的。实际上,当你需要一个完全无异常的方法,并且不关心null返回值的原因时,只需将你的5行try..catch块,并忘掉它! ;)