- .Net Framework Beta 2 初步介绍
- 2007-02-01
|
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的构造函数 |
