DotNet中的构造函数大聚会,并在此各显神通
(1)公共构造函数
        共公的构造函数是最为常见的形式,允许类被使用者实例化。
C#实例如下:
1class myClass
2{
3    //Public Constructor
4    public myClass(){};
5}

VB实例如下:
Class myClassClass myClass
{
    public Sub new()sub new()
    end sub
}

(2)私有构造函数
        私有构造函数是一种特殊的实例构造函数,通常应用于只包含静态成员的类中,这些类经常作为实用类使用。

如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许被其他类(嵌套类除外)创建该类的实例。例如:
class myClass
{
    private myClass(){};
    public static double e = 2.71828;
}

声明空构造函数可阻止自动生成默认构造函数。注意,如果不对构造函数使用访问修饰符,则在默认情况下它仍是私有构造函数。但是,通常显示地使用private(私有)修饰符来清楚地表明该类不能被实例化。

当没有实例字段或实例方法或调用方法以获得类的实例时,私有构造函数可用于阻止创建类的实例。

私有函数的另一个应用场合是在单件(Singleton)模式中,是该模式实现的关键。私有函数保证类的实例只能通过该类中的静态方法实现,从而保证实例的唯一性。
        有关单件模式的介绍,请参见:http://fineboy.cnblogs.com/archive/2005/08/11/212782.html

(3)保护构造函数
        受保护的构造函数使类可以被子类实例化,在大多数场合无用。但如果希望类只能被工厂实例化时,就用到了这个特性。下面是类只能被工厂实例化的例子:
        首先,我们使类的构造函数被声明为受保护的构造函数,即除了类和子类,都不能访问构造函数。

Using System;
Namespace Staticconstructor
{
    public class myNewClass
    {
        protected myNewClass()
        {
        }
    }
}

这样就保证了不能直接实例化myNewClass,然后我们创建一个工厂,负责实例化这个类。

Using System;
Namespace Staticconstructor
{
    public class myFactory
    {
        public myFactory ()
        {
        }
        public myNewClass CreatemyNewClass()
        {
            return  new  myNewClass();
        }
    }
}

然而代码无法通过编译,因为myNewClass的构造函数是受保护的,无法被myFactory实例化。结果是其他类无法实例化myNewClass,myFactory也不能。

由于myNewClass的构造函数是受保护的,因此其子类可以实例化这个类。但我们不能将工厂类作为其子类,这样会导致耦合性。同时我们也不希望让类本身实例化自身,因为需要静态方法。

为了解决这个矛盾,要用到内部类。我们在myFactory内部创建一个私有的myNewClass的子类,然后通过该子类获得myNewClass的实例。

Using System;
Namespace Staticconstructor
{
    public class myFactory
    {
        public myFactory ()
        {
        }
        public myNewClass CreatemyNewClass()
        {
            return  new  mySubClass ();
        }
        private class mySubClass : myNewClass
        {
            public mySubClass():base()
        }
    }
}

当然,myFactory实际返回的mySubClass,而不是myNewClass,不过对客户而言并无区别。

这种方法也有缺陷,如果定义一个myNewClass的子类,即可通过该子类实现其实例化,但这种方法在实际中已经够用。

(4)静态构造函数        
        静态构造函数用于初始化类,在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。静态构造函数的声明方式如下:
Using System;
Namespace Staticconstructor
{
    public class myNewClass
    {
        static myNewClass()
        {
        }
    }
}

静态构造函数既没有修饰符,也没有参数。它在创建第一个实例或引用任何静态成员之前将被自动初始化类,无法直接调用静态构造函数。

在程序中,用户无法控制何时执行静态构造函数。

静态构造函数的典型用途是当类使用日志文件时,将使用这种构造函数向日志文件中写入项。下面是静态构造函数的使用示例:
using System;
namespace StaticConstructor
{
    public class myClass
    {
        public myClass()
        {
            System.Console.WriteLine("New Instance Created");
        }

static myClass()
        {
            System.Console.WriteLine("This is static constructor");
        }

public static void Hello()
        {
            System.Console.WriteLine("Hello");
        }

public static void Main()
        {
            myClass.Hello();
            myClass ms = new myClass();
            System.Console.WriteLine();
        }
    }
}

希望大家对构造函数进行补充。

转载于:https://www.cnblogs.com/xxd402/archive/2009/01/08/1371486.html

(转帖)DotNet中的构造函数大聚会相关推荐

  1. php中的构造函数和析构函数,php 中构造函数和析构函数

    构造函数: 在对象实例化时被调用,一个类中只能有一个构造函数,在类中起初始化的作用. 析构函数: 在对象结束时被自动调用. 话不多说,用一段代码来说明两者的区别: //定义一个类 class Pers ...

  2. Javascript中的陷阱大集合【译】

    参考:http://www.2cto.com/kf/201111/111203.html 昨天晚上在自己的个人技术博客上翻译了一篇有关Javascript的文章,今天想想还是把它投稿到博客园吧,大家可 ...

  3. VR创投寻鹰会,一场深圳VR行业人的大聚会

    10月29日下午,一场深圳VR行业人的大聚会在深圳产学园基地硬蛋空间成功举行. 10月29日下午2点,云岸金服联合远望资本.CIBN微视听.硬蛋科技.活动行.多有米等多家机构共同举办的VR创投寻鹰会在 ...

  4. 在React / React Native中使用构造函数与getInitialState有什么区别?

    本文翻译自:What is the difference between using constructor vs getInitialState in React / React Native? I ...

  5. 大聚会——CSS选择器

    大聚会--CSS选择器 通配符选择器 标签选择器 类选择器 ID选择器 交集选择器 并集选择器(重点) 后代选择器(重点) 子元素选择器 属性选择器 结构伪类选择器 `nth-child(n)` 和 ...

  6. [计划安排] 408经验帖(转自某大神)

    [详细计划安排] 408经验帖(转自某大神) 附:各大高校专业课资料整理可以看一下我的博客主页上传的资源哦!感谢关注,点赞,评论♥ 时间安排: 5月中开始复习,中间因为各种杂事耽误一个月,8月前每6天 ...

  7. 谈谈WEB开发中的苦大难字符集问题

    记得刚做javaweb开发的时候被这个编码问题搞得晕头转向,经常稀里糊涂的编码正常了一会编码又乱了.那个时候迫于项目进度大多都是知其然不知其所以然.后来有时间就把整个体系搞了个遍,终于摸通了来龙去脉. ...

  8. java add offer_图解Java中的5大队列!(干货收藏)

    Java 中的队列有很多,例如:ArrayBlockingQueue.LinkedBlockingQueue.PriorityQueue.DelayQueue.SynchronousQueue等,那它 ...

  9. python图片-Python中的十大图像处理工具

    原标题:Python中的十大图像处理工具 导读:本文主要介绍了一些简单易懂最常用的Python图像处理库. 作者:Parul Pandey 来源:大数据文摘(ID:BigDataDigest) 当今世 ...

最新文章

  1. mysql 线上加索引_mysql手札,唯一索引引发的线上事故
  2. uglify压缩angular控制器注意
  3. python php linux-linux怎么运行python?
  4. (chap6 Http首部) 请求首部字段 AuthorizationExpectFromHostIf-Match
  5. 记录一个AndroidX和Android support库不能共存的坑
  6. Android 之View绘图原理总结
  7. 这就是深度学习如此强大的原因
  8. Entity Framework 6 Recipes 2nd Edition(13-4)译 - 有效地创建一个搜索查询
  9. 甭给《程序员》把脉——你不是主编
  10. 深度卷积神经网络(CNN)特征层的可视化
  11. 使用 Scrapy 框架对重复的 url 无法获取数据,dont_filter=True
  12. 京东双叠加神单漏洞券操作教程
  13. HTML5期末大作业:餐饮饮食美食主题网站设计——重庆火锅(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 web学生网页设计作业源码...
  14. Linux如何设置开机自启动
  15. 例说hg(一)————hg sum 与hg tip区别
  16. android wifi连接流程,(九十三) Android O 连接WiFi AP流程梳理续——保存网络-Go语言中文社区...
  17. 车载以太网物理层PMA测试和IOP测试属于Layer 1(物理层)
  18. 学习记录 动态规划实时更新
  19. iPhone 6 图像渲染揭秘
  20. iOS-UIWebview WKWebView 页面缩放

热门文章

  1. 磁盘最优存储与磁带最优存储问题
  2. android sdk linux 离线包,android sdk离线安装
  3. java关于安卓,苹果输入表情数据库处理
  4. uml点餐系统活动图_UML活动图(转载)
  5. 通过jira开放接口创建issue时指定链接的问题
  6. 西门子840d sl HMI ncu地址修改办法
  7. 如何提升文档编写能力
  8. 赣南师范大学考研c语言真题,赣南师范大学651C语言程序设计科目三考研真题详解...
  9. 微信小程序学习6:页面生命周期回调函数
  10. Chrome 浏览器翻译插件划词翻译