框架源码学习

2008-08-07 13:33:46.0     推荐:0    收藏:0    评论:0     来源:中国IT实验室
Singleton模式,由于其实现相对简单,所以号称设计模式中最简单的模式.
但是static通常会给你造成一些障碍.不信啊,那你就看看吧,而且还有几个Effective C#条款 :) 希望不会让你失望.

该篇并没有涉及到.Net Framework源码,就算是挂羊头卖狗肉吧.希望延续上篇的高质量.
让我们先来写个简单的SqlHelper吧,封装SQL数据库的操作.

using System;
using System.Data;
using System.Data.SqlClient;

namespace APeng
{
public class SqlHelper
{
private string m_connString = "Data Source=(local);" +
"User ID=sa;Password=password;Initial Catalog=discuz;Pooling=true";
//Sql数据库连接字符串

public SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(m_connString);

try
{
PrepareCommand(cmd, conn, cmdType, cmdText, cmdParms);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
catch (Exception ex)
{
conn.Close();
conn.Dispose();
throw ex;
}
}

private void PrepareCommand(SqlCommand cmd, SqlConnection conn, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
{

if (conn.State != ConnectionState.Open)
conn.Open();

cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = cmdType;

if (cmdParms != null)
{
foreach (SqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
}
}

这段代码大家应该很熟悉了,接下来让我们来使用它.


using System;
using System.Data;
using System.Data.SqlClient;

namespace APeng
{
class Program
{
static void Main(string[] args)
{
SqlHelper helper = new SqlHelper();
string cmdText = "select fid,name from dnt_forums";
using (SqlDataReader reader = helper.ExecuteReader(CommandType.Text, cmdText, null))
{
while (reader.Read())
{
Console.WriteLine("编号:" + reader["fid"]);
Console.WriteLine("名称:" + reader["name"]);
}
}

Console.Read();
}


}
}



程序正常输出: 编号:1 名称:版块1 编号:2 名称:版块2
很简单,不是嘛.

接下来我们将要优化这个SqlHelper
一) 将SqlHelper中的private string m_connString = "......" 修改成 private static readonly string m_connString = "......"

这个修改是否有必要呢? (如果没能给我带来什么好处,我为什么要修改呢,所以你得说服我!)

小菜先在A地方实例化一个SqlHelper.
SqlHelper helper1 = new SqlHelper();
那么会有如下构造过程:
1.为数据成员m_connString分配内存空间,此时空间存储数据为null
(如果是值类型如int,float,double等,空间存储数据为0,如果是引用类型空间存储数据为null,下面还会详细说明)
2.执行数据成员m_connString的初始化语句,也就是上面的private string m_connString = "......"
(那么现在空间存储数据为"......")
3.执行SqlHelper的构造函数

小菜然后在B地方又实例化一个SqlHelper.
SqlHelper helper2 = new SqlHelper();
那么会有如下构造过程:
1.为数据成员m_connString分配内存空间,此时空间存储数据为null
2.执行数据成员m_connString的初始化语句,也就是上面的private string m_connString = "......"
(那么现在空间存储数据为"......")
3.执行SqlHelper的构造函数

噢,有没有搞错啊,怎么一直为m_connString分配内存空间.
而且老是把m_connString空间存储数据置为相同的 "......"
该死的,你就不能聪明点,做一次就够了.(浪费我们宝贵的时间和宝贵的内存资源)

唉,看来我们得自己动手优化了.怎么优化呢?
等等,小菜刚才说什么来着?修改成private static readonly string m_connString = "......".
那它能改变这种状况吗?

小菜先在A地方实例化一个SqlHelper.
SqlHelper helper1 = new SqlHelper();
那么会有如下构造过程:
1.为静态数据成员m_connString分配内存空间,此时空间存储数据为null
(如果是值类型如int,float,double等,空间存储数据为0,如果是引用类型空间存储数据为null,下面还会详细说明)
2.执行静态数据成员m_connString的初始化语句,也就是上面的private static readonly string m_connString = "......"
(那么现在空间存储数据为"......")
3.执行SqlHelper的构造函数

小菜然后在B地方又实例化一个SqlHelper.
SqlHelper helper2 = new SqlHelper();
那么会有如下构造过程:
1.执行SqlHelper的构造函数
[第1页]   [第2页]   [第3页]   [第4页]   [下一页]
您可以针对本文进行:[评论]  [收藏]  [推荐]  
  • 共有0条评论  点击查看更多评论
  • 网友评论仅供网友表达个人看法,并不表明e800同意其观点或证实其描述
我想发表评论:
用户名密码
  • 匿名发表
    验证码:
关于 .Net Framework   框架源码   的新闻