• Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by mpartel · May 05, 2018 at 10:16 AM · gameobjectnulldictionaryoperator

Is it safe to use GameObject as a Dictionary key?

Is it safe to use GameObjects or Components that might be destroyed at any time as keys to Dictionary?

If not, what should we use instead? Object.GetInstanceID()? Is it guaranteed that those IDs are never reused in a single run of the program (I'd assume so but the docs are not 100% clear)? And how do we then detect whether the corresponding object has been destroyed?

Background

Unity makes some questionable changes to C#:

  • operator== is overridden for UnityEngine.Object

  • Unity has a mechanism to check that destroyed objects' methods aren't accessed.

I presume Dictionary is internally allowed to call GetHashCode and operator== on its keys at any time.

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
6
Best Answer

Answer by Bunny83 · May 06, 2018 at 12:31 AM

No there shouldn't be any issues with the Dictionary, That's because as you know a C# managed object can not be destroyed, only the native part. Your managed object will turn into a fake null object but that shouldn't cause any problems. The UnityEngine.Object class actually overrides GetHashCode and simply returns the instance ID of the gameobject. However this ID is stored in the managed object itself and it stays the same when you destroy the object. So since the hashcode stays the same from the Dictionary point of view it only deals with an object reference.


The overloaded == operator of UnityEngine.Object is not used inside the Dictionary since operators are statically linked. So inside the generic Dictionary it will use the default == operator. The Dictionary actually performs a null check on the key when you get / set a value. Since the managed object is still a valid C# object and the == operator actually checks the real reference it just works the same.


Unity also overrides the virtual Equals method to implement the fake null behaviour. Though a direct comparison sill works the same so go.Equals(go) will return true even for fake null objects.


Note that this actually holds true for any UnityEngine.Object derived type which covers nearly every object type that is shipped with the Unity engine (GameObject, Component, Mesh, Material, ...)

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Welcome to Unity Answers

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.



Follow this Question

Answers Answers and Comments

124 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

missing gameobject ≠ Null? 1 Answer

I have an error, script should check for null or not destroy game objects 2 Answers

Why is this null? Finding a script on an object 3 Answers

Gameobject becomes null without a reason 2 Answers

How to get items(my custom class) by a custom id I paired them to? 1 Answer

  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges