相关疑难解决方法(0)

709
推荐指数
11
解决办法
17万
查看次数

为什么结构不支持继承?

我知道.NET中的结构不支持继承,但不清楚为什么它们以这种方式受限.

什么技术原因阻止结构继承其他结构?

.net inheritance struct

120
推荐指数
6
解决办法
3万
查看次数

为什么.NET值类型被密封?

从C#结构继承是不可能的.这对我来说并不明白为什么会这样:

  • 显然,您不能拥有从值类型继承的引用类型; 这不行
  • 从一个原始类型(Int32,Double,Char等)继承它听起来是不合理的.
  • 您需要能够使用派生实例在基础上调用(非虚拟)方法.您可以从派生结构转换为基础,因为它们将重叠相同的内存.我想从基础到派生的转换是行不通的,因为你无法在运行时知道派生结构的类型.
  • 我可以看到您无法在类层次结构中实现虚方法,因为值类型不能包含虚拟成员

我想知道这是否是CLR中的技术限制,还是C#编译器阻止你做的事情?

编辑:值类型不能有虚拟方法,我意识到这个限制排除了大多数你想要使用继承的场景.但是,这仍然会留下继承 - 聚合.想象一个Shape带有Colour字段的结构:我可以编写接受任何结构派生的代码Shape,并访问其Colour字段,即使我永远不能编写虚Shape.Draw方法.

我可以想到一个会被非密封值类型破坏的场景.值类型都应该落实EqualsGetHashCode正确; 即使这两个方法System.Object都是虚拟的,它们也会在值类型上被非虚拟地称为.即使值类型没有被密封,编写从另一个派生的结构的人也无法编写自己的这两种方法的实现,并期望正确调用它们.

我应该指出,我并不是说我应该能够从我自己的代码中继承结构.但是,我想要做的是猜测为什么.NET禁止这种特殊代码气味.

编辑2:我刚刚发现了这个非常相似的问题,其答案实际上是"因为那时价值类型的数组不起作用".

.net c# struct

38
推荐指数
2
解决办法
6984
查看次数

CLR实现对接口成员的虚方法调用

出于好奇:CLR如何调度虚拟方法调用接口成员到正确的实现?

我知道CLR为每种类型维护的VTable,每个方法都有方法槽,并且每个接口都有一个额外的方法槽列表,指向相关的接口方法实现.但我不明白以下内容:CLR如何有效地确定从类型的VTable中选择哪个接口方法槽列表?

从2005年5月刊的MSDN杂志中了解CLR如何创建运行时对象的文章Dril Into .NET Framework Internals讨论了由接口ID索引的进程级映射表IVMap.这是否意味着同一进程中的所有类型都具有指向同一IVMap的相同指针?

它还指出:

如果MyInterface1由两个类实现,则IVMap表中将有两个条目.该条目将指回嵌入在MyClass方法表中的子表的开头.

CLR如何知道要选择哪个条目?它是否进行线性搜索以查找与当前类型匹配的条目?还是二元搜索?或者某种直接索引并且有一个可能有很多空条目的地图?

我还通过C#第3版阅读了CLR中的接口章节,但它没有谈到这一点.因此,这个问题的答案没有回答我的问题.

c# clr interface dispatch method-call

32
推荐指数
2
解决办法
5030
查看次数

为什么结构需要装箱?

在C#,任何用户定义的struct自动是的一个子类System.Struct System.ValueTypeSystem.Struct System.ValueType是的一个子类System.Object.

但是当我们为对象类型引用分配一些结构时,它会被装箱.例如:

struct A
{
    public int i;
}

A a;
object obj = a;  // boxing takes place here
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如果A是后代System.Object,编译器不能将它上传到对象类型而不是装箱吗?

c# struct boxing

18
推荐指数
3
解决办法
6649
查看次数

从c#中继承结构的梦想

在那里,我在C#XNA 4.0中制作2D游戏,并再次遇到我的小烦恼; 该矩形.对于那些使用基本碰撞的人来说,这几乎是必需的.对于几乎所有创建的游戏对象,您都需要有一个矩形.然后我去改变X,检查碰撞或其他任何东西.在那里,我开始了永无止境的战斗objectName.Rectangle.Whatever.为了解决这个问题,我当然会给出一些objectName属性/方法来为我访问这些属性/方法.

然后我敢于梦想.我有一个伟大的设计来制作一个基本的游戏对象类,所有drawable将继承,这将允许父母,精确的本地坐标(浮点数),并保持纹理/ spritebatch.为了完成这个,我准备从Rectangle继承,使用它拥有的所有方法和属性.哎呀,每当需要一个Rectangle的东西时,我可能会懒得说objectName,而不是objectName.Rectangle.

然后我意识到,不是机会.我开始感到沮丧,因为我很聪明的想法被砸碎了.从那时起,我完美的小班级拥有一个矩形,各种方法和属性根据需要访问它.我也有机会从XNA DrawableGameComponent继承它.虽然从长远来看这更实用,每次我查看绘制或更新方法并看到我经常想到的矩形调用时,是否有希望做我想要的事情?我可以做一些聪明的工作吗?或者是从一个真正被我掌握的矩形继承而来?

虽然使用XNA中提供的DrawableGameComponent类允许大多数与游戏对象相关的动作发生在类Update()方法中,但每次在类之外我需要引用的不是Rectangle的属性,而是Rectangle本身,我稍微考虑到实际上我的对象实际上是各种各样的方式,并且加强了Rectangle.然后我再一次发现自己在问:

有没有办法从预定义的结构继承,或者给项目留下你的印象(一种解决方法)?

c# inheritance xna struct xna-4.0

6
推荐指数
1
解决办法
3407
查看次数

C#结构的限制.他们为什么要密封?

我有一个问题,抓住结构的概念,没有人能回答我的问题.我知道它"像"一个对象,你可以有方法和领域.我不明白的是为什么他们被密封了.为什么缺乏继承和多态性限制了他们的能力.结构体是否真的有很多现实世界的使用,我知道它们比一个对象小,我找不到任何真正的例子来帮助我理解它的好处.谢谢.

.net c# struct object

3
推荐指数
1
解决办法
1423
查看次数