c# - 动态关键字或直接转换为类型?

标签 c# dynamic

假设我有一个对象,其类型可以在运行时采用多种类型。我刚刚将一些较旧的 .Net 3.5 代码迁移到 4.5,并多次出现类似这样的情况:

private void DoStuffCast(object obj)
{
    if (obj is Button)
    {
        ((Button) obj).Content = "Foo";
        Console.WriteLine("Button!");
    }    

    if (obj is TextBox)
    {
        ((TextBox)obj).Text = "Bar";
        Console.WriteLine("Textbox!");
    }
}

除了缺少语法完成之外,将此方法转换为使用动态类型还有什么缺点吗?

private void DoStuffDynamic(dynamic obj)
{
    if (obj is Button)
    {
        obj.Content = "Foo";
        Console.WriteLine("Button!");
    }    

    if (obj is TextBox)
    {
        obj.Text = "Bar";
        Console.WriteLine("Textbox!");
    }
}

最佳答案

有两个缺点:

  • 性能:使用动态访问属性比“正常”访问慢得多
  • 静态类型检查:例如,如果您尝试将一个 int 放入您的 Text 属性中,它会在运行时爆炸(而如果没有动态类型,则会在编译期间检测到错误)。

老实说,对于大多数应用程序来说,性能可能不是问题。也就是说,您可以通过仅将 dynamic 用于动态调度来妥协:

private void DoStuffDynamic(object obj)
{
    dynamic d = obj;
    DoStuff(d);
}

private void DoStuff(Button button)
{
    button.Content = "Foo";
    Console.WriteLine("Button!");
}

private void DoStuff(TextBox textBox)
{
    textBox.Text = "Bar";
    Console.WriteLine("Textbox!");
}

private void DoStuff(object obj)
{
    // obj is neither Button or Textbox
}

通过这种方式,您可以获得静态类型检查和更简洁的代码,而不必将整个事情重构为真正的多态性(这是首选方式,但如果它是遗留代码,您可能不想这样做)。

关于c# - 动态关键字或直接转换为类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37384101/

相关文章:

c# - 在 C# 中制作 Vista 风格的应用程序

c# - 使用 GZipStream 将文本文件写入 gz 文件,而无需先将文本文件写入磁盘

c# - 打印机无法从 DeviceHub 接收作业

vba - 2 个运行时确定的可能包含#NV 的范围上的 MAX 函数

javascript - 获取所有选中的复选框 javascript 或 jquery

perl - 为什么在我的代码生成程序中出现此语法错误?

dynamic - 在 iText 中动态获取表格高度

c++ - 在程序运行时包含头文件

c# - 未获取所有记录或过滤记录

c# - 是否可以在 IIS HttpModule 中修改 HttpRequest POST 的内容?