我是否实例化了一个void对象?
大家都知道,在C#中,我们不能这样做:
var voidObject = new void();
要么
var voidObject = new System.Void();
要么
var voidObject = Activator.CreateInstance(typeof(void));
但是,这段代码编译成功,并在调试模式下,我可以看到该类型的voidObject
是System.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
没有任何成员它的状态仍然是无效的。
上一篇: Did I instantiate an object of void?
下一篇: How do I define custom colors for my stacked bar charts in vis.js?