gpt4 book ai didi

c# - 什么更好?枚举还是类型检查?

转载 作者:行者123 更新时间:2023-11-30 13:26:48 26 4
gpt4 key购买 nike

假设我想将一些 xml 解析为强类型类。当我得到 xml 时,我不知道它应该是类型 A 还是类型 B,直到我将其打开并查看。我可以看一下,然后返回一个像这样的枚举:

BaseType x = null;
TypeInfoEnum typeInfo = BaseType.GetTypeInfo(xml);

if(typeInfo == TypeInforEnum.TypeA)
{
x = BaseType.ParseXmlToTypeA(xml);

// do other work on Type A
}

else if(typeInfo == TypeInfoEnum.TypeB)
{
x = BaseType.ParseXmlToTypeB(xml);

// do other work on Type B
}

或者我可以只用一种方法处理解析并检查类型:

BaseType x = BaseType.ParseXml(xml);

if(x.GetType() == typeof(TypeA))
{
// do work on Type A
}
else if(x.GetType() == typeof(TypeB))
{
// do work on Type B
}

只是想从您喜欢的设计角度了解其他人的想法。现在,细节不是很重要。我只是根据 xml 中的内容从单个 XML 源创建 2 种不同的类型。没什么复杂的。

更新:

感谢您到目前为止的回答。类型在这里并不重要,但作为示例,类层次结构可能如下所示:

class BaseType
{
public string CommonData { get; set; }
}

class TypeA : BaseType
{
public string TypeASpecificData { get; set; }
}

class TypeB : BaseType
{
public string TypeBSpecificData { get; set; }
}

由于此功能将集成到其他人将使用的程序集中,我喜欢使用 Enum 的第一个选项,因为让 API 的用户检查某些内容的类型似乎很尴尬,即使用 Enum 在语义上似乎更彻底。

最佳答案

在第一个选项中,您实际上是在复制信息(类型 + 枚举),没有明显的好处。因此,鉴于这两个选项,我会选择第二个,尽管我更喜欢更惯用的 is 而不是 GetType 比较:

BaseType x = BaseType.ParseXml(xml);

if(x is TypeA)
{
// do work on Type A
}
else if(x is TypeB)
{
// do work on Type B
}

但是,您可以考虑第三种选择:

BaseType x = BaseType.ParseXml(xml);
x.DoWork();

DoWork 是 BaseType 的抽象方法,在 TypeA 和 TypeB 中被重写:

public abstract class BaseType
{
public abstract void DoWork();
}
public class TypeA : BaseType
{
public override void DoWork() {
// do work on Type A
}
}
public class TypeB : BaseType
{
public override void DoWork() {
// do work on Type B
}
}

关于c# - 什么更好?枚举还是类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17556351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com