具有接口注入的默认构造函数以及同一类中的Parameterized Constructor

时间:2017-11-13 14:02:36

标签: c#

        public class xyz
          {    

            private readonly ICheck _checker; 

            private readonly IChecker checker;.

            public xyz()
            {
            _checker = checker.Create<xyz>(); //default constructor initialization
            };

            public xyz(string value)
            {
            validateIt(value);//parameter Constructor
            <!--do something-->
            }


            private static void validateIt(string value){
            var msg= "Is not Valid";   //static method which will log the msg
            _checker.log(msg);
            }

        }

//现在问题是默认构造函数不起作用(C#代码)
 //1.checker初始化为null
 // 2。无法在静态方法中获取_checker的引用(即使问题1已解决)

1 个答案:

答案 0 :(得分:0)

首先,挑剔:
当您未在类代码中指定构造函数时,默认构造函数是c#编译器提供的构造函数。
您无法在类代码中指定默认构造函数。你可以指定一个不带任何参数的构造函数,但它不会是&#34;默认的&#34;了。

指定构造函数后,除非您同时指定其他构造函数,否则它是唯一的构造函数。

其次,如果您使用一个构造函数初始化您的类,那么您也不会自动使用其他构造函数。为此,您需要使用构造函数链接 - 从另一个调用一个构造函数。在你的情况下:

public xyz(string value) : this()
{
    // constructor logic goes here
}

第三,private readonly _checker;将导致编译错误 - 您必须指定私有成员的类型(在任何情况下,它都在下一个代码行中正确定义)

第四,除非您具有对实例的引用,否则您无法从静态成员访问实例成员。如果要将_checker用作静态成员,则需要将其定义为static。否则,您需要将xyz的实例传递给静态方法,或者只是将其设为实例方法:

public class xyz
{
    private readonly IChecker checker;

    public xyz()
    {
        // default constructor initialization
        _checker = checker.Create<xyz>();
    };

    public xyz(string value) : this()
    {
        // parameterized Constructor
        validateIt(value);
        //do something
    }

    private void validateIt(string value)
    {
        var msg= "Is not Valid";
        _checker.log(msg);
    }
}