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

Tak*_* M. 1 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.
}
Run Code Online (Sandbox Code Playgroud)

这是m看起来像:

msg[0] = 10
msg[1] = "string"
msg[2] = 2.224574743
// Etc.
// Assume it's different every time.
Run Code Online (Sandbox Code Playgroud)

因此,当我m.GetString(0)在这个例子中,它抛出一个异常,就像msg[0]a uint而不是a string.这是我用来获取类型的,因为m它不包含GetType而我无法编辑m.

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

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

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

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

Mat*_*son 5

现在我知道这m是一个IEnumerable<object>,我想这可能是你最好的选择:

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

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

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


[我之前的答案在我知道之前的类型m]

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

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

if (m.TryGetString(i, out s)) 
    // Process s (need to check for null!) 
Run Code Online (Sandbox Code Playgroud)

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

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

(3)或者,您可以通过类似的方式公开项目GetObject(int index),然后做像Iiya建议的那样:

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

 if (s != null) 
     // Process s 
Run Code Online (Sandbox Code Playgroud)

我认为(1)或(3)是最好的,尽管我们可以提出更好的解决方案,如果我们有更多的信息m.