Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法参数和返回类型上的dynamic vs object关键字 一个非常基本的问题,考虑这种方法: public object Foo(object bar) {... }_C#_C# 4.0_Dynamic - Fatal编程技术网

C# 方法参数和返回类型上的dynamic vs object关键字 一个非常基本的问题,考虑这种方法: public object Foo(object bar) {... }

C# 方法参数和返回类型上的dynamic vs object关键字 一个非常基本的问题,考虑这种方法: public object Foo(object bar) {... },c#,c#-4.0,dynamic,C#,C# 4.0,Dynamic,vs 虽然实际上我没有像这样的方法签名,但为了简洁起见,这个示例进行了简化,以显示两件事:方法参数中的“dynamic vs object”关键字和返回的关键字 这两种方法的区别是什么,它是否产生相同的IL或任何性能影响? 根据引用/解决方法/示例,告诉dynamic就像添加了动态特性的对象一样,我猜两者是一样的,但只是根据用法不同,比如我想在返回值上添加另一个动态属性/方法。然而,我仍然想知道是否还有其他关键的事情要考虑。 请注意,如果我有一个类,它有一个如上所述的Bar方法,并且实现了一个具

vs

虽然实际上我没有像这样的方法签名,但为了简洁起见,这个示例进行了简化,以显示两件事:方法参数中的“dynamic vs object”关键字和返回的关键字

这两种方法的区别是什么,它是否产生相同的IL或任何性能影响?

根据引用/解决方法/示例,告诉dynamic就像添加了动态特性的对象一样,我猜两者是一样的,但只是根据用法不同,比如我想在返回值上添加另一个动态属性/方法。然而,我仍然想知道是否还有其他关键的事情要考虑。 请注意,如果我有一个类,它有一个如上所述的
Bar
方法,并且实现了一个具有如下所示的方法签名的接口(反之亦然),编译器不会抱怨任何事情

object Bar(object bar);
在存在了大约3年之后,我有机会在一个项目中使用动态特性,比如创建动态存储库以供Web API使用并生成(动态)JSON


其中实体不是具体的,并且在db列中定义了
entityName
。我还考虑使用
IEnumerable
IEnumerable
。有什么想法吗?

取决于
{…}
它们当然不会导致相同的IL!考虑:

public object Foo(object bar)
{
  Use(bar);
}

void Use(int i)
{
}
void Use(string s)
{
}
void Use(IConvertible c)
{
}
void Use<T>(IEnumerable<T> e)
{
}
void Use(object o)
{
}
公共对象Foo(对象栏)
{
使用(巴);
}
无效使用(int i)
{
}
无效使用(字符串s)
{
}
无效使用(IConvertible c)
{
}
无效使用(IEnumerable e)
{
}
无效使用(对象o)
{
}
IL将只包含对
Use
最后一个重载的调用

但是如果参数被声明为
动态条
,IL将包含启动非常复杂的重载解析算法的代码。这可能导致调用任何重载,或者可能导致错误(例如,对于
bar==null
,无法确定最佳重载)

显然是非常不同的。显然,当我们在应用程序运行时(
dynamic
)必须执行整个绑定,而不是在编译程序时一次性执行绑定时,性能会更差

同样清楚的是,
dynamic
案例中缓慢而复杂的代码可能是我们真正想要的,而不是总是调用相同的重载

.method private hidebysig instance object Foo(object bar) cil managed
{...}

.method private hidebysig instance object Bar(object bar) cil managed
{
  .param [0]
  .custom instance void [System.Core]System.Runtime.CompilerServices.DynamicAttribute::.ctor() = ( 01 00 00 00 ) 
  .param [1]
  .custom instance void [System.Core]System.Runtime.CompilerServices.DynamicAttribute::.ctor() = ( 01 00 00 00 ) 
  ...
}
签名保持不变,只有
Dynamic
属性被添加到return和first参数中


如果您可以将参数类型从
dynamic
更改为
object
,而无需更改任何其他代码,请执行此操作。

Foo.Baz
将导致编译器异常,
Bar.Baz
可能会导致运行时异常。@Prestongui不确定
Foo.Baz
在您的评论中代表了什么。问题是关于方法签名,而不是关于方法用法。
public object Foo(object bar)
{
  Use(bar);
}

void Use(int i)
{
}
void Use(string s)
{
}
void Use(IConvertible c)
{
}
void Use<T>(IEnumerable<T> e)
{
}
void Use(object o)
{
}
.method private hidebysig instance object Foo(object bar) cil managed
{...}

.method private hidebysig instance object Bar(object bar) cil managed
{
  .param [0]
  .custom instance void [System.Core]System.Runtime.CompilerServices.DynamicAttribute::.ctor() = ( 01 00 00 00 ) 
  .param [1]
  .custom instance void [System.Core]System.Runtime.CompilerServices.DynamicAttribute::.ctor() = ( 01 00 00 00 ) 
  ...
}