gpt4 book ai didi

c# - 确定对象的类型

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

再次重申,我真的希望这不是意见问题;我想知道哪种是确定属于 C# 中特定层次结构的对象类型的最佳方法。我有两种方法来设计我的应用程序:

1 - 在基类上使用属性:

public abstract class Parent 
{
public abstract TypeOfObject TypeOfObject { get; }
}

public class Child1 : Parent
{
public override TypeOfObject TypeOfObject { get { return TypeOfObject.Child1 } }

// ...
}

public class Child2 : Parent
{
public override TypeOfObject TypeOfObject { get { return TypeOfObject.Child2 } }

// ...
}

public enum TypeOfObject
{
Child1,
Child2
}

public static void Main()
{
Parent p = new Child1();

switch (p.TypeOfObject)
{
case TypeOfObject.Child1: _doSomethingWithChild1(p);break;
case TypeOfObject.Child2: _doSomethingWithChild2(p);break;
}
}

2 - 使用 is 运算符

public abstract class Parent 
{
// ...
}

public class Child1
{
// ...
}


public class Child2 : Parent
{
// ...
}

public enum TypeOfObject
{
Child1,
Child2
}

public static void Main()
{
Parent p = new Child1();

if (p is Child1) _doSomethingWithChild1(p);
if (p is Child2) _doSomethingWithChild2(p);
}

每种选择的含义是什么?我认为 2 有更大的性能影响,因为它依赖于元数据,但 1 似乎不太优雅。此外,我学会了在 C++ 中以第一种方式执行此操作...我不确定是否有必要使用 C# 执行此操作。

编辑 1:

我在上面的代码中添加了 override 关键字。

编辑 2:

对不起,我可能没说清楚。我会更好地说明它:

例如,我有一个 WPF Panel 对象,它有一个 Children 属性,它返回我 UIElement秒。我需要知道某个元素是什么类型来作用于它......在我的特殊情况下,用户正在屏幕上绘制图形,所以我需要知道绘制了多少个节点和多少个连接以存储然后在数据库中。不幸的是,我不能为此使用多态性,对吗?我如何知道应该向我的节点表还是向我的连接表添加一行?

最佳答案

你做错了™。听说过多态性(更准确地说是后期/动态绑定(bind))吗?父级应该有一个抽象方法,如 doSomething() 由子级实现,_doSomethingWithChild1 中的任何内容都应该在 Child1.doSomething 中等等。这就是 OO 的 全部 - 好吧,不是全部,但在很大程度上 - 关于! C++ 常见问题解答声称如果没有 virtual,C++ 就不会是面向对象的,这是正确的。添加另一个子类不仅更容易/更不容易出错(您只需定义一个新的子类和方法,无需摆弄开关或 ifs)而且很可能是最快的方法(每个值得盐分的 JIT 使用 polymorphic inline caching ), 这也是惯用的,不太可能让你“WTF”盯着看;)

关于c# - 确定对象的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3936966/

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