我可能会过度思考这个问题并且这是一个简单的概念,但我似乎无法弄清楚如何从该类别中的一个访问对象的参数(通过引用)'功能。 我需要这个,因为我有一个对象(对象A),它用另一个对象(对象B)作为参数进行实例化。对象' A'具有必须改变对象B'的值的功能,这可以通过复制对象' B'的内容来完成。因此,当对象的多个实例出现问题时,会出现问题。用相同的对象实例化' B'并且必须使用改变' B值的功能。对于对象A'的所有实例,必须更改相同的对象' B值。有没有有效的方法呢?
public class A
{
public A(B b)
{
//do stuff
}
public string FuncOne()
{
//somehow change value of B
}
}
答案 0 :(得分:3)
public class B
{
public string Name { get; set; }
}
public class A
{
private B _b;
public A(B b)
{
_b = b;
//do stuff
}
public string FuncOne()
{
//somehow change value of B
_b.Name = "New Name";
}
}
答案 1 :(得分:0)
您可以使用SingletonPattern
来实现这种功能。像你这样的东西创建一个B的实例,并在整个应用程序的生命周期中使用相同的实例。为了便于实现,您可以将B的实例设置为静态。但要注意多线程应用程序。您需要为此实现ThreadSafe
。欲了解更多信息:
答案 2 :(得分:0)
我可以想到一些方法,你必须选择最适合你情况的方式。
实现此目的的最简单方法是在对象A上创建一个静态变量来存储对象B.这只有在您真正希望所有 A实例共享B时才有效。
public class A
{
private static B _b;
public A(b)
{
_b = b;
}
// other A stuff
}
我建议将此值设置为此方法的构造函数以外的其他位置,但这样可以为您提供图片。
你也可以让B成为单身人士。
public class B
{
private static B _current = null;
public static B Current
{
get
{
if (_current == null)
_current = new B();
return _current;
}
}
{
然后A可以通过调用B.Current
第三种选择是使用传递给A的包装器对象,该对象可以共享。
public class BWrapper
{
public B B { get; set; }
public BWrapper(b)
{
B = b;
}
}
然后你可以将相同的BWrapper
传递给A的所有实例,在那里你可以用设置器重新分配B的值,如:
public class A
{
private BWrapper _b;
public A(BWrapper b)
{
_b = b;
// do stuff
}
public string FuncOne()
{
_b.B = newB;
//somehow change value of B
}
}
答案 3 :(得分:0)
如果在类型A中使类型B成为属性,则可以将B的属性更改为新值,但是这不会更改类型A之外的B的值,以便更改类型B的值。如果您刚刚使用了某个函数,则可以使用关键字out
,但这不是您的示例的原因。以下是您可以做的事情的示例
public class B
{
public object Value { get; set; }//object can be any type
}
public class A
{
private B _b;
public A(B b)
{
_b = b;
//do stuff
}
public string FuncOne()
{
//somehow change value of B
_b.Value = NewValue;
}
}
为了使这更通用,B可以是任何值,你可以使用泛型并更改上面的代码
public class B<T>
{
public <T> Value { get; set; }//object can be any type
}
public abstract class A<T>
{
private B<T> _b;
public A(B<T> b)
{
_b = b;
//do stuff
}
public abstract string FuncOne();
}
这样B可以使用的值可以是任何类型,考虑到您将有多种类型的A
可以执行与A相同的但仅适用于T 的类型
这样,无论类型是什么,您都可以在A中更改B
public class AString : A<string>
{
public AString(B<string> b) : base(b)
{
}
public override string FuncOne()
{
B.Value = "New Value";
return B.Value;
}
}
var thisB = new B<string>()
thisB.Value = "Test"
var thisA = new AString(thisB);
var value = thisA.FuncOne();
var thisValue = thisB.Value;
我已经进入了一些复杂的代码,但它确实很容易,你几乎可以在任何地方了解更多关于泛型的信息