我是否实例化了一个void对象?

大家都知道,在C#中,我们不能这样做:

var voidObject = new void();

要么

var voidObject = new System.Void();

要么

var voidObject = Activator.CreateInstance(typeof(void));

但是,这段代码编译成功,并在调试模式下,我可以看到该类型的voidObjectSystem.Void

var voidObject = FormatterServices.GetUninitializedObject(typeof(void));

这是什么? 这是真实的void实例吗?


从我可以看到它是一个完美的,完全有效的盒装 System.Void值类型:-)

您可以

Console.WriteLine(voidObject.GetType());

并看到它是一个System.Void

System.Void是值类型,所以通过创建它FormatterServices.GetUninitializedObject应该等于做(object)default(void) (因为FormatterServices.GetUninitializedObject将返回值的类型,其所有字段设置为默认值)(注意,清楚(object)default(void)是非法的)。

仍然有没有很多事情可以用你的盒装System.Void做...

var voidObject = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(typeof(void));
var voidObject2 = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(typeof(void));

Console.WriteLine("Type: {0}", voidObject.GetType());
Console.WriteLine("IsValueType: {0}", voidObject.GetType().IsValueType);

Console.WriteLine("Equals: {0}", voidObject.Equals(voidObject2));
Console.WriteLine("GetHashCode1: {0}", voidObject.GetHashCode());
Console.WriteLine("GetHashCode2: {0}", voidObject2.GetHashCode());
Console.WriteLine("ToString: {0}", voidObject.ToString());

.NET和Mono实现似乎有一些区别...在.NET上, System.Void所有实例都具有相同的GetHashCode() ,而在Mono中,每个实例都有不同的GetHashCode()Equals对于它们两个都能正确运行( true )。

(请注意, GetHashCode()中的差异似乎是一个Mono的bug, struct s没有字段:https://ideone.com/t0t8I6应该在新版本中修复)


那么,Imstance是我猜测的那个单词。 如果通过使用GetUninitializedObject创建对象, GetUninitializedObject从方法名称中获取单位对象。 因此,假设你有一个Foo类,并且有一些成员,这些成员都没有任何值,因为构造函数没有被调用。 虽然Void甚至没有任何构造函数,但您可能不会调用Activator.CreateInstance或使用new void() 。 然而,使用上面提到的不使用任何构造函数的方法,您可以创建它的一个对象,但保留它的单位。 所以这只是一个让一个新对象单元化的特例。

如果这是一个错误,一个功能或任何我只能猜到的。

编辑:显然它是一个功能,以下从MSDN让我假设如此:

当用户打算立即填充所有字段时,当前方法应仅用于反序列化。 (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatterservices.getuninitializedobject%28v=vs.110%29.aspx)

因此,尽管您可以使用此方法创建实例,但您应该在通话后立即提供所有必要信息时执行此操作。 然而,因此void没有任何成员它的状态仍然是无效的。

链接地址: http://www.djcxy.com/p/27787.html

上一篇: Did I instantiate an object of void?

下一篇: How do I define custom colors for my stacked bar charts in vis.js?