我是否实例化了一个无效的对象?
Did I instantiate an object of 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
的真实实例吗?
好吧,Imstance 这个词我猜错了。如果您使用 GetUninitializedObject
创建一个对象,您将获得一个如前所述的 rom 方法名称的单元化对象。因此,假设您有一个 class Foo
,其中一些成员 none 将具有任何值,因为未调用构造函数。虽然 Void
甚至没有任何构造函数,但您不能对其调用 Activator.CreateInstance
或使用 new void()
。但是,使用上述不使用任何构造函数的方法,您可以创建它的对象但将其初始化。所以这只是将新对象单元化的特例。
如果这是错误、功能或我只能猜测的任何内容。
编辑:显然这是一个功能,MSDN 的以下内容让我假设:
The current method should only be used for deserialization when the user intends to immediately populate all fields. (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatterservices.getuninitializedobject%28v=vs.110%29.aspx)
因此,虽然您可以使用此方法创建实例,但您应该仅在调用后立即提供所有必要信息时才这样做。但是因此 void
没有任何成员,其状态仍然无效。
据我所知,它是一个非常好的、完全有效的 boxed System.Void
值类型:-)
你可以
Console.WriteLine(voidObject.GetType());
看到它是 System.Void
.
System.Void
是一个值类型,所以通过FormatterServices.GetUninitializedObject
创建它应该等于做(object)default(void)
(因为FormatterServices.GetUninitializedObject
将return一个值类型所有字段都设置为默认值)(请注意,显然 (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 and Mono 实现之间似乎存在一些差异...在 .NET 上,System.Void
的所有实例都具有相同的 GetHashCode()
,而在 Mono 上,它们中的每一个都有一个不同的 GetHashCode()
。 Equals
对它们都能正常工作 (true
)。
(请注意,GetHashCode()
中的差异似乎是 Mono 的一个错误,struct
s 没有字段:https://ideone.com/t0t8I6 that should be fixed 在较新的版本中)
众所周知,在 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
的真实实例吗?
好吧,Imstance 这个词我猜错了。如果您使用 GetUninitializedObject
创建一个对象,您将获得一个如前所述的 rom 方法名称的单元化对象。因此,假设您有一个 class Foo
,其中一些成员 none 将具有任何值,因为未调用构造函数。虽然 Void
甚至没有任何构造函数,但您不能对其调用 Activator.CreateInstance
或使用 new void()
。但是,使用上述不使用任何构造函数的方法,您可以创建它的对象但将其初始化。所以这只是将新对象单元化的特例。
如果这是错误、功能或我只能猜测的任何内容。
编辑:显然这是一个功能,MSDN 的以下内容让我假设:
The current method should only be used for deserialization when the user intends to immediately populate all fields. (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatterservices.getuninitializedobject%28v=vs.110%29.aspx)
因此,虽然您可以使用此方法创建实例,但您应该仅在调用后立即提供所有必要信息时才这样做。但是因此 void
没有任何成员,其状态仍然无效。
据我所知,它是一个非常好的、完全有效的 boxed System.Void
值类型:-)
你可以
Console.WriteLine(voidObject.GetType());
看到它是 System.Void
.
System.Void
是一个值类型,所以通过FormatterServices.GetUninitializedObject
创建它应该等于做(object)default(void)
(因为FormatterServices.GetUninitializedObject
将return一个值类型所有字段都设置为默认值)(请注意,显然 (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 and Mono 实现之间似乎存在一些差异...在 .NET 上,System.Void
的所有实例都具有相同的 GetHashCode()
,而在 Mono 上,它们中的每一个都有一个不同的 GetHashCode()
。 Equals
对它们都能正常工作 (true
)。
(请注意,GetHashCode()
中的差异似乎是 Mono 的一个错误,struct
s 没有字段:https://ideone.com/t0t8I6 that should be fixed 在较新的版本中)