小编Kub*_*tek的帖子

C#通用通配符或如何保存对未知通用继承的引用

好的,所以情况就是这样.我有一个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)

c# generics inheritance wildcard

15
推荐指数
1
解决办法
1379
查看次数

自动将对象扩展到某个继承类

我们假设我有以下声明:

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)

oop inheritance casting

4
推荐指数
1
解决办法
314
查看次数

为什么选择嵌套循环会导致"自联接"的执行时间过长

免责声明:这不是一个如何改善性能的问题,而是为什么它首先是不好的.

以下查询实际上是一些更大的查询的本质,但小到足以证明我不理解的问题.

涉及的表是(跳过列 - 我希望 - 无关紧要):

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和之间的连接成功数StanyJednostekJednostki),我不太明白为什么不查询优化器决定选择这里嵌套循环?为什么不是Zmiany某种迭代而不是整个源表的临时集?同样有趣的是,虽然查询的最后两行似乎无关紧要,但如果删除这些行,则执行计划更改和嵌套循环将替换为哈希:

select
    StanyJednostek.JednostkaID, StanyJednostek.IndeksID
from StanyJednostek
    inner join
        (select distinct IndeksID from StanyJednostek) as Zmiany …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2008

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

标签 统计

inheritance ×2

c# ×1

casting ×1

generics ×1

oop ×1

sql ×1

sql-server ×1

sql-server-2008 ×1

t-sql ×1

wildcard ×1