我再次希望这不是一个意见问题;我试图知道哪种是确定属于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语言中的1个方法…我不确定是否有必要用C#这样做.
编辑1:
我已将override关键字添加到上面的代码中.
编辑2:
对不起,我可能没说清楚.我会更好地说明一下:
例如,我有一个WPF Panel对象,它有一个Children属性,它返回UIElements.我需要知道某个元素在什么类型上行动…在我的特定情况下,用户在屏幕上绘制图形,所以我需要知道有多少节点和多少个连接被绘制以便存储然后在数据库.不幸的是,我不能使用多态性,对吗?我怎么知道是否应该在我的节点表或连接表中添加一行?
解决方法:
您的使用示例是错误的(正如其他人所说的那样 – 使用多态)但是询问对象的类型是合理的.
我问过c Testing a c++ class for features的类似问题
关于#1和#2之间的区别.两者都需要元数据如果您正在使用案例1,则在案例2中您仍在使用CLR生成的元数据. CLR可能比你更好,而且无论如何它支付了开销
一如既往 – 如果你想知道哪个更快,答案很简单 – 测量并查看.我怀疑是否存在可衡量的差异