有什么方法可以通过C#中的引用来访问Object的构造函数参数?

时间:2016-02-12 04:05:44

标签: c# parameters constructor

我可能会过度思考这个问题并且这是一个简单的概念,但我似乎无法弄清楚如何从该类别中的一个访问对象的参数(通过引用)'功能。 我需要这个,因为我有一个对象(对象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 
  } 
}

4 个答案:

答案 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。欲了解更多信息:

http://csharpindepth.com/Articles/General/Singleton.aspx

答案 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;

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