博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 构造函数
阅读量:5239 次
发布时间:2019-06-14

本文共 5200 字,大约阅读时间需要 17 分钟。

转自:http://www.cnblogs.com/jiajiayuan/archive/2011/09/08/2171422.html

C#构造函数特征:

构造函数名字必须与类名相同

构造函数没有返回类型,可以带参数亦可不带参数

声明类对象时调用构造函数,构造函数不能显示调用

构造函数可以重载,从而提供初始化类对象的不同方法

若在new的时候没有定义构造函数系统会调用默认构造函数,此时构调用的函数体为空。

静态构造函数用 static 修饰,一个类中只允许有一个静态构造函数,这个构造函数在实例化时加载(只要是实例化这个函数名他就会走这个静态构造)

,这时候public private 将失去作用。

构造函数可以使用修饰符的啦。~

 

C#构造函数的特性之C#构造函数使用时注意事项:

1、定义了一个带参构造函数后,最好定义一个无参构造函数,这样可以避免子类调用时出错

2、调用基类构造函数:base() 或 :base(参数列表)  调用本类其它构造函数 :this() 或 :this(参数列表)

3、只有在用base显示调用父类的构造函数时,程序才不会默认的调用不带参数的构造函数

 

构造函数分为:

1, 实力构造函数

2, 私有构造函数

3, 静态构造函数

构造函数是一种特殊的方法,主要是为了给初始化对象赋初值。

1.实例构造函数

使用new表达式创建某个类的对象时,会使用实例构造函数创建和初始化所有实例成员变量。

public class ProgramTest    {        int j;        public ProgramTest()        {            j = 4;            Console.WriteLine("I am ProgramTest,{0}", j);        }        static void Main(string[] args)        {            ProgramTest pt = new ProgramTest();            Console.Read();        }结果为:I am ProgramTest,4
在此次实验中,我们首先定义了一个私有成员j,经过初始化给他赋了一个初值4,当我实例化类ProgramTest时,就会执行实例构造函数。
诸如此类不带参数的构造函数叫“默认构造函数”,
如果某个类没有构造函数,则会自动生成一个默认构造函数,并使用默认值来初始化对象字段。
public class ProgramTest
    {
        int j;
        public ProgramTest()
        {
            Console.WriteLine("I am ProgramTest,{0}", j);
        }
        static void Main(string[] args)
        {
            ProgramTest pt = new ProgramTest();
            Console.Read();
        }
    }
结果为:I am ProgramTest,0  

也可以创建带有参数的构造函数

 public class ProgramTest
    {
        int j;
        public ProgramTest(int i)
        {
            j = 2;
            Console.WriteLine("I am ProgramTest,i={0},j={1}",i, j);
        }
        static void Main(string[] args)
        {
            ProgramTest pt = new ProgramTest(1);
            Console.Read();
        }

 

结果为:I am ProgramTest i=1,j=2 

 

那若是一个类中既有无参构造函数,又有有参构造函数那会怎么样呢?

 public class ProgramTest
    {
        int j;
        public ProgramTest()
        {
            j = 3;
            Console.WriteLine("I am ProgramTest 默认构造函数,j={0}", j);
        }
        public ProgramTest(int i)
        {
            j = 2;
            Console.WriteLine("I am ProgramTest 有参构造函数,i={0},j={1}",i, j);
        }
        static void Main(string[] args)
        {
            ProgramTest pt1 = new ProgramTest();
            ProgramTest pt2 = new ProgramTest(1);
            Console.Read();
        }

 

结果为:I am ProgramTest 默认构造函数 j=3
       I am ProgramTest 有参构造函数 i=1,j=2

 

可见,若是两者同时存在,那么看类实例化时,是怎么实例的。

2.私有构造函数

私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。 
如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。

 

    public class Test
    {
        private  Test()
        {
            Console.WriteLine("I am Test");
        }
    }
    public class ProgramTest
    {
        int j;
        private ProgramTest()
        {
            j = 3;
            Console.WriteLine("I am ProgramTest 默认构造函数,j={0}", j);
        }
        static void Main(string[] args)
        {
            Test t = new Test();
            ProgramTest pt1 = new ProgramTest();
            Console.Read();
        }
    }

结果:这时你会发现编译器会提示你,你无法创建Test的实例

(即使你在Test类中添加一个静态成员,结果依然会提示因为该构造函数受其保护级别的限制而不可访问)

若是只在自己类里有私有类呢?

  public class ProgramTest
    {
        int j;
        private ProgramTest()
        {
            j = 3;
            Console.WriteLine("I am ProgramTest 默认构造函数,j={0}", j);
        }
        static void Main(string[] args)
        {
            ProgramTest pt1 = new ProgramTest();
            Console.Read();
        }
    }

结果:I am ProgranmTest 默认构造函数,j=3

注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用private修饰符来清楚地表明该类不能被实例化。

若是一个类中既有实例构造函数又有私有构造函数,那么当实例对象是会怎么执行呢?

 public class Test
    {
        int i;
        private  Test()
        {
            i = 1;
            Console.WriteLine("I am Test 默认构造函数 i={0}", i);
        }
        public Test(int i)
        {
            Console.WriteLine("I am Test 有参构造函数 i={0}", i);
        }
    }
    public class ProgramTest
    {
        static void Main(string[] args)
        {
            Test t = new Test();  //编译器提示:因为该构造函数受其保护级别的限制而不可访问        
            Console.Read();

若是只执行有参构造函数呢?

  public class Test
    {
        int i;
        private  Test()
        {
            i = 1;
            Console.WriteLine("I am Test 默认构造函数 i={0}", i);
        }
        public Test(int i)
        {
            Console.WriteLine("I am Test 有参构造函数 i={0}", i);
        }
    }
    public class ProgramTest
    {
        static void Main(string[] args)
        {
            Test t = new Test(2);
            Console.Read();
        }
    }

结果:I am Test 有参构造函数 i=2

3.静态构造函数

静态构造函数用来初始化静态变量,这个构造函数是属于类的,而不是属于哪个实例的。

就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
 public class Test
    {
        static int i;
        static  Test()
        {
            i = 1;
            Console.WriteLine("I am Test 默认构造函数 i={0}", i);
        }
    }
    public class ProgramTest
    {
        static void Main(string[] args)
        {
            Test t1 = new Test();
            Console.Read();
        }
    }

结果为:I am Test 默认构造函数 i=1

静态构造函数的特点:

1.静态构造函数既没有访问修饰符,也没有参数。
2.
在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类,也就是无法直接调用静态构造函数,也无法控制什么时候执行静态构造函数。

3.一个类只能有一个静态构造函数,最多只能运行一次。

4.静态构造函数不可以被继承。
5.如果没有静态构造函数,而类中的静态成员有初始值,那么编译器会自动生成默认的静态构造函数。
如果静态默认构造函数和公有默认构造函数同时存在,会怎么样呢?

 

    public class Test
    {
        static int i;
        static  Test()
        {
            i = 1;
            Console.WriteLine("I am Test 静态默认构造函数 i={0}", i);
        }
        public Test()
        {
            Console.WriteLine("I am Test 公有默认构造函数 i={0}", i);
        }
    }
    public class ProgramTest
    {
        static void Main(string[] args)
        {
            Test t1 = new Test();
            Console.Read();
        }
    }

结果:I am Test 静态默认构造函数 i=1

 
     I am Test 公有默认构造函数 i=1

 

 

如果静态默认构造函数和公有有参构造函数同时存在,我实例化类让它调用静态默认构造函数会怎么样呢?
 public class Test
    {
        static int i;
        static  Test()
        {
            i = 1;
            Console.WriteLine("I am Test 静态默认构造函数 i={0}", i);
        }
        public Test(int j)
        {
            Console.WriteLine("I am Test 公有有参构造函数 i={0}", j);
        }
    }
    public class ProgramTest
    {
        static void Main(string[] args)
        {
            Test t1 = new Test();  //系统会提示错误       
            Console.Read();

        }

    }

如果静态默认构造函数和公有有参构造函数同时存在,我实例化类让它调用公有构造函数会怎么样呢?
    public class Test
    {
        static int i;
        static  Test()
        {
            i = 1;
            Console.WriteLine("I am Test 静态默认构造函数 i={0}", i);
        }
        public Test(int j)
        {
            Console.WriteLine("I am Test 公有有参构造函数 i={0}", j);
        }
    }
    public class ProgramTest
    {
        static void Main(string[] args)
        {
            Test t1 = new Test(2);
            Console.Read();
        }
    }

结果:I am Test 静态默认构造函数 i=1

     I am Test 公有有参构造函数 j=2

     由此可见只要调用这个对象(无论有没有参数)静态构造函数都会执行一次。

 

转载于:https://www.cnblogs.com/sunqiang/p/4369177.html

你可能感兴趣的文章
二叉树的下一个结点
查看>>
HDU 1527 取石子游戏(威佐夫博弈)
查看>>
单线程单元(STA)线程都应使用泵式等待基元
查看>>
Intent使用Parcelable传递对象
查看>>
C#利用Guid实现真随机数
查看>>
鼠标点击自定义文字展现特效JS代码
查看>>
node应用cross-env参数设置及PM2参数设置方法
查看>>
zipkin+owin wep api集成
查看>>
第三年
查看>>
ReentrantReadWriteLock——写写互斥(二)
查看>>
Maximal Square || LeetCode
查看>>
7.15 文件打开后点击打开下级文件
查看>>
LintCode 112---删除排序链表中的重复元素
查看>>
C++中的内存重叠问题
查看>>
while +next 循环 回到循环顶端
查看>>
修改MySQL事件
查看>>
Java第三方支付接入案例(支付宝)
查看>>
java图片裁剪和java生成缩略图
查看>>
Bzoj1029--Jsoi2007建筑抢修
查看>>
零基础学python-2.18 异常
查看>>