• 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 /
This question was closed Apr 17, 2018 at 10:23 AM by haruna9x for the following reason:

The question is answered, right answer was accepted

avatar image
0
Question by haruna9x · Apr 15, 2018 at 09:39 AM · c#propertiesset

Property (set) does not work with reference c#.

I recently discovered that when I keep a reference to a property, then set it. set property has not been called. Does anyone know why?

 public class AttributeComponent : MonoBehaviour
     {
         [SerializeField]
         private bool isLinker;
         
         public AttributeDictionary AttributeDictionary
         {
             get { return attributeDictionary; }
             set
             {
                 Debug.Log("Set ");
 
                 if (attributeDictionary != value)
                 {
                     if (isLinker)
                     {
                         LinkerComponent linkerComponent = GetComponent<LinkerComponent>();
 
                         linkerComponent.RemoveAllLinker(attributeDictionary);
 
                         attributeDictionary = value;
 
                         attributeDictionary.CalculateValueOfAllAttribute();
 
                         linkerComponent.AddAllLinker(attributeDictionary);
                     }
                     else
                     {
                         attributeDictionary = value;
                         attributeDictionary.CalculateValueOfAllAttribute();
                     }
                 }
             }
         }
    }
      // This does not work.
      Attribute_Component = Character_Component.GetComponent<AttributeComponent>();
      AttributeDictionary attributeDictionary = Attribute_Component.AttributeDictionary;
      attributeDictionary = LoadAttribute(slot);

      // This work.
     Attribute_Component = Character_Component.GetComponent<AttributeComponent>();
     Attribute_Component.AttributeDictionary = LoadAttribute(slot);
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

  • Sort: 
avatar image
2
Best Answer

Answer by fafase · Apr 15, 2018 at 10:01 AM

   Attribute_Component = Character_Component.GetComponent<AttributeComponent>();

At this point above you have a reference to the script with the property.

   AttributeDictionary attributeDictionary = Attribute_Component.AttributeDictionary;

Above again, you have a reference (attributeDictionary) and you assign the return value of the property. At this point, using attributeDictionary is pointing to the object the property returns, but not the property itself.

   attributeDictionary = LoadAttribute(slot);

Finally, you are assigning a new value, that won't affect the property. That reference has no link to the property. If you want to trigger the property then call it directly. No other way since you cannot pass a property by reference. You could use a delegate that calls the property within, but that sounds like added complexity.

 public void Method(AttributeDictionary  ad){ AttributeDictionary = ad; } 

 Action<AttributeDictionary> action = Method;
 action(LoadAttribute(slot));


Comment
Add comment · Show 3 · 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
avatar image haruna9x · Apr 15, 2018 at 10:23 AM 0
Share

"attributeDictionary is pointing to the object the property returns, but not the property itself." - It must be the attributeDictionary variable of the AttributeComponent class, this variable has not been changed.

attributeDictionary = LoadAttribute(slot); did not do anything. Or I do not know.

avatar image fafase haruna9x · Apr 15, 2018 at 05:53 PM 0
Share

Let's do it one step at a time. You first assign the attributeDictionary that the property returned, whatever this one is, it has address 0x0011. So attributeDictionary has value 0x0011.

Now you call LoadAttribute which also returns an AttributeDictionary object, not the same as previous phase and this one has address 0x0022. So attributeDictionary has now value 0x0022, previous address is gone.

If you were to do this:

  AttributeDictionary attributeDictionary = Attribute_Component.AttributeDictionary;
  attributeDictionary.someVariable = someValue;

then yes you are affecting the one returned by the property. But that won't call the setter either. If you want the setter to be called, then you have to call it, there is no other way as you cannot pass a reference to a property. Just not how the compiler is built.

avatar image haruna9x fafase · Apr 16, 2018 at 12:01 AM 0
Share

Very clear. Thank you!

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

481 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 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 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 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

Are properties variables? 1 Answer

Multiple Cars not working 1 Answer

Distribute terrain in zones 3 Answers

C# property keeps getting overwritten 2 Answers

Initialising List array for use in a custom Editor 1 Answer

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