你如何在另外两个对象之间共享同一个对象?例如,我喜欢那种味道:
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参数的方法范围中应用一些更改... 我还读过我们可以使用指针,但没有别的方法可以做到吗?
答案 0 :(得分:9)
这与共享对象无关。您将对字符串的引用传递给A构造函数。该引用已复制到私有成员foo_
中。之后,您致电B()
,将foo_
更改为“已更改”。
您从未修改str
。 str
是main
中的局部变量。你从未传递过它的引用。
如果您想要更改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