C# 将对象设置为 null
C# setting object as null
我想将一个对象设置为 null,这样我就可以 'consume' 它的各种类型。
Java 我们有这个。
//In some function/object
Vector3 position = new Vector3();
//In some loop.
if(position != null){
consumePositionAsForce(position);
position = null;
}
我知道在 C# 中,如果您使用原始类型,则必须 'Box' 和 'Unbox' 对象,但我找不到任何关于可空值类型的文档。
我正尝试在 C# 中做同样的事情,但我收到了关于类型转换的 errors/warning。正如我无法设置 Vector3 = null.
使用 Vector3?
(可为 null 的 Vector3)代替 Vector3
。
能否将其声明为可为空的 Vector3(Vector3?)?
Vector3? position = null;
这是我的第一个建议。或者,您可以将其设置为 Vector3.Zero,但我不太喜欢这个主意。
我相当确定 Vector3 是值类型,而不是引用类型,因此如果不显式声明它为可为 null 的 Vector3,则不能为其分配 null。
您可以使用 nullable types 来执行此操作:
Vector3? vector = null;
并从某个地方赋值:
position = new Vector3();
然后您可以轻松地将它与 null
进行比较,就像比较引用类型对象一样:
if(position != null) //or position.HasValue if you want
{
//...
}
验证它不是 null
后,要访问 Vector3
值,您应该使用 position.Value
.
您可以使用 Nullable<T>
来获得可空值类型,其中 T
是 struct
(基本类型)或在后面添加 ?
作为类型。有了这个,你可以设置,例如,一个 int,一个 Vector, or Vector3d 结构可以为空,例如:
Vector? vector2d = null;
Vector3d? vector3d = null;
当您拥有可空类型时,您将拥有两个新属性,即 HasValue
,其中 return 是一个 bool
值,指示该对象是否存在有效值,并且 Value
其中 return 的实际值(对于 int?
return 和 int
)。你可以使用这样的东西:
// get a structure from a method which can return null
Vector3d? vector3d = GetVector();
// check if it has a value
if (vector3d.HasValue)
{
// use Vector3d
int x = vector3d.Value.X;
}
实际上,Nullable<T>
class 试图将值类型封装为引用类型,以给人一种可以为值类型设置 null 的印象。
我想你知道,但我建议你阅读更多关于 boxing and unboxing 的内容。
您不能将值类型设置为 null。
由于 Vector3 是一个结构(它是一个值类型),您将无法将其原样设置为 null。
您可以使用可为 null 的类型,例如:
Vector3? position = null;
但是当您想在寻找常规 Vector3 的函数中使用它时,需要将其转换为 Vector3。
Vector3 是一个结构,因此不可为空或一次性。您可以使用
Vector3? position = null;
或者你可以这样改:
class Program
{
static void Main(string[] args)
{
using (Vector3 position = new Vector3())
{
//In some loop
consumePositionAsForce(position);
}
}
}
struct Vector3 : IDisposable
{
//Whatever you want to do here
}
该结构现在是一次性的,因此您可以在 using 语句中使用它。这将在使用后杀死对象。这比 null 更好,因为您不会使事情过于复杂,而且您不必担心错过 null 检查或事件内存中未处理的对象。
我想将一个对象设置为 null,这样我就可以 'consume' 它的各种类型。 Java 我们有这个。
//In some function/object
Vector3 position = new Vector3();
//In some loop.
if(position != null){
consumePositionAsForce(position);
position = null;
}
我知道在 C# 中,如果您使用原始类型,则必须 'Box' 和 'Unbox' 对象,但我找不到任何关于可空值类型的文档。
我正尝试在 C# 中做同样的事情,但我收到了关于类型转换的 errors/warning。正如我无法设置 Vector3 = null.
使用 Vector3?
(可为 null 的 Vector3)代替 Vector3
。
能否将其声明为可为空的 Vector3(Vector3?)?
Vector3? position = null;
这是我的第一个建议。或者,您可以将其设置为 Vector3.Zero,但我不太喜欢这个主意。
我相当确定 Vector3 是值类型,而不是引用类型,因此如果不显式声明它为可为 null 的 Vector3,则不能为其分配 null。
您可以使用 nullable types 来执行此操作:
Vector3? vector = null;
并从某个地方赋值:
position = new Vector3();
然后您可以轻松地将它与 null
进行比较,就像比较引用类型对象一样:
if(position != null) //or position.HasValue if you want
{
//...
}
验证它不是 null
后,要访问 Vector3
值,您应该使用 position.Value
.
您可以使用 Nullable<T>
来获得可空值类型,其中 T
是 struct
(基本类型)或在后面添加 ?
作为类型。有了这个,你可以设置,例如,一个 int,一个 Vector, or Vector3d 结构可以为空,例如:
Vector? vector2d = null;
Vector3d? vector3d = null;
当您拥有可空类型时,您将拥有两个新属性,即 HasValue
,其中 return 是一个 bool
值,指示该对象是否存在有效值,并且 Value
其中 return 的实际值(对于 int?
return 和 int
)。你可以使用这样的东西:
// get a structure from a method which can return null
Vector3d? vector3d = GetVector();
// check if it has a value
if (vector3d.HasValue)
{
// use Vector3d
int x = vector3d.Value.X;
}
实际上,Nullable<T>
class 试图将值类型封装为引用类型,以给人一种可以为值类型设置 null 的印象。
我想你知道,但我建议你阅读更多关于 boxing and unboxing 的内容。
您不能将值类型设置为 null。
由于 Vector3 是一个结构(它是一个值类型),您将无法将其原样设置为 null。
您可以使用可为 null 的类型,例如:
Vector3? position = null;
但是当您想在寻找常规 Vector3 的函数中使用它时,需要将其转换为 Vector3。
Vector3 是一个结构,因此不可为空或一次性。您可以使用
Vector3? position = null;
或者你可以这样改:
class Program
{
static void Main(string[] args)
{
using (Vector3 position = new Vector3())
{
//In some loop
consumePositionAsForce(position);
}
}
}
struct Vector3 : IDisposable
{
//Whatever you want to do here
}
该结构现在是一次性的,因此您可以在 using 语句中使用它。这将在使用后杀死对象。这比 null 更好,因为您不会使事情过于复杂,而且您不必担心错过 null 检查或事件内存中未处理的对象。