skyfeathers

2011年11月21日 #

php和.net中的Md5函数如何兼容

最近正在做一个asp.net 与PHP项目相互转化的问题,对php不太清楚,基本涉及最重要的密码转换问题,查到网上找一个应是最好的文章,摘录于此,日后大力学习。


以下内容为引用:

最近在做一个php和.net共同组成的项目,接收.net部分传送过来的一个经md5过的数据,我惊奇的发现,居然和php进行md5的结果不同,这是为啥呢?

.net端程序是这么写的:

    System.Text.ASCIIEncoding encoding=new System.Text.ASCIIEncoding();
    byte[] bytesSrc = encoding.GetBytes("xutf");
    System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
    byte[] result = md5.ComputeHash(bytesSrc);
    string keyMd5=Convert.ToBase64String(result);

输入的"xutf",得出的结果是"5j1NYFDLhM9dc/XOfRwkyg=="。

php端程序是这么写的:

    $keymd5=base64_encode(md5("xutf"));

同样输入"xutf",得出来的结果却是"ZTYzZDRkNjA1MGNiODRjZjVkNzNmNWNlN2QxYzI0Y2E="。

这样下去,程序没法写了,同样的操作为什么结果不同呢?

原 来php的md5函数输出的结果是转换成16位表示的md5结果,而.net的md5.ComputeHash方法输出的结果是原始的md5结 果。(注:php5的md5函数string md5 ( string str [, bool raw_output] )开始支持输出原始结果,参数raw_output只支持php5,但是我在使用php4)

如果想让php的结果等同于.net的结果,那么需要对md5函数的结果进行16进制字符串到标准字符串的转换。
那么php程序应改为:

    $md5hex=md5("xutf");
    $len=strlen($md5hex)/2;
    $md5raw="";
    for($i=0;$i<$len;$i++) { $md5raw=$md5raw . chr(hexdec(substr($md5hex,$i*2,2))); } $keyMd5=base64_encode($md5raw);


如果想让.net的结果等同于php的结果,那么需要把md5.ComputeHash方法输出的结果转换成16进制字符串,那么.net程序应该改为:

    System.Text.ASCIIEncoding encoding=new System.Text.ASCIIEncoding();
    byte[] bytesSrc = encoding.GetBytes("xutf");
    System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
    byte[] result = md5.ComputeHash(bytesSrc);

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < result.Length; i++)
    sb.AppendFormat("{0:x2}", result[i]);
    string s1=sb.ToString();
    byte[] bytesmd5 = encoding.GetBytes(s1);
    string keymd5=Convert.ToBase64String(bytesmd5);

posted @ 2011-11-21 14:07 天羽 阅读(60) 评论(0) 编辑

2011年11月17日 #

最全的建站流程

        其实,大家都知道,网站建设早已不再神秘,再也不是什么高技术活。普通用户也可以轻松的建立出相对专业的网站。网络上搜索了个人建站流程,不过都是语焉不详,不够系统。下面专业登山鞋网(http://www.soopeng.com)向大家系统的介绍一下个人建站的一些流程和注意事项。

        1,网站策划:
        在做任何事情之前都应该有个策划,不然到时候事情偏离了发展方向,建设网站也是如此。先确定网站的类型,是地区门户、行业门户,还是下载、电影、论坛、博客等等。在这一步你必须要想好你的网站是什么类型是做什么的,不然都后期就比较难改了。

        2,确定程序平台,选择一个合适的程序:
        目前比较流行的程序平台有:php、asp、asp.net、java,一般建站都是用php或者asp,这样也比较利于你后面的虚拟主 机的选择。确定了你的网站类型以及程序平台,这个时候你就可以去百度搜索下目前主流的、功能比较强大的与你网站类型和程序平台对应的程序有哪些了。这个时 候,对于自己网站以后的发展,心里应该有一个大概的蓝图,未来的访问量、在线人数等等,一个是要考虑程序的承受能力,一个是空间的承受能力,一般来说,主 流的一些免费程序应该就足够了,并且这些程序一般都有商业版本,将来流量确实大的时候,可以来升级。常用的程序主要还是这些:
CMS-网站内容管理系统:
ASP:(1)、风讯。(2)、动易。(3)、乔客。(4)、新云。(5)、科讯。
PHP:(1)、phpcms。(2)、dedecms。(3)、帝国。(4)、php168。(5)、supsite。
BBS论坛程序:
ASP:(1)、动网。(2)、BBSXP。(3)、Leadbbs。
PHP:(1)、discuz。(2)、phpwind。
Blog博客程序:
ASP:(1)、z-blog。(2)、pjblog。
Php:(1)、wordpress。(2)、Jblog。
最好找到这些程序的官网进行下载,里面都会给你非常详细的介绍它的安装和使用方法的。

        3,开通网上交易:
        在接下来的域名注册和虚拟主机的注册都是通过网上交易来进行的,所以,在这之前你最好开通你的网上银行或者支付宝账号都行。

        4,确定网站域名和名称:
        域名注册.com(国际域名)和.cn(国内域名)为宜,域名最好不要太长、且有一定的意义、容易记,现在好的域名已经不多了,你可灵活 的使用数字、英文单词、拼音等的组合,在域名的前、后加i、e、51、ok、hao、88、163等,可以灵活的组合出许多好的域名。域名注册和接下来要 进行的虚拟主机注册最好在同一个服务商那边注册。域名注册信息查询,你可以在百度搜索“虚拟主机”,挑一家进行查询和注册。在注册域名的同时你要确定好你 的网站名称,这样域名配合网站名或者网站名配合域名来取都可以。

        5,选择一个适合你的空间:
        个人认为,一个小型的站点,100-500M空间应该是足够了,在有了发展之后,空间不够或者速度、在线人数等限制不爽的话,还可以进行 升级嘛看你的站用户群的组成情况,北方用户多的话就用网通的线路,南方用户多的话就用电信线路,全国的话建议就选择双线啦! 如果不想备案的朋友可以选择韩国/香港/美国空间,免备案购买之后即可使用。注意:(1)第一次备案是非常麻烦的,要邮寄你个人的真实详细的信息到你当地 的通信管理局进行备案,据个人经验一般要20个工作日。备案资料要严格按照服务商提供给你的备案资料去备案,否则,一旦备案不成功就要被打回来咯。(2) 空间的注册最好和域名的注册在同一个网站注册,虽然没多大影响,但是这样方便了不少。(3)最好选择信誉好稳定的空间,虽然,这样的空间稍微贵点,但是, 我肯定的告诉,值得。要不然,三天两头的给你来个访问不了,你损失就大了。(4)必须根据空间服务商告诉你的方法解析域名和绑定域名,到时候你的网站才能 访问。解析域名和绑定域名的方法,在你注册的域名管理后台就有详细的说明,你不用担心学不会,都是非常简单的,还有图文介绍。专业登山鞋网(http://www.soopeng.com)就是这样选择的域名和空间的。

        6,网站建设的一些软件:
        下载一个FlashFTP软件,这是用来将网站文件和数据上传和下载到你的空间的。 FlashFTP是一款专业的网站数据上传和下载的软件,站长必不可少。只有通过FlashFXP才能高速、便捷、高效的将数据和文件上传到网站的空间, 并且利用FlashFTP还可以很方便的管理网站数据。FlashFTP的基本使用方法你可以上百度搜索得到。除 了FlashFTP软件以外,Dreamweaver是一款专业的网页设计和制作的软件,站长也应该备。FlashFTP和Dreamweaver的下载 都可以到百度搜索下载。

        7,上传程序:
        把你下载下来安装好的程序通过FTP软件上传到你的空间。当你把程序上传完成之后,这个时候你的网站基本建立起来了。你可以试着在IE上输入你的域名,看看能不能访问到你的网站。看到了吧,估计这个时候你会激动莫名。

        8,完善你的网站栏目、内容:
        这个就要看自己的想法了,每个人的思路不一样,板块、栏目的设置存在着差别。个人的看法,最好不要人云亦云,栏目设置要有自己的特色,吸引回头客、固定用户,这才是最宝贵的资源。

        9,推广你的网站:
        (1)、登陆搜索引擎。搜索引擎里,百度应该是收录页面最快的,经常听站长说自己根本没有提交页面他就自己收录了。而且效果也应该是不错的,带来的流量也不少。
        (2)、到一些大型的论坛或者同类网站进行宣传。
        (3)、多和一些大站或者同类网站作友情链接。
        (4)、适当对网站页面进行优化。
        即使,你做了上面的基本推广工作,你也要做好持续的没有人来的准备。推广,说实话我是外行,因为我没做过任何的推广,我所用的推广就是做 好内容,更新再更新,不断更新。但有时候我也看一些个推广的东西,了解不透彻,比如文字链,比如弹窗,个人觉得弹窗没有特别大的意义,除非你的站非常独 特,让人看到弹出后有惊 喜的感觉,不会很烦的关掉窗口。文字链是可以适当的做一段时间的,但目前的文字链作假的也多,比如黑马,一开始蛮好的,现在不行了,刷流量的太多,有的人 三千ip一天可以刷出五千以上的点击,那还有什么意义呢?其实,留住人以及客户体验是最重要的。

        10,以网养网:
        经过以上的步骤,当你的网站的小有流量,也有一些固定的用户了,这时候不妨在站上放一些Google或者百度的广告,当然,如果有厂商找你那是最好不过了,一年下来,凑够空间和域名的费用是该是不成问题了。

        以上方法都是专业登山鞋网(http://www.soopeng.com)根据自身的经验结合网络上一些朋友的方法整理而成的,算是比较全面比较系统的网站建设流程了。希望大家看了以后,能够在建站的时候少走些弯路,这就是我写这篇文章的初衷。
 

本文出自:登山鞋推荐,地址:http://www.soopeng.com/post/outdoor/119.html,转载须注明!

posted @ 2011-11-17 17:58 天羽 阅读(20) 评论(0) 编辑

2011年11月16日 #

[转]父爱如山

        在新华网上看到一个为了孩子的挑夫,让我想起了小学课本上那个挑山工以及朱自清的背影,感触很深很深。父爱总是这么的含蓄和深沉。

        原文如下:48岁的Somlaitamang是珠峰南坡尼泊尔众多挑夫中的一员。没有登山鞋,没有冲峰衣,甚至没有一双袜子,Somlaitamang头 顶着100多斤的货物,冒着生命危险,徒步在尼泊尔北部高山区域索鲁孔布县Solukhumbu海拔3000多米以上的雪山中,为国际登山者征服珠峰提供 了服装、氧气、各类食物等必需物质。

天刚亮,Somlai tamang便出发开始一天的背夫工作

        Somlaitamang 是塔芒族,这个民族喜欢生活和居住在高山地区。塔芒族虔诚信仰佛教,寺庙中的绘画夏尔巴族相同,宗教仪式等到也与夏尔巴基本一样。“我们与夏尔巴人一 样。”Somlaitamang骄傲地说。但是,夏尔巴人以登山闻名全球,而塔芒族却以背夫闻名。头勒一条带子,手中一根木制拐杖,背驮一个装满货物的竹 篮,他们翻越雪山,穿过河流,攀附山崖,却如履平地。

        Somlaitamang告诉记者,他七年前开始做挑夫,一天的收 入在1600尼泊尔卢比(约22美元)至2200 尼泊尔卢比(约31美元)之间。从卢克拉机场(2840)到登山者主要修整地之一的3440米的纳姆切巴扎(巴扎意为市场,为著名的夏尔巴人聚落),游客 一般一天半,而Somlai一天能打一个来回。

        “我有四个儿子,一个女儿,大儿子已经考上了加德满都的大学。今天我背了90公斤,一天就能赚2200卢比,再干几年,我的几个儿子就都能读完大学了。”Somlaitamang说。

        这就是父亲,这就是父爱,感叹父爱的同时你想起了自己的父亲了吗?父爱如山!!
 

本文出自:登山鞋推荐,地址:http://www.soopeng.com/post/outdoor/116.html,转载须注明!

posted @ 2011-11-16 14:50 天羽 阅读(2) 评论(0) 编辑

世界上最难征服的山峰排行

根据攀登难度,登顶情况以及危险系数,专业登山鞋网(http://www.soopeng.com) 排列出一下十座世界上最难征服的山峰:

  1. 乔戈里峰,海拔8611米,人们常说的K2, 真正的第一。好莱坞大片《垂直极限》的故事发生地。全球8000米以上的山峰中难度最大的一个,也可以说是全球最难征服的山峰。北侧大本营到顶峰垂直高差竟达到4700米,中国人至今仍然无法征服它。它的纯攀登难度要高过珠峰,攀登者的死亡比率高达3∶1。

  2.珠穆朗玛峰,西方人称之为 Mt. Everest,当之无愧的第二。29028英尺的高度说明了一切,它永远是任何1个登山者心中的坐标。全球最顶级的户外运动品牌THE NORTH FACE的含义就是珠峰的北壁。当你站在珠穆朗玛峰峰顶29028英尺对流层里吃着早餐,你的智力水平仅仅相当于弱智儿童,感觉只有你自己知道。

  3.冈仁波齐峰,海拔6638米,位居第三。藏传佛教、印度教、西藏苯教的“神山”,一年四季总有信徒在山下转山。从本身难度来讲它并不大,但根本没有人胆敢去尝试攀登。即便你登顶成功在山下也难逃出信徒们的掌心。估计会被撕碎的。不过让世人知道你曾经有爬过神山的经历,一定会惊世骇俗的。

  4.梅里雪山,海拔6740米。1991年1月3日的那天夜里,中日登山队17名队员一夜之间全部消失在梅里雪山的大雪崩中,直到10年后他们的遗体才被发现。地处横断山脉,地形极其复杂。受印度洋的季风吹拂,气候不可琢磨,至今在世界登山界中也无人可以准确说出梅里雪山可以攀登的时间。因为地形气候极其诡异,所以位居第四。

  5.贡嘎山,海拔7556米。1957年6月13日,中国国家登山队的6名队员登顶成功,但在下撤的过程中有3 名队员滑下了近2000米深的峡谷,至今也没能够找到。同梅里雪山相同也处于横断山脉,地形过于复杂。基本已经没有登山队去挑战贡嘎山了。现在无人问及,排行第五。由专业登山鞋网(http://www.soopeng.com)排列。

  6. 安纳布尔纳峰,世界第十峰,海拔8093米,位于喜马拉雅山脉中段尼泊尔境内。安纳布尔纳峰有一系列山峰构成,除了主峰之外,还有多座独立命名的山峰,包括著名的鱼尾峰 (Machhapuchhre)。1950年6月3日,法国登山队的莫里斯.埃尔佐格和路易斯.拉什耐尔2人首次登上顶峰,这也是人类首次登上海拔 8000米以上的独立山峰。至今,有130多人攀登它,53人中途丧命。高死亡率成为海拔8千米的山峰里面最危险的一个。

  7. 干城章嘉峰,世界第三高峰,海拔高度为8586 米,座落在喜玛拉雅山脉中段尼泊和印度边界。1955年5月25日,英国登山队的G·班德、N·哈迪、J·布朗和T·斯特里塞尔四人首次登上顶峰。干城章嘉峰山麓据说是“雪人”频繁出没的地方,死亡率在近些年达到22%,也让这座山峰蒙上了一层恐怖的阴影。

  8.拜塔布拉克峰,是攀登难度最大的山峰之一,又称 “食人魔”。海拔7285米,位于巴基斯坦北部,以“食人魔”(The Ogre)的名字被人们所熟知,是世界上攀登难度最大的山峰之一。尽管早在1971年就有人初次尝试攀登,1977年首次登顶,但直到2001才第二次登顶。

  9.马特峰,它独特的造型好像山谷里突然生出了一只角。攀登它的死亡率也是较高的。海拔4478米,它不是欧洲阿尔卑斯山脉里最高的山峰,但却是最险峻的一座。

  10. 麦金利峰,又名丹奈利峰或德纳利山(北阿萨巴斯卡语支:Denali),位于阿拉斯加州东南部、阿拉斯加山脉中段,海拔6194米,是北美洲最高峰,也是美国的最高峰。海拔高,空气极稀薄,气温极低,使攀登成功率仅有50%,100多人已死在白雪皑皑的山里。

本文出自:专业登山鞋网,地址:http://www.soopeng.com/post/outdoor/118.html,转载须注明!

posted @ 2011-11-16 14:37 天羽 阅读(178) 评论(0) 编辑

记Quartz.Net异常处理

Quartz.Net是从java移植过来的Quartz,用于任务调度,支持多线程,是非常方便的任务管理器。如果你的项目需要用到多任务甚至多线程处理业务,那么Quartz.Net是你非常好的选择。Quartz.Net的文章非常多了,主要是转载的多,大家可以到 善友 的blog去看看,那边有非常详细的资料,我这边仅记录下用Quartz.Net发生的异常。

1,首先,Quartz.Net中的异常处理,在每个Job的Execute()方法中,必须用try{}catch(){}把你的业务代码给包起来,然后在catch中抛出JobExecutionException,如果不这么做的话,很可能导致你的程序挂掉。代码如下:

try
{
// actual job steps to be executed
}
catch (Exception ex)
{
JobExecutionException exception = new JobExecutionException(ex);
exception.Source = context.JobDetail.FullName;
exception.UnscheduleFiringTrigger = true;
throw ex;
}

2,获取正在运行的job
foreach (JobExecutionContext context in scheduler.GetCurrentlyExecutingJobs())
{
}

3,怎么传递参数到Execute方法中
JobDetail job = new JobDetail(jobname, jobgroup, typeof(LogJob));
job.JobDataMap.Put("UserId", userId);
job.JobDataMap.Put("UserName", userName);

在Execute方法中获取:
int userId= context.JobDetail.JobDataMap.GetInt("UserId");

String userName = context.JobDetail.JobDataMap.GetString("UserName");

本文出自一soopeng网http://www.soopeng.com,转载请保留链接。

posted @ 2011-11-16 11:30 天羽 阅读(24) 评论(0) 编辑

2011年11月15日 #

大家帮我看看这款登山鞋怎么样

想买一款专业登山鞋,大家帮我参考下这款怎么样:

 

http://www.soopeng.com/post/outdoor/112.html 

 

posted @ 2011-11-15 11:10 天羽 阅读(5) 评论(0) 编辑

Quartz.Net学习(2)

Quartz.Net获取在运行中的job

 

List<JobExecutionContext> jobs = (List<JobExecutionContext>)SchedulerManager.GetScheduler().GetCurrentlyExecutingJobs();
        foreach (JobExecutionContext context in jobs)
        {
   }

posted @ 2011-11-15 10:42 天羽 阅读(7) 评论(0) 编辑

Quartz.Net学习

如果想要对作业执行时提供参数怎么办?

实际上 JobDetail 提了一个名为 JobDataMap 的属性来保存作业执行时的参数。

Quartz.Net 甚至为Trigger 也提供了一个JobDataMap的属性。


JobDetaMap最初是从 IDictionary 继承下来的,并且通过层层继承实现了传递参数时相关好用的方法。


jobDetail.JobDataMap.Put("hwj383",1);//加入字典表,put和add的区别是put如果有重复键会更新值而不是引发异常


最后在 Execute方里面,通过访问作业执行上下文(Context)中的 JobDetail中的JobDataMap就可以取到值。

 public void Execute(JobExecutionContext context)
{
Console.WriteLine(context.JobDetail.JobDataMap.GetInt("hwj383"));
}

public void Execute(JobExecutionContext context) { Console.WriteLine(context.JobDetail.JobDataMap.GetInt("hwj383")); }


但是似乎问题又来了,我们希望保存每次执行的结果,尝试以下代码:


public void Execute(JobExecutionContext context)
{
  int i = context.JobDetail.JobDataMap.GetInt("hwj383");
  Console.WriteLine(i);
  i++;
  context.JobDetail.JobDataMap.put("hwj383",i);//更新键hwj383的值
}

public void Execute(JobExecutionContext context) { int i = context.JobDetail.JobDataMap.GetInt("hwj383"); Console.WriteLine(i); i++; context.JobDetail.JobDataMap.put("hwj383",i);//更新键hwj383的值 }


但是遗憾的每次输出仍然是 1 并没有随着每次执行而自动增长 1 (实际上每次执行都会实列化IJob的实现类)


难到就没有办了吗?实际上Quartz.Net为我们提供了另外一个接口:IStatefulJob

从字面意思理解就可以看出是一个状态接口,此接口会维护第次调用间JobDtatMap数据。只需要把类从IJob接口换成IStatefulJob就可以了,上面的代码就可以像您想象的工作了。(实际上第次执行仍会实列化IStatefulJob实现类)

posted @ 2011-11-15 10:37 天羽 阅读(29) 评论(0) 编辑

2008年11月14日 #

.NET中公共变量与属性的区别(get/set)[转]

 

 .NET中公共变量与属性的区别

http://blog.csdn.net/yidon/archive/2007/10/28/1852072.aspx

 

关于get和set访问器以及属性和字段变量的区别问题 

 http://www.cnblogs.com/leening/articles/1172020.html

 

 

属性与变量的区别

 

属性就是                                                                  变量:

例子:            

public   int   Y                                                           int i=0; string sUer="";等
  {   
   get      {       return   iY;}   

   set      {        iY=value; }

}
    

属性只能通过初始化类,创建对象后才能使用。                   变量则没有这方面要求,

实质

属性没有固定的地址,属性的赋值只是使指针                     变量赋值只是变量的地址储存所指的地址值

 

pb   a1=new pb(); a1.X=5;                                    int aX1=5;

pb a2=a1;                                                              int aX2=aX1;

a1.X=6;                                                                 aX1=7;

得出的结果是 a2.X=6;                                  得出的结果是aX2=6

结论:在属性中(a2=a1)实质是a2指向a1的地址,所以更改a1后a1的地址上的值改变,而a2因为指向的是a1的地址,所以a1的值改变后,a2的值也会改变.

 在变量中,(aX2=aX1)中其实只是复制了ax1的地址中的值到自己的地址中。所以即使ax1改变值后,ax2不受影响.

补充:

pb   a1=new pb(); a1.X=5; 

pb a2=a1;  

int b=24; a1.X=b

b=6;       

----a2.X=24;

ps:属性X被b赋值,但是b更改后,不影响属性X

 

 

以下是属性中最难理解和最容易忘记的内容,我思考了一晚得出结论

 class rectangle

{

.......................

有属性X,Y,W,H等,//在些省略了写属性的过程

方法ARea ---W*H

public static Inflate(rectangle rec,int iw,int ih)

{

rec.X=rec.X-iW;     rec.Y=rec.Y-iH;     

rec.W=rec.W+2*iw; rec.H=rec.H+2*ih;

}

}

 class test

{

main()

rectangle RE=new Rectangle(10,20,100,50);//X,Y,W,H

rectangle R=RE;

-------------R的值为 X=10,Y=20,Area=5000

rectangle.inflate(R,20,20);

-----------R的值为 X=-10,Y=0,W=140,H=90,Area=12600

------------RE的值为X=-10,Y=0,W=140,H=90,Area=12600

}

总结:

为什么R在调用inflate方法后会值改变,因为在调用这个方法时,方法中的变量rec读取了R的地址,当rec改变值时,改变的值储在R的地址上,所以不可避免地改变R。因为R=RE时,R读取了RE的地址。rec更改r的地址值,实质是更改了RE的地址。

 如果想不影响R和RE等赋值对象,可以创建副本

public static Inflate(rectangle rec,int iw,int ih)

{

rectangle rect=new rectangle(20,30,60,50)

rec=rect;

rec.X=rec.X-iW;     rec.Y=rec.Y-iH;

rec.W=rec.W+2*iw; rec.H=rec.H+2*ih;

}

rectangle RE=new Rectangle(10,20,100,50);//X,Y,W,H

rectangle R=RE;

-------------R的值为 X=10,Y=20,Area=5000

rectangle.inflate(R,20,20);

-----------R的值为 X=10,Y=20,Area=5000

------------RE的值为X=10,Y=20,Area=5000

总结。因为方法Rectangle().虽然rec的值改变了,但是由于rec初始时复制了R的地址,但是之后在方法内,它通过

rec=rect,指针改变了,指在rect的地址上,所以rec只影响了rect的地址值,而不会影响R值。和上面的有本质区别。

 

void sINE(int ia)
  {
    ia+=1;
  }

int sIND(int ia)
  {
    ia+=1;

  return ia;
  }

   int a=6;
   int b;
   b=a;
   sINE(a);
   b=7;

   int c=sIND(a);

-----------a的值为6,c的值是7

b=a,b的值改变后(b=7),但是a的值不会改变,因为变量的赋值,只是复制赋值对象的值,而不是地址。

 sINE()方法中ia变量只是复制了赋值对象的值,而不是地址,所以不会影响赋值对象的值。因此sINE(a)后

a的值不会改变。

 

ps:这一章节,将变量与属性的区别精华和本质写出来了。到时不明白,可以看一下文章中提供的例子和注释

posted @ 2008-11-14 10:00 天羽 阅读(915) 评论(0) 编辑

2008年10月5日 #

最近需要研究的源码

摘要: TheBeerHousehttp://www.cnblogs.com/ajaxren/category/92618.htmlMyWebPagesStarterKithttp://www.cnblogs.com/liudao/archive/2007/07/20/825031.htmlYAF阅读全文

posted @ 2008-10-05 11:35 天羽 阅读(62) 评论(0) 编辑