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

在 C# 中通过引用访问对象的构造函数参数的任意方法

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;

我已经进入了一些复杂的代码,但它真的很容易,你几乎可以在任何地方了解更多关于泛型的信息