假设我有一个对象,其类型可以在运行时采用多种类型。我刚刚将一些较旧的 .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/