.Invoke
方法需要将args参数设置为new object[]
,这是必要的吗?我的意思是我可以将其设置为new string[]
或直接不使用数组吗?例如,我可以像这样使用它:
this.Invoke(delegate, "Some text");
或者像这样:
this.Invoke(delegate, new string[] { "Some text"} );
或将其设为new object[]
是必须的?
this.Invoke(delegate, new object[] { "Some text"} );
道歉,如果它听起来很蹩脚,但我检查的每个代码都使用Object数组甚至是MSDN,而我知道将它用作String更快,但是必须有一个原因,为什么每个人都使用一个对象,这就是为什么我问。在高级中感谢您的答案。
答案 0 :(得分:1)
this.Invoke(delegate, "Some text");
和this.Invoke(delegate, new object[] { "Some text"} );
会让您传入new object[] { "Some text"}
。
但是,执行this.Invoke(delegate, new string[] { "Some text"} );
会导致对象被包裹,您将传入new object[] { new string[] { "Some text" } }
。
更新:我刚刚测试了这个并且我似乎错了,我100%肯定行为是不同的。使用string[]
时,所有3种调用方式都会产生相同的结果。我描述的行为仅在类型不可隐式转换时发生,例如使用int[]
时。
Here is a example program showing the behavior
using System;
public class Program
{
public static void Main()
{
Console.WriteLine("Testing string[]");
var test = new string[1] {"example"};
Example(test);
Console.WriteLine();
Console.WriteLine("Testing int[]");
var test2 = new int[1] {0};
Example(test2);
}
public static void Example(params object[] test)
{
Console.WriteLine("Array Type: {0}", test.GetType());
Console.WriteLine("test[0] Type: {0}", test[0].GetType());
}
}
/* Outputs:
Testing string[]
Array Type: System.String[]
test[0] Type: System.String
Testing int[]
Array Type: System.Object[]
test[0] Type: System.Int32[]
*/