使用来自另一个构造函数的参数调用构造函数

时间:2012-07-30 14:35:51

标签: c# constructor arguments

我试图通过传递一些参数(args1,args2)从类A调用类B的构造函数。我正在使用这样的东西:

public class A
{
       private readonly B _b;
       public A()
       {
         _b=new B(TypeA args1,TypeB args2);
       }

...
}

public class B
{

   public B(TypeA  new_args1,TypeB new_args2)
   {
     ...
   }

...
}

但是从调试中看到的args1和args2具有我想要发送的正确值,new_args1和new_args2不会改变。我必须使用特定的语法来做到这一点吗?

3 个答案:

答案 0 :(得分:2)

我不确定你为什么把args称为B“new”的构造函数。它们是用于实例化该特定对象实例的 参数。

除了您在参数声明中缺少类型这一事实外,您的代码看起来是正确的。 完全是错误的。

public B(new_args1,new_args2)

缺少类型,例如

public B(int new_args1, int new_args2)

鉴于上面的类型假设

_b=new B(42, 24);

会导致B初始化为

public B(int new_args1, int new_args2)
{
    // new_args1 has the value 42
    // new_args2 has the value 24
}

假设您将这些值分配到B中的某个位置,例如

public class B 
{
    public int A1 { get; private set; }
    public int A2 { get; private set; }
    public B(int new_args1, int new_args2)
    {
        // new_args1 has the value 42
        A1 = new_args1;
        // new_args2 has the value 24
        A2 = new_args2;
    }
}

然后

_b.A1 

的值为42,

_b.A2

将具有值24

初始化_b。

之后

答案 1 :(得分:1)

首先让我们修复语法:

public class A
{
    private readonly B _b;
    public A(TypeA args1, TypeB args2)
    {
        _b = new B(args1, args2);
    }

}

public class B
{
    public B(TypeA new_args1, TypeB new_args2)
    {

    }

}

请注意,参数类型必须完全匹配,否则可能会调用另一个具有匹配签名的构造函数。假设你在B上有两个构造函数,在这种情况下第一个被调用而第二个没有:

public class B
{
    public B(TypeA new_args1, TypeB new_args2)
    {

    }

    public B(TypeA new_args1, TypeC new_args2)
    {

    }

}

还有一点:在这种情况下,我会推荐DI(依赖注入)。除非构造对象是ListDictionary等原子数据结构,否则在构造函数中构造是一个缺陷。

public class M
{
    public void Main(TypeA new_args1, TypeB new_args2)
    {
        var b = new B(new_args1, new_args2);
        var a = new A(b);
    }
}


public class A
{
    private readonly B _b;
    public A(B b)
    {
        _b = _b;
    }

}

public class B
{
    public B(TypeA new_args1, TypeB new_args2)
    {

    }
}

答案 2 :(得分:0)

我能看到你的代码中的错误是你应该用一个paranthesis声明你的A构造函数,即A()并检查它是否有效。除此之外,您的代码看起来绝对正确。