Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to share a variable between two classes?

Tags:

c#

How would you share the same object between two other objects? For instance, I'd like something in that flavor:

class A
{
   private string foo_; // It could be any other class/struct too (Vector3, Matrix...)

   public A (string shared)
   {
       this.foo_ = shared;
   }

   public void Bar()
   {
       this.foo_ = "changed";
   }
}

...
// inside main
string str = "test";
A a = new A(str);

Console.WriteLine(str); // "test"
a.Bar();
Console.WriteLine(str); // I get "test" instead of "changed"... :(

Here, I don't want to give a ref to the Bar method. What I want to achieve is something that would look like that in C++:

class A
{
  int* i;
public:
  A(int* val);
};

A::A (int* val)
{
  this->i = val;
}

I read there is some ref/out stuff, but I couldn't get what I'm asking here. I could only apply some changes in the methods scope where I was using ref/out arguments... I also read we could use pointers, but is there no other way to do it?

like image 572
Altefquatre Avatar asked Mar 29 '10 04:03

Altefquatre


1 Answers

This has nothing to do with sharing objects. You passed a reference to a string into the A constructor. That reference was copied into the private member foo_. Later, you called B(), which changed foo_ to "changed".

At no time did you modify str. str is a local variable in main. You never passed a reference to it.

If you had wanted to change str, you could have defined B as

   public void Bar(ref string s)
   {
     this.foo_ = "changed";
     s = this.foo_;
   }

Consider:

public class C
{
    public int Property {get;set;}
}

public class A
{
    private C _c;
    public A(C c){_c = c;}

    public void ChangeC(int n) {_c.Property = n;}
}

public class B
{
    private C _c;
    public B(C c){_c = c;}

    public void ChangeC(int n) {_c.Property = n;}
}

in main:

C myC = new C() {Property = 1;}
A myA = new A(myC);
B myB = new B(myC);

int i1 = myC.Property; // 1
myA.ChangeC(2);
int i2 = myC.Property; // 2
myB.ChangeC(3);
int i3 = myC.Property; // 3
like image 56
John Saunders Avatar answered Sep 17 '22 19:09

John Saunders