![](/img/trans.png)
[英]Setting a Value to a field inside an object “Only” if the Value is not null in C#
[英]C# setting object as null
我想將一個對象設置為null,以便可以“消費”各種對象。 在Java中,我們有這個。
//In some function/object
Vector3 position = new Vector3();
//In some loop.
if(position != null){
consumePositionAsForce(position);
position = null;
}
我知道在C#中,如果您使用的是基本類型buut,則必須將對象“裝箱”並“取消裝箱”,我找不到關於可空值類型的任何文檔。
我正在嘗試在C#中執行相同的操作,但是卻收到有關類型轉換的錯誤/警告。 如我不能設置Vector3 = null。
您可以將其聲明為可為空的Vector3(Vector3嗎?)?
Vector3? position = null;
那是我的第一個建議。 另外,您可以將其設置為Vector3.Zero,但我真的不喜歡這個想法。
我相當確定Vector3是一個值類型,而不是引用類型,因此您不能在未顯式聲明為可為空的Vector3的情況下為其分配null。
您可以使用Nullable<T>
來具有可為空的值類型,其中T
是一個struct
(基本類型)或添加一個?
之后作為類型的前綴。 這樣,您可以將樣本的int, Vector或Vector3d結構設置為可空的樣本:
Vector? vector2d = null;
Vector3d? vector3d = null;
當您具有可為空的類型時,將具有兩個新屬性,即HasValue
返回一個bool
值,該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>
類嘗試將值類型封裝為引用類型,以給您留下可以為值類型設置null的印象。
我想您知道,但我建議您閱讀更多有關裝箱和拆箱的信息 。
使用Vector3?
(可為空的Vector3)而不是Vector3
。
您不能將值類型設置為null。
由於Vector3是一種結構(這是一種值類型),因此您將無法按原樣將其設置為null。
您可以使用可為空的類型,例如:
Vector3? position = null;
但是當您要在要查找常規Vector3的函數中使用它時,需要將其強制轉換為Vector3。
Vector3是一個結構,因此不能為null或可拋棄。 您可以使用
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語句中使用它。 使用后將殺死該物體。 這比空值更好,因為您不會使事情復雜化,也不必擔心丟失空值檢查或發生內存中未處理的對象的事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.