2004年06月11日

我读《Microsoft .NET框架程序设计(修订版)》——DoItNow的读书笔记5

关于值类型和引用类型的理解

.NET CLR中有两种数据类型 值类型和引用类型. 其中值类型是一种简单的数据类型 其是在 应用程序的线程栈上进行分配和即时内存回收的. 引用类型 是在CLR托管堆上进行内存分配的, 同时其在托管堆上分配的地址被记录在 应用程序的线程栈上, 最后他的内存回收不是即时的 其是有GC进行不定时的收集.

.NET中所有的类型 都继承于System.Object, 当然值类型也是如此. 不过值类型是通过继承ValueType类型间接的继承于Sytem.Object.   继承或间接继承于System.Object的类都是 引用类型(有特例) 包括ValueType类型. 但是经过ValueType类型的处理(具体怎么处理的我也不清楚:( ),继承于ValueType的类 便成了 值类型(有点奇怪 从引用类型继承下来的东西成了 值类型 :( ).  而有ValueType继承得到的值类型, 便不内为其他值类型的基类了,也就是说所有的值类型 都是直接继承于 ValueType.(值类型不能被继承着个也不奇怪, 继承是引用类型的专利 因为子类在获取父类的方法 属性的时候 需要使用的 应用表 只有在引用类型中才有的. )

我读《Microsoft .NET框架程序设计(修订版)》——DoItNow的读书笔记4

 最近几天晚上 一直都在喝酒,没有空看书. 昨晚好不容易看了一点关于 类构造器得问题(同时 前些天也跟刘小东谈论过这个问题).那就是一个类可不可以没有构造函数. 先看这段代码: using System;
namespace Xieran.Test
{
 public class App
 {
  static public void Main(System.String[] args)
  {
   System.Console.WriteLine(“Hi,Mr.Liuxd!”);
   System.Console.ReadLine();
  }
 }
}
其编译是可以通过 并且可以得到预想得答案数据.     好像一个类没有构造函数也可以得.  难道这是真得么?  通过ILDasm查看IL 代码如下:

 

可以看到 .ctor():void  ,这个便是IL里面得类得构造函数. 呵呵 原来是CSC在编译我们代码得时候 自动加了一个 构造函数. 自此,一个类得构造函数是不是必须得 就不言自明

发现了MSDN的两个错误 不知道大家的看法如何

1. 关于Parameter, MSDN上说:”对于 OleDbDataAdapter 对象和 OdbcDataAdapter 对象,必须使用问号 (?) 占位符来标识参数。对于 SqlDataAdapter 对象,必须使用命名参数。”  不过我写了以下代码 (用命名参数在OleDbDataAdapter中使用)是可以通过的,难道”必须使用问号” ? 不解:(

OleDbConnection conn= new OleDbConnection(this.GetConnString());
   conn.Open();
   string sql= “select * from Forum_Class where isdel=@isdel“;
   OleDbDataAdapter adapter= new OleDbDataAdapter();
   OleDbCommand comm= new OleDbCommand();
   comm.CommandText= sql;
   comm.Connection= conn;
   comm.Parameters.Add(“@isdel”,”1″);
   adapter.SelectCommand= comm;
   DataSet ds= new DataSet();
   adapter.Fill(ds,”myTable”);
   conn.Close();

   this.Label1.Text= ds.Tables[0].Rows.Count.ToString();

2. 对于参数的类型 MSDN说:”可以通过将 Parameter 对象的 DbType 属性指定为特定的 System.Data.DbType,以一般的方式来指定 Parameter 的类型。此外,ADO.NET 将从 Parameter 对象的 DbType 推断 Parameter 的 .NET Framework 数据提供程序类型”  但是我按照MSDN的说法写下面的代码是无法通过的. :(

OleDbConnection conn= new OleDbConnection(this.GetConnString());
   conn.Open();
   string sql= “select * from Forum_Class where isdel=@isdel“;
   OleDbCommand comm= new OleDbCommand();
   comm.CommandText= sql;
   comm.Connection= conn;
   comm.Parameters.Add(“@isdel”,System.Data.DbType.String,20); //M处
   comm.Parameters["@isdel"].Value= “1″;
   DataSet ds= new DataSet();
   adapter.Fill(ds,”myTable”);
   this.Label1.Text= comm.ExecuteScalar().ToString();
   conn.Close();

编译器提醒说在M处,无法从“System.Data.DbType”转换为“System.Data.OleDb.OleDbType”

有人对以上两点,有好的解释么? 谢谢

2004年06月07日

昨天喝酒有点醉了,被朋友拉去 蹦迪.

这可是我第一此去迪厅. 给我的感觉就是里面太乱了.朋友说 他听到 那种激扬的音乐 就像听得自己的血液在流动, 我说只是脑袋有点痛(也许在办公室待的时间太长了,不习惯这种氛围亚 :( ). 朋友与其他的红男绿女们,谁着音乐在那里摇曳,我默默的坐在一边喝啤酒,他们拉了我好几次 让我下去 跳, 我都拒绝了(其间还有两个MM过来拉我). 不过在前面领舞的MM确实漂亮 呵呵.

大约两点多吧,朋友说要去 洗浴. 我推脱了好久,才脱身,打车回家.

今早,不到5点 ,朋友给我打电话.说我没有去,应该感到后悔 说洗浴中心的MM如何如何的漂亮 足疗的如何如何舒服. 我只是半梦半醒间 我力应答着.也是昨夜我就没有很好的睡觉—喝多了.

昨天喝酒有点醉了,被朋友拉去 蹦迪.

这可是我第一此去迪厅. 给我的感觉就是里面太乱了.朋友说 他听到 那种激扬的音乐 就像听得自己的血液在流动, 我说只是脑袋有点痛(也许在办公室待的时间太长了,不习惯这种氛围亚 :( ). 朋友与其他的红男绿女们,谁着音乐在那里摇曳,我默默的坐在一边喝啤酒,他们拉了我好几次 让我下去 跳, 我都拒绝了(其间还有两个MM过来拉我). 不过在前面领舞的MM确实漂亮 呵呵.

大约两点多吧,朋友说要去 洗浴. 我推脱了好久,才脱身,打车回家.

今早,不到5点 ,朋友给我打电话.说我没有去,应该感到后悔 说洗浴中心的MM如何如何的漂亮 足疗的如何如何舒服. 我只是半梦半醒间 我力应答着.也是昨夜我就没有很好的睡觉—喝多了.

我读《Microsoft .NET框架程序设计(修订版)》——解然的读书笔记3

 关于类型转换中的 is和as的使用

is作为运算符出现在类型转换中的.其作用是检查对象的运行时类型是否与给定类型兼容,在这种类型兼容性判定中要进行一次类型转换. 然后根据类型的兼容性进行其他处理工作.

AS 也是一个运算符, 对某个对象进行 as操作后 分为两种情况 1.如果类型兼容 操作成功 就会返回 as后的新类型 2.如果操作失败就会返回null.

 这样就可以看出两操作符的 性能比较了.比如我原来 使用FindControl()方法 根据一个 变量名称的string 去获取这个变量时 是这么写的:

if(this.FindControl(“myCheck”) is System.CheckBox) //M处
{
  System.CheckBox tempCheck= (System.CheckBox)this.FindControl(“myCheck”);//N处
  tempCheck.Checked= true;
}

很明显以上操作在M和N处分别进行了 两次类型转换.

如果现在改成这么写

System.CheckBox tempCheck= this.FindControl(“myCheck”) as System.CheckBox;//L处
if(tempCheck!=null
{
  tempCheck.Checked= true;
}

现在就只是在L处 进行了一次类型转换.

类型转换在CLR中,是比较消耗性能的, 现在大家应该知道怎么办了吧.(至少我以后不会用第一中方法了)

2004年06月03日

我读《Microsoft .NET框架程序设计(修订版)》——解然的读书笔记2

 昨天晚上,看了一下 class和struct的比较.简单谈一下自己的体会

在本书中,首先谈到在c++等语言中是有struct的.而Java是一个精简基本类的编程语言,Java没有提供struct类型(字所有去处这种类型,是因为struct完全可以有class来实现).
然后又谈到c# 在很大程度上参考了Java(这个还又说,地球人都知道了:)).但是又把struct从c++中托了回来, 这究竟为什么呢?

原来struct是值类型使用,而class是引用类型使用.建立struct的时候是在栈上分配内存,而class是在托管堆上分配内存. 这样差别就出来了: 当向栈上push的时候分配一块内存,当从栈上pop的时候内存自动释放.  而在clr的托管堆上就不同了,当你new一个class成一个object的时候分配一块内存. 但是当你使用完本对象销毁的时候,内存空间是 不能实时释放的.要等GC不定时间进行收集. 这个内存收集过程又会占有很大一部分资源(关于内存收集方面的内容,本论坛内有其他几篇文章论述).

所有出于性能方面的考虑 我们在写程序的时候能构使用struct的地方,就尽量不要使用class

2004年06月01日

today is children’s day. happy DAY to myself, heh.

on the winter in 1979, i was born in a small country in shandong. there i spend my first 18 years.

2004年05月31日

我读《Microsoft .NET框架程序设计(修订版)》——DoItNow的读书笔记

今天早上, 我读完了第二章, 感觉以上评论决不为过. 本书对 CLR等底层的讲述 之透彻, 绝非两句”wonderful”可以表述.  在此我想谈谈我对 CLR 在跨语言方面的理解.

首先 CLR的功能是建立在 CLR类型(CTS CommonTypeSystem) 的基础之上, 每种具体的.Net语言(如C#,J#等)的类型都是 CLR类型 的子集.

然后 当你用某种语言 写了一段代码后,有各种语言的编译器 把其编译成IL(例如csc.exe 把你的 .cs文件编译成能够受 CLR 支持的IL.)  无论你在某种语言使用的何种数据类型,变量,方法,事件 都会在IL表示为 属性和操作(在IL中只有这两种表示)

最后 当你IL的这种 属性和操作 是都能够被 各种语言所识别使用的.(这样就避免的C#的类型不能被VB.net识别的问题了)

这次培训的是 北京大学的一个老教授 据说很厉害

不过三天的课 听下来, 好像没有什么感觉 :(

白交了300块钱, 多亏是公司出亚 要不那就太亏了