摘要: 终于开始动手写这篇文章了,有个网友催了我好几次,而我要么因为手头有事,要么就是被其他思路给叉开,以至这篇文章拖了好久还没开始写,今天终于可以静下心来完成它。用了.net工具来写程序的人,不难发现它有个好处,就是使用的内存不用释放,尤其在使用C#或者VB.Net来写程序,因为程序所占用的内存都是受系统托管的,因此内存的释放不需要程序员去操心。很多人从C语言或者C++等等语言转型过来,对于这一点往往很... 阅读全文
posted @ 2008-01-24 16:58 yfcomeon 阅读(81) | 评论 (0)编辑

思考一下下面三段这段程序的输出结果:

using System;
public class Type1
{
    
public static int i;
    
static Type1()//显式定义静态构造函数
    {
        Console.WriteLine(
"Explicit: In Type1 Class Constructor");
        i
=1;
    }

}


public class Type2
{
        
public static int i = Init(2);//由CSC编译器在编译时隐式创建静态构造函数
        public static int Init(int j)
        
{
        Console.WriteLine(
"Implicit: In Type2 Class Constructor");
        
return j;
        }

}


public class MainClass
{
    
static void Main()
    
{
        
//分别用下面三种情况下的Main函数,猜下输出结果:)
    }

}


1. 程序中有访问静态成员:

static void Main()
{
     Console.WriteLine(
"In Main Function");
     Console.WriteLine(Type1.i);
     Console.WriteLine(Type2.i);
}


2. 程序中没有访问静态成员,但有访问静态成员所声明的类中的实例成员:

static void Main()
{
     Console.WriteLine(
"In Main Function");
     Type1 t1 
= new Type1();
     Type2 t2 
= new Type2();
}


3.既不访问静态成员,也不访问实例成员

static void Main()
{
     Console.WriteLine(
"In Main Function");
}


    情况1下,输出编译和运行结果如下:

E:CSC>csc staticfield.cs
Microsoft (R) Visual C# 
2005 编译器 版本 8.00.50727.42
用于 Microsoft (R) Windows (R) 
2005 Framework 版本 2.0.50727
版权所有 (C) Microsoft Corporation 
2001-2005。保留所有权利。

E:CSC
>staticfield.exe
Implicit: In Type2 Class Constructor
In Main Function
Explicit: In Type1 Class Constructor
1
2

 

    情况2下,输出结果:

E:CSC>staticfield.exe
Implicit: In Type2 Class Constructor
In Main Function
Explicit: In Type1 Class Constructor

 


    情况3下,输出结果:

E:CSC>staticfield.exe
In Main Function

 

     是否跟我们想象中的结果不一样呢?^_^
    根据上面三个测试,我们可以得到如下结论(针对类中有定义静态字段的情况):

if(如果为类显式定义静态构造函数,例如上面的Type1)
{
    
if(程序中有访问该类的任意静态或实例成员)
    
{
         在进入Main函数之后,第一次访问该类中所定义的任何静态或实例成员之前,先调用静态构造函数;
         以后将不再调用该静态构造函数,同一个静态构造函数最多只调用一次!
    }

    
else
    
{
         程序中不调用该类的静态构造函数;
    }

else
{
    
if(程序中有访问该类的任意静态或实例成员)
    
{
         在执行Main函数中的代码之前,先调用静态构造函数;
         以后将不再调用该静态构造函数,同一个静态构造函数最多只调用一次!
    }

    
else
    
{
         程序中不调用该类的静态构造函数;
    }

}

静态构造函数:
(1)用于对静态字段、只读字段等的初始化。              
(2)添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。        
(3)类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数
(4)静态构造函数是不可继承的,而且不能被直接调用。            
(5)如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。    
(6)任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。  
(7)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。


**************************************************

* 静 态 构 造 函 数 练 习
* (1)①②③……为执行顺序
* (2)输出结果: static A()
* static B()
* X = 1, Y = 2
***************************************************/
using System;
class A
{
public static int X;

static A() //④ 执行完后返回到③
{
= B.Y + 1;
Console.WriteLine(
"static A()");
}
}

class B
{
public static int Y = A.X + 1//③ 调用了A的静态成员,
// 转到A的静态构造函数---->

static B() //② 如果带有初始值设定项的静态字段,
// 执行该类的静态构造函数时,
// 先要按照文本顺序执行那些初始值设定项。
// 转到初始值设定项---->
{
Console.WriteLine(
"static B()");
}

static void Main() //① 程序入口,
// 如果类中包含用来开始执行的 Main 方法,
// 该类的静态构造函数将在调用 Main 方法之前执行。
// 转到B的静态构造函数---->
{
Console.WriteLine(
"X = {0}, Y = {1}", A.X, B.Y);//⑤ 输出结果
Console.ReadLine();
}
}

posted @ 2008-01-24 16:10 yfcomeon 阅读(38) | 评论 (0)编辑
目前 javascript的实现继承方式并不是通过“extend”关键字来实现的,而是通过constructor function和prototype属性来实现继承。首先我们创建一个animal
js 代码
 
  1.  var animal function(){  //这就是constructor function 了 
  2.    this.name = 'pipi';    
  3.    this.age = 10;      
  4.    this.height = 0;      
  5. }      
  6.  //建立一个动物的实例    
  7.  var a1 =  new animal ();   

构造函数与其他普通函数区别在于,1.构造函数里有 this关键字,2.调用构造函数是使用的new关键字。通过new运算符调用构造函数animal 后,系统就会返回一个对象,这个对象就相当于
js 代码
  1. var a1 = { name:'pipi' ,age:10,height:0 }  
  2.   
  3. //或者  
  4. var a1 = new Object();  
  5. a1.name='pipi';  
  6. a1.age = 10;  
  7. a1.height = 0; 
等同这样的方式来产生js对象。

到这里我们知道如何在js中定义一个类了,接下来我们展示如何写一个cat

js 代码
 
  1. var cat = function(){    
  2. this.play = function(){     
  3.  alert('cat play')    
  4.  }    
  5.  }    
  6.  cat .prototype = new animal ();    
  7.  //prototype 属性指向一个对象 
  8. var c1 = new cat();

到这里,cat就继承了animal 对象,类cat的一个实例对象c1拥有属性name,age,height,和方法play了。
那么
prototype起到了一个什么样的作用呢?
prototype就好比一个指针,它指向一个object,这个object就称为子类对象的原型。当cat的对象被创建的时候,由于cat的构造函数拥有prototype属性,那么cat的实例就会间接指向这个原型对象了(说成间接的是因为每个object都有一个constructor 属性指向它的构造函数)。
那么问题来了,“当我们修改对象 c1 的name属性的时候,会不会修改它prototype的name属性值呢?”,答案是否定的。
接下来详细解析:
1.访问name属性: 首先当我们第一次访问c1.name的属性的时候,我们会得到值“pipi”,这个和我们预料中的一样。但是计算过程你未必知道。
它计算的过程是这样的:第一步:检查c1对象中是否有name属性,找到的话就返回值,没有就跳到第二步,显然没有找到,因为cat的构造函数中没有定义。第二步:当第一步没有找时,去间接访问
prototype对象所指向的object,如果在prototype对象中找到的name属性的话,就返回找到的属性值。如果还是没有找到的话,再去递归地寻找prototype对象的prototype对象(去找它的爷爷),一直到找到name属性或者没有prototype对象为止。如果到最后还是没有找到name属性的话就返回undefined。

2.设定name属性:当我们设定c1对象的name属性时,及调用 c1.name= ' new name';  这个过程就简单多了。首先检查是否对象已有该属性,若已存在则修改当前值,若不存在则为该对象新增一个属性并设定当前值。值得一提的是,在设定值的过程中没有去访问
prototype属性。

为了加深理解,我们再看一个 read-write-read 的过程,第一次read的时候,由于自己的对象没有name属性,那么就会返回的原型对象的name属性的值。第二步,写入name的值,同样没发现本身对象有name属性,那么就在本身对象上新建一个name属性,然后赋值。第三步,再次读取name属性,由于在第二步中已经新建了name属性,此时就返回在第二步中设定的值。值得一提的是,在这三步中没有改变原型对象的值。

好了,到此详细分析了 javascript对象是如果实现继承的,其实和其他的面向对象语言不一样的是,javascript的继承机制是对象的原型继承而不是类型继承。

转:http://jimichan.javaeye.com/blog/119815
posted @ 2007-11-30 16:08 yfcomeon 阅读(165) | 评论 (0)编辑
-- 获取指定页的数据 
CREATE PROCEDURE dbo.pagination

@tblName varchar(255), -- 表名 
@strGetFields varchar(1000= '*'-- 需要返回的列 
@fldName varchar(255)=''-- 排序的字段名 
@PageSize int = 10-- 页尺寸 
@PageIndex int = 1-- 页码 
@doCount bit = 0-- 返回记录总数, 非 0 值则返回 
@OrderType bit = 0-- 设置排序类型, 非 0 值则降序 
@strWhere varchar(1500= '' -- 查询条件 (注意: 不要加 where) 

AS 

declare @strSQL varchar(5000-- 主语句 
declare @strTmp varchar(110-- 临时变量 
declare @strOrder varchar(400-- 排序类型 
if @doCount != 0 
begin 
if @strWhere !='' 
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where '+@strWhere 
else 
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' 
end 
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况 

else 
begin 
if @OrderType != 0 
begin 
set @strTmp = '<(select min' 
set @strOrder = ' order by [' + @fldName +'] desc' 
--如果@OrderType不是0,就执行降序,这句很重要! 
end 

else 
begin 
set @strTmp = '>(select max' 
set @strOrder = ' order by [' + @fldName +'] asc' 
end 
if @PageIndex = 1 
begin 
if @strWhere != '' 
set @strSQL = 'select top ' + str(@PageSize+' '+@strGetFields+ ' from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder 
else 
set @strSQL = 'select top ' + str(@PageSize+' '+@strGetFields+ ' from ['+ @tblName + ''+ @strOrder 
--如果是第一页就执行以上代码,这样会加快执行速度 
end 

else 
begin 
--以下代码赋予了@strSQL以真正执行的SQL代码 
set @strSQL = 'select top ' + str(@PageSize+' '+@strGetFields+ ' from [' 
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize+ ' ['+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'+ @strOrder 
if @strWhere != '' 
set @strSQL = 'select top ' + str(@PageSize+' '+@strGetFields+ ' from [' 
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize+ ' [' 
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' ' 
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder 
end 
end 
exec (@strSQL)
GO 
posted @ 2007-11-08 10:16 yfcomeon 阅读(70) | 评论 (2)编辑
     摘要: 约定: 1.”attribute”和”attributes”均不翻译 2.”property”译为“属性” 3.msdn中的原句不翻译 4.”program entity”译为”语言元素”Attributes in C#介绍Attributes是一种新的描... 阅读全文
posted @ 2007-11-05 09:48 yfcomeon 阅读(23) | 评论 (0)编辑