如何在两个类之间共享变量?

时间:2010-03-29 04:41:10

标签: c#

你如何在另外两个对象之间共享同一个对象?例如,我喜欢那种味道:

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"... :(

在这里,我不想给出Bar方法的参考。我想要实现的是在C ++中看起来像这样的东西:

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

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

我看到有一些参考/出口的东西,但我无法得到我在这里要求的东西。我只能在我使用ref / out参数的方法范围中应用一些更改... 我还读过我们可以使用指针,但没有别的方法可以做到吗?

5 个答案:

答案 0 :(得分:9)

这与共享对象无关。您将对字符串的引用传递给A构造函数。该引用已复制到私有成员foo_中。之后,您致电B(),将foo_更改为“已更改”。

您从未修改strstrmain中的局部变量。你从未传递过它的引用。

如果您想要更改str,则可以将B定义为

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

考虑:

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;}
}

在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

答案 1 :(得分:5)

将你的字符串包装在一个类中。您需要这样做,因为字符串是不可变的。任何更改字符串的尝试实际上都会产生一个新字符串。

class Foo {
    class StringHolder {
        public string Value { get; set; }
    }
    private StringHolder holder = new StringHolder();
    public string Value  {
       get { return holder.Value; }
       set { holder.Value = value; }
    }
    public Foo() { }
    // this constructor creates a "linked" Foo
    public Foo(Foo other) { this.holder = other.holder; } 
}

// .. later ...

Foo a = new Foo { Value = "moose" };
Foo b = new Foo(a); // link b to a
b.Value = "elk"; 
// now a.Value also == "elk"
a.Value = "deer";
// now b.Value also == "deer"

答案 2 :(得分:2)

我会将我的答案分为两部分: 1)如果变量是引用类型而不是已经共享的引用类型,因为它将引用传递给所有感兴趣的对象。您应该注意的唯一事情是引用类型实例是可变的。 2)如果变量是一个值类型,那么你必须使用ref或out或一些可变的包装器,你可以使用方法或属性更改包装器内的值。 希望有所帮助。

答案 3 :(得分:2)

您需要将参数作为方法的参考传递,

    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(ref string myString)
            {
               myString = "changed";
            }
        }

static void Main()
        {
            string str = "test";
            A a = new A(str);

            Console.WriteLine(str); // "test" 
            a.Bar(ref str);
            Console.WriteLine(str);

        }

答案 4 :(得分:1)

当变量是字符串时,它是一个引用。 尝试克隆字符串。 http://msdn.microsoft.com/en-us/library/system.string.clone.aspx