C#设置对象为null

时间:2016-01-14 18:22:55

标签: c#

我想将一个对象设置为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。

6 个答案:

答案 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,VectorVector3d结构设置为可为空的样本:

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语句中使用它。这将在使用后杀死对象。这比空值更好,因为你不会使事情复杂化,你不必担心在内存中遗漏空检查或事件和未事件对象。