- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我听说在 C# 中向上转换是在编译时完成的,因此使用起来非常便宜。但是我有这种情况,我希望转换的类型是抽象的,它没有直接实现我希望转换的接口(interface)。
这是一个示例:
public interface ISomething
{
void Method();
}
public abstract class Base { }
public class Derived : Base, ISomething
{
public void Method() { }
}
public class OtherDerived : Base, ISomething
{
public void Method() { }
}
public class SomeClass
{
private Base[] _baseArray;
public void SomeMethod()
{
foreach (var item in _baseArray)
((ISomething) item).Method();
}
}
显然,我所处的情况是 _baseArray
的每个项目实际上都是从 Base
继承并实现 ISomething
的类型。但是由于我无法确定 Derived
、OtherDerived
或继承自 Base
并实现 的任何其他类型之间的每个项目是什么类型code>ISomething
,我必须使用抽象基类型的数组。
当然我可以使用 ISomething
数组,但我使用 Unity 并且界面在编辑模式下不会被序列化,我需要序列化该数组。
所以,既然上下文在这里,我的问题如下:是否在编译时处理将 item
转换为 ISomething
?如果不是,它是否便宜到可以经常执行(准确地说是在每一帧)?
感谢您的关注,抱歉,如果我不是很清楚,我不是英语,所以这并不容易。
编辑:感谢更好的标题
最佳答案
您可以看到 C# 编译成的 IL:SharpLab IL Results
你的循环:
// loop start (head: IL_0021)
IL_000d: ldloc.0
IL_000e: ldloc.1
IL_000f: ldelem.ref
IL_0010: stloc.2
IL_0011: ldloc.2
IL_0012: castclass ISomething
IL_0017: callvirt instance void ISomething::Method()
IL_001c: nop
// sequence point: hidden
IL_001d: ldloc.1
IL_001e: ldc.i4.1
IL_001f: add
IL_0020: stloc.1
IL_0021: ldloc.1
IL_0022: ldloc.0
IL_0023: ldlen
IL_0024: conv.i4
IL_0025: blt.s IL_000d
// end loop
Method()
是使用 callvirt
调用的,这基本上意味着调度。在这种情况下,这是因为您的对象的具体类型在编译时是未知的。
不过,我不会担心它的性能,除非您进行概要分析并且发现该特定代码是一个热点。
关于c# - 将抽象转换为由 Derived 实现的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54155375/
我需要一种方法来创建由 block 组成的墙。我的想法是:我通过 php 获取信息,然后在 div 中回显它们。 Stylesheet .block{ min-height:100px; min-wi
如何向 rails 生成的表单添加额外的类?这与覆盖现有类相反,如下所述: How do you override the class name in the form_for helper? 使用
我正在使用 Webframework Pyramid 和 URL Dispatch,我在其中定义了很多路由,例如 config.add_route('login', '/login') config.
我正在使用 Telepot 构建 Telegram 机器人图书馆。要发送从 Internet 下载的图片,我必须使用 sendPhoto方法,它接受一个类似文件的对象。 通过查看文档,我发现了这个建议
我对 ASP.NET 非常陌生,并且对 AJAX 一无所知,但一直在尝试(但未成功)在网上找到可以为我提供一些可用代码的引用资料。 我有一个由 Web 服务填充的 TreeView。 TreeView
我是一名优秀的程序员,十分优秀!