就他吧-9ta8为您提供:身份证查询、15位转16位身份证,手机号码归属地查询,IP地址查询服务,城市天气预报查询,列车时刻表简易快速查询等等查询服务,就他吧欢迎您的光临!!
梦幻Dot Net
科学地研究编程,品味开发的艺术
博客园
首页
新随笔
联系
订阅
管理
随笔-93 评论-627 文章-7 trackbacks-76
DotNet中的构造函数大聚会,并在此各显神通
(1)公共构造函数
共公的构造函数是最为常见的形式,允许类被使用者实例化。
C#实例如下:
1
class
myClass
2
{
3
//
Public Constructor
4
public
myClass()
{}
;
5
}
VB实例如下:
Class myClass
Class
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();
}
}
}
希望大家对构造函数进行补充。
posted on 2005-08-13 15:11
振河
阅读(1797)
评论(11)
编辑
收藏
所属分类:
C#
评论:
#1楼
2005-08-13 15:27 |
蛙蛙池塘
有意思
回复
引用
查看
#2楼
2005-08-13 16:13 |
zitiger
呵呵,不错不错.
回复
引用
查看
#3楼
2005-08-13 16:36 |
Ninputer
受保护的构造方法,就是专门提供给子类构造函数调用的。子类除了在自己的构造函数里调用父类的保护构造函数外,不能在其它地方调用,也不能用new运算符调用父类的保护构造函数(即用这个构造函数实例化)。不过在C#1.0里面有Bug所以你可以这样做……
回复
引用
查看
#4楼
2005-08-14 10:50 |
James [未注册用户]
记得刚学习c#的时候 那本坚果的书上就讲了这些。
回复
引用
#5楼
2005-08-15 09:25 |
振河
@Ninputer
你在C#1.1中测试过吗?C#1.0中有Bug,C#1.1中也有同样的Bug吗?
定义下面的受保护的构造函数
public class protectedClass
{
protected protectedClass()
{}
public string getStr()
{
return "jianglijun";
}
}
在下面的类中,通过定义的私有类来调用上面的类中的方法,可以正常运行
public class testProtected
{
public testProtected()
{}
public string test()
{
protectedClass s = new testclass();
return s.getStr();
}
private class testclass : protectedClass
{
public testclass():base()
{
}
}
}
是不是C#1.1中也存在着同样的Bug?
回复
引用
查看
#6楼
2005-08-15 09:57 |
R2
abstract sealed class
回复
引用
查看
#7楼
2005-08-15 11:08 |
alittlefish
别怪我咬文嚼字,少说了个反序列化构造函数。
回复
引用
查看
#8楼
2005-08-15 12:41 |
振河
@alittlefish
非常感谢你的补充,能不能具体的讲一下呢
回复
引用
查看
#9楼
[
楼主
] 2005-08-15 13:30 |
振河
关于序列化和反序列化,看看微软是怎么介绍“
.NET 中的对象序列化
”的。
回复
引用
查看
#10楼
2005-08-21 12:11 |
flyarror [未注册用户]
讲的有点意思,呵呵
回复
引用
#11楼
2005-10-06 20:21 |
grwdpy [未注册用户]
如果一个类的构造方法定义为private类型,其子类的无参数构造函数就会提示出错!
如:
public class Third
{
private Third()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
}
然后定义其子类
public class Fourthly:Third
{
private Fourthly()
{
}
}
上面类Fourthly就会出错!
回复
引用
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2005-08-13 15:23 编辑过
相关文章:
吃薏米仁治好“寻常疣(干日疮,瘊子)”的案例请在此登记。
C#下如何实现服务器+客户端的聊天程序
C# 中的委托和事件
DotNet中的构造函数大聚会,并在此各显神通
DotNet中的构造函数大聚会,并在此各显神通
用C#编写ActiveX控件(一)
相关链接:
所属分类的其他文章:
C#反射实例讲解
C#几种常用的排序算法
对《防止对 Visual Basic .NET 或 C# 代码进行反相工程》的思考
总结用三种方式实现类似MSN的消息弹出框
NUnit实践的之路
C#写的一个自动提醒的小东东,用来保护你的眼睛
C#写的一个代码生成器
.net反射技术的应用—如何调用Java的COM接口
DotNet中的构造函数大聚会,并在此各显神通
ASP调用.Net编写的动态库
最新IT新闻:
Google拟在9月发布自有浏览器 或采用火狐内核
微软正在构思将Wi-Fi带入汽车
对比测试:IE8 Beta 2 VS Firefox 3.0.1
iPhone存在严重密码安全漏洞
GC2008:星际争霸2进程报告 微调进程延续
博客园新闻频道
博客园首页
社区
清新的空气清晰的你愉快的心情陪伴你,欢迎来到梦幻Dot Net。
<
2005年8月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(24)
给我留言
查看留言
我参与的团队
Design & Pattern团队(3/848)
.NET 控件与组件开发(0/1361)
敏捷软件开发组织(0/278)
北京.NET俱乐部(2/1463)
Dot Net Web服务和Windows服务开发(0/231)
正则表达式团队(0/2)
随笔分类
.Net设计模式(21)
ASP.Net(9)
C#(12)
C#2005(2)
DotText
JavaScript(8)
Reporting Services(6)
SD Channel
SQL Server 2000(10)
Visio Studio 2005 WPF(2)
Web and Windows Service(5)
其他(7)
软件工程(7)
正则表达式(2)
随笔档案
2008年3月 (1)
2008年1月 (2)
2007年12月 (1)
2007年11月 (1)
2007年10月 (4)
2007年8月 (1)
2007年7月 (1)
2007年5月 (1)
2007年4月 (1)
2007年3月 (1)
2007年1月 (2)
2006年12月 (1)
2006年10月 (1)
2006年9月 (2)
2006年8月 (1)
2006年7月 (1)
2006年4月 (1)
2006年3月 (4)
2006年2月 (1)
2006年1月 (1)
2005年12月 (1)
2005年11月 (1)
2005年10月 (5)
2005年9月 (11)
2005年8月 (36)
2005年7月 (10)
文章分类
ASP.NET(2)
安全与加密(1)
管理(1)
生活(1)
数据库(2)
文章档案
2007年12月 (1)
2005年10月 (1)
2005年9月 (1)
2005年8月 (4)
相册
宝贝动物
精彩贴图
生活餐具
.NET技术网站
ASP.NET开发实践系列课程
ASP酷技术网
CodeProject
KnowDotNet
Visual Studio.net专栏
博客堂
发赛特技术网
酷网博客
孟宪会.NET开发者园地
太平洋开发编程技术与实例
天新网DotNet
新一代技术网
站长中国
正则表达式
中国C#技术网站
中文C#站
其他技术网
ASP.NET Forums 官方中文网站
MSDN中文站
动态网站制作指南
正则表达式网站(Eng)
中国BS网
中国Office Online
中国WEB开发者网络
数据库技术网站
SQL Server 提示与技巧
数据仓库之路
友情连接
就他吧服务
就他吧为您提供软件开发,网站设计,网站开发维护,各种办公软件、管理软件开发等等,详情请进入
http://www.9ta8.com
幽默笑话
笑话大全、智慧快餐、暴笑网文、高笑图片、恐怖故事、幽默短信、相声小品尽在其中,就他吧幽默站开心您每一天
积分与排名
积分 - 249904
排名 - 122
最新评论
1. re: DotNet WebService和WindowsService团队开通
1.博客园帐户名:yjmyzz 2.电子邮件:yjmyzz@126.com 3.博客园地址: 4.申请目的:学习和探讨Web服务或者Windows服务的开发原理,技巧以及实践经验. ...
--yjmyzz
2. re: DotNet WebService和WindowsService团队开通
1.博客园帐户名:Clefoo 2.电子邮件:clefoo@126.com 3.博客园地址: 4.申请目的:学习和探讨Web服务或者Windows服务的 ...
--Clefoo的马甲
3. re: DotNet WebService和WindowsService团队开通
我非常希望加入 1.博客园帐户名:aierong 2.电子邮件:aierong@126.com 3.博客园地址: ...
--aierong
4. re: COM+组件与COM+服务使用的区别
你好,我想请教您两个问题,关于开发COM+方面的.可以加下我QQ吗,QQ:285625240
--wangjianguo
5. re: C#几种常用的排序算法
不错啊,呵呵,理解了,谢谢你啊
--顾客
阅读排行榜
1. 正则表达式基础知识(21433)
2. 全面剖析C#正则表达式(18159)
3. C#反射实例讲解(9929)
4. .NET反射、委托技术与设计模式(9842)
5. .Net调用Java的WebService之亲身体验(9293)
评论排行榜
1. DotNet WebService和WindowsService团队开通(124)
2. 如何掌握并在实践中自如运用设计模式(51)
3. C#写的一个代码生成器(35)
4. 用.Net开发Windows服务初探(27)
5. .NET反射、委托技术与设计模式(21)
就他吧-9ta8伴您开心每一天