在 C# 中通过引用访问对象的构造函数参数的任意方法
本文关键字:构造函数 参数 任意 方法 对象 访问 引用 | 更新日期: 2023-09-27 18:34:27
我可能想多了,这是一个简单的概念,但我似乎无法弄清楚如何从该类的函数之一访问对象的参数(通过引用)。我需要这个,因为我有一个对象(对象 A),它用另一个对象(对象 B)作为参数实例化。对象"A"有一个函数,该函数必须更改对象"B"的值,这可以通过复制对象"B"的内容来完成。因此,当对象"A"的多个实例使用同一对象"B"实例化并且必须使用更改"B"值的函数时,就会出现问题。必须为对象"A"的所有实例更改同一对象"B"的值。有没有有效的方法可以做到这一点?
public class A
{
public A(B b)
{
//do stuff
}
public string FuncOne()
{
//somehow change value of B
}
}
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";
}
}
我可以想到一些方法,你必须选择最适合你情况的方法。
实现此目的的最简单方法是在对象 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
}
}
SingletonPattern
来实现这种功能。就像您创建 B 的单个实例并在应用程序的整个生命周期中使用相同的实例一样。为了便于实现,您可以将 B 的实例设置为静态实例。但要小心多线程应用程序。您需要为此ThreadSafe
实现。欲了解更多信息:
http://csharpindepth.com/Articles/General/Singleton.aspx
如果将类型 B 设置为类型 A 中的属性,则可以将 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();
}
这样,考虑到您将有多种类型的A
可以执行与 A 相同的操作,但仅适用于 T 的类型,因此 B 可以使用的值可以是任何类型这样,无论类型是什么,您都可以更改 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;
我已经进入了一些复杂的代码,但它真的很容易,你几乎可以在任何地方了解更多关于泛型的信息