增加这个try-catch的可读性?

时间:2013-05-29 14:56:48

标签: c# optimization code-readability

我想知道是否有更美观/更容易阅读的方式来编写以下内容:

for (int i = 0; i < 100; i++)
{ 
    // If m.GetString(i) throws an exception, continue.
    // Otherwise, do stuff.       
    try
    {
        string s = m.GetString(i);
        continue;
    }           
    catch (InvalidCastException) 
    { 
    }

    // do stuff with the message that you know is not a string.
}

以下是m的样子:

msg[0] = 10
msg[1] = "string"
msg[2] = 2.224574743
// Etc.
// Assume it's different every time.

因此,当我在此示例中执行m.GetString(0)时,它会抛出异常,因为msg[0]uint而不是string。这是我用来获取类型的内容,因为m不包含GetType而我无法编辑m。

m是库中的类Message的实例,我无法编辑。

然而,尽管这样做很好,但是为了获得类型,有意创建异常(即使它在try-catch中)也感觉效率低(当然也不是读者友好的)。

有更好的方式还是我坚持这个?

编辑好吧,我对Message课程进行了更多研究(我应该先做,我的道歉)。这是IEnumerable<object>

2 个答案:

答案 0 :(得分:5)

既然我知道mIEnumerable<object>,我认为这可能是您最好的选择:

foreach (string s in m.OfType<string>())
{
    // Process s, which can't be null.
}

很好很简单,它似乎可以处理你想要的所有逻辑,即它只处理序列中的字符串项,并且它将忽略其他类型的所有对象。

然而,正如Servy所指出的,这不会处理列表中的空值,因为null根本没有任何类型。


[我之前的答案之前我知道m]

的类型

我认为你可以采取以下三种方法之一:

(1)将bool TryGetString(int index, out string)方法添加到示例中的m类型,然后执行

if (m.TryGetString(i, out s)) 
    // Process s (need to check for null!) 

(2)添加bool IsString(int index)方法并在调用GetString()之前调用它。

if (m.IsString(i)) 
{
    s = m.GetString(i); 
    // Process s (need to check for null!) 

(3)或者,您可以通过类似GetObject(int index)的内容公开该项目,然后执行像Iiya建议的那样:

 string s = m.GetObject(i) as string; 

 if (s != null) 
     // Process s 

我认为(1)或(3)是最好的,尽管如果我们有关于m的更多信息,我们可以建议更好的解决方案。

答案 1 :(得分:2)

如果您只想处理非强类型数据序列中的字符串,请使用下一个代码:

for (int i = 0; i < 100; i++)
{ 
    string s = m[i] as string;

    if(s != null)
    {

    }
}