我想将一个对象设置为null,这样我就可以'消耗'它的各种各样。 在Java中我们有这个。
//In some function/object
Vector3 position = new Vector3();
//In some loop.
if(position != null){
consumePositionAsForce(position);
position = null;
}
我知道在C#中如果使用原始类型buut那么必须'Box'和'Unbox'对象我找不到任何关于可空值类型的文档。
我正在尝试在C#中执行相同操作,但我收到有关类型转换的错误/警告。因为我无法设置Vector3 = null。
答案 0 :(得分:7)
您可以使用nullable types执行此操作:
Vector3? vector = null;
从某个地方分配价值:
position = new Vector3();
然后您可以轻松地将其与null
进行比较,就像您比较参考类型对象一样:
if(position != null) //or position.HasValue if you want
{
//...
}
验证不是null
后,要访问Vector3
值,您应该使用position.Value
。
答案 1 :(得分:5)
你能把它声明为可空的Vector3(Vector3?)?
>>> df2['total'] = df2.sum(axis=1)
>>> df2
order app org pip total
id
1 1 1 1 3
2 1 0 0 1
3 1 1 0 2
这是我的第一个建议。或者,您可以将其设置为Vector3.Zero,但我不太喜欢这个想法。
我相当确定Vector3是一个值类型,而不是引用类型,因此如果不将其明确声明为可为空的Vector3,则无法为其指定null。
答案 2 :(得分:5)
您可以使用Nullable<T>
使用T
struct
?
(普通话类型)或添加Vector? vector2d = null;
Vector3d? vector3d = null;
作为类型的前缀,来获取可为空的值类型。对于样本,您可以将int,Vector或Vector3d结构设置为可为空的样本:
HasValue
当你有可空类型时,你有两个新属性,bool
返回一个Value
值,表示对象是否有效,int?
返回实际值(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>
实际上,<form action="/search.php" method="GET">
<div class="form-group">
<span class="col-md-1 col-md-offset-1 text-center"><i class="fa fa-envelope-o bigicon"></i></span>
<div class="col-md-8">
<input id="form" name="id" type="text" placeholder="Search" class="form-control" >
</div>
<div class="col-md-12 text-center">
<?php
echo '<p>'. '<a href="search.php?id='.$GET['id'].'">' . '<button type="submit" class="btn btn-secondary">' . 'Search' . '</button>' . '</a>' . '<br />';
?>
</div>
</div>
</form>
类尝试将值类型封装为引用类型,以提供可以为值类型设置null的印象。
我想你知道,但我建议你阅读更多关于boxing and unboxing的内容。
答案 3 :(得分:4)
使用Vector3?
(可空的Vector3)代替Vector3
。
答案 4 :(得分:1)
您无法将值类型设置为null。
由于Vector3是一个结构(它是一个值类型),你不能按原样将它设置为null。
您可以使用类似的可空类型:
add_definitions( -DBOOST_ALL_NO_LIB )
hunter_add_package(Boost COMPONENTS random system thread filesystem chrono atomic)
find_package(Boost CONFIG REQUIRED random system thread filesystem chrono atomic)
但是当你想在寻找常规Vector3的函数中使用它时,需要将它转换为Vector3。
答案 5 :(得分:0)
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语句中使用它。这将在使用后杀死对象。这比空值更好,因为你不会使事情复杂化,你不必担心在内存中遗漏空检查或事件和未事件对象。