acc*_*777 4 .net c# if-statement
我目前正在开发.NET 4.7.1应用程序。我有一个If语句来检查数据类型并相应地调用处理程序方法。
我当前的If语句如下所示:
// object msg = MyHelper.Deserialize(xmlString);
if (msg is Tomato) Handle_Tomato((Tomato)msg);
if (msg is Apple) Handle_Apple((Apple)msg);
if (msg is Banana) Handle_Banana((Banana)msg);
if (msg is Orange) Handle_Orange((Orange)msg);
Run Code Online (Sandbox Code Playgroud)
味精基本上是从字符串反序列化的对象。
我想知道,是否有更好的方式编写if语句?
非常感谢你!
正如Sweeper在评论中提到的那样,从C#7.0开始,您可以使用The is type模式表达式
if (msg is Tomato tomato) Handle_Tomato(tomato);
Run Code Online (Sandbox Code Playgroud)
从C#7.0开始,您还可以将模式匹配与switch语句(类型模式)一起使用
类型模式可以进行简洁的类型评估和转换。与switch语句一起执行模式匹配时,它将测试表达式是否可以转换为指定的类型,如果可以,则将其强制转换为该类型的变量。
switch(msg)
{
case Tomato tomato : Handle_Tomato(tomato); break;
case Apple apple : Handle_Apple(apple); break;
...
}
Run Code Online (Sandbox Code Playgroud)
我强烈建议不要做这样的检查。如果将来有几十种不同的类型怎么办?您的 if 语句会增加并且无法维护。如果类型发生变化怎么办?您还必须更改所有 if 语句。
您可以通过使用接口来解决此问题。你已经有课程了。
interface IHandler
{
void Execute();
}
Run Code Online (Sandbox Code Playgroud)
class Orange : IHandler
{
public void Execute()
{
// do your orange stuff
}
}
Run Code Online (Sandbox Code Playgroud)
class Tomato : IHandler
{
public void Execute()
{
// do your tomato stuff
}
}
Run Code Online (Sandbox Code Playgroud)
可以这样称呼。
if (msg is IHandler) ((IHandler)msg).Execute();
Run Code Online (Sandbox Code Playgroud)