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>
现在我知道这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.