好的,所以情况就是这样.我有一个FlexCollection<T>
课程,其目的是保留一些专业的清单FlexItem
,因此:
public class FlexCollection<T> where T : FlexItem, new()
{
public void Add(T item) { ... }
...
}
Run Code Online (Sandbox Code Playgroud)
FlexItem
不是泛型类本身.我想要实现的是能够在FlexItem
字段中保存对包含该对象的集合的引用.不幸的是,在C#中,不可能引用模板类的"任何"特化(如在Java中).起初我尝试使用非泛型接口,IFlexCollection
但它实际上迫使我实现每个方法两次,即:
public class FlexCollection<T> : IFlexCollection where T : FlexItem, new()
{
public void Add(T item) { ... } // to use in generic calls
public void Add(object item) { ... } // to use for calls from within FlexItem
...
}
Run Code Online (Sandbox Code Playgroud)
然后我发现我可以让FlexItem成为一个通用类本身!然后专门化可以包含对此专业化对象集合的引用(这是非常合乎逻辑的).因此:
public class FlexItem<T> where T : FlexItem<T>, new()
{ …
Run Code Online (Sandbox Code Playgroud) 我们假设我有以下声明:
public class ClassA
{
public string FieldA = "Something first";
}
public class ClassB : ClassA
{
public string FieldB = "Something second";
}
Run Code Online (Sandbox Code Playgroud)
众所周知,对象ClassB
可以在每个ClassA
需要的地方使用.例如,一种方法
public void DoSthWithObject(ClassA a);
Run Code Online (Sandbox Code Playgroud)
可以像这样调用:
ClassB b = new ClassB();
DoSthWithObject(b);
Run Code Online (Sandbox Code Playgroud)
也可以将继承类型转换为父类型:
ClassA a = (b as ClassA);
Run Code Online (Sandbox Code Playgroud)
所以编译器/框架知道如何"使用"的数据ClassB
在那里ClassA
是必需的.
而现在的问题是:是否有可能以某种方式反过来做?假设我有一个类型的变量,ClassA
我想开始使用它,ClassB
但同时保留所有ClassB
继承的字段ClassA
并且不实例化新对象?据我所知,它需要扩展分配给对象的内存ClassA
来容纳字段ClassB
.
简单来说,我想做这样的事情:
ClassA a = new ClassA();
ClassB b = (a …
Run Code Online (Sandbox Code Playgroud) 免责声明:这不是一个如何改善性能的问题,而是为什么它首先是不好的.
以下查询实际上是一些更大的查询的本质,但小到足以证明我不理解的问题.
涉及的表是(跳过列 - 我希望 - 无关紧要):
create table StanyJednostek (JednostkaID nchar(5), IndeksID nchar(18),
primary key (JednostkaID, IndeksID))
create table Jednostki (JednostkaID nchar(5),
primary key (JednostkaID))
Run Code Online (Sandbox Code Playgroud)
StanyJednostek
包含29187行,而IndeksID
此表中有1676个不同的值).Jednostki
包含94行.
现在,此查询需要两分钟才能完成:
select
StanyJednostek.JednostkaID, StanyJednostek.IndeksID
from StanyJednostek
inner join
(select distinct IndeksID from StanyJednostek) as Zmiany
on StanyJednostek.IndeksID = Zmiany.IndeksID
inner join
Jednostki on StanyJednostek.JednostkaID = Jednostki.JednostkaID
Run Code Online (Sandbox Code Playgroud)
这是执行计划:
困扰我的是这么多的实际行:607147974.这显然需要两分钟才能完成.虽然我明白的地方这个数字来自(这是29187倍20802,20802和之间的连接成功数StanyJednostek
和Jednostki
),我不太明白为什么不查询优化器决定选择这里嵌套循环?为什么不是Zmiany
某种迭代而不是整个源表的临时集?同样有趣的是,虽然查询的最后两行似乎无关紧要,但如果删除这些行,则执行计划更改和嵌套循环将替换为哈希:
select
StanyJednostek.JednostkaID, StanyJednostek.IndeksID
from StanyJednostek
inner join
(select distinct IndeksID from StanyJednostek) as Zmiany …
Run Code Online (Sandbox Code Playgroud)