2008年1月9日

extsharp是在code.google.com上发布的一个用C#写ExtJS代码的开源工具

官方网站:http://code.google.com/p/extsharp/


以下是官方网站译文,水平有限,敬请广大网友斧正(更多开源项目请访问http://www.mikecat.net/space/?uid=3):


       我真的非常喜欢EXT,但是用JavaScript编码却又让我寒心。因此我到处寻找,并找到了一种方法,同时使用我最喜爱的js库(EXT)和我最喜爱的编程语言(C#)来进行编码。利用一个我称之为Script#的项目,使我能用C#代码编程并自动转换成JavaScript,这就类似于GWT(google)。通过Script#你能依靠扩展API创建你需要的类型、方法、属性等一切。
所以我所做的就是写一个小控制台程序去解析所有ExtJS源文件,并提取脚本注释并且写C#文件为每个类。最终达到的效果就是有一个可编程的C# API去访问所有EXT 对象 并且

 

这个是个google官方的演示示例
基于ExtJS v1.1.1和Northwind 数据库开发
演示地址http://ext.ordereze.net/scriptsharp/products.aspx

 

下载:

  Filename Summary + Labels Uploaded Size DownloadCount ...

ExtJS2Samples-v2.0.1.zip ExtSharp Web Samples v2.0.1   Featured Dec 12 1.8 MB 18749  

ExtJS2Parser-v2.0.1.zip ExtSharp API Source & Parser v2.0.1   Featured Dec 12 2.5 MB 6621  

ScriptSharp-v0.4.2.pdf Script# v4.2.0 Manual Sep 17 1.5 MB 12710  

ScriptSharp-v0.4.2.msi Script# v4.2.0 Installer Sep 17 1.4 MB 11820

 

 

 2007年12月5日更新

我们已经修改了Ext#用来解析最新释放的ExtJS 2.0,并且我们也在用Ext#来创造更多的例子

下列示例已经开发完成:

 

  • Grids
    • Basic Array Grid
    • Editable Grid
    • XML Grid
    • Paging Grid
    • Grouping Grid
  • Toolbars and Menus
    • Basic Toolbar
    • Ext Actions
  • Miscellaneous
    • Data View (partial)
    • Progress Bar
    • Templates
    • Panels
    • Resizable

A big thanks to consultutah for all of his help creating these samples. As well as to all of the Ext community for their help and suggestions.

 

 

Intellisense

Method Signatures with param info

Method Overloads for varying params

Compile-time error checking

Events list with usage info

Delegates for all events

Intellisense for config options

 

 

License: GNU Lesser General Public License

刚刚看到这个项目,随笔中有什么问题,还请大家多指正,在这里留言或者到我的网站老猫的理想留言
posted @ 2008-01-09 22:03 迈克老猫 阅读(3065) | 评论 (13)编辑
  2004年12月21日
//******************************************************************************
//程序名称:老猫的理想ASP.NET探针
//Version:0.20 
//作者:迈克老猫
//版权所有 2004-2005 老猫的理想工作室.
//主页:http://www.mikecat.net    Email:mikecat#mikecat.net  QQ:87029826
//本程序代码完全免费,您可以任意复制,修改和传播。但请保留以上信息谢谢合作。
//******************************************************************************
//修改请注明由本程序修改而来,谢谢合作。   
//注意:本程序谢绝用于任何商业领域,修改版本不得以任何名义收费。 
//虚拟主机商使用本程序请先联系mikecat#mikecat.net。我将提供技术支持并将你的地址加入。 
//******************************************************************************
//了解本程序最新版本及工作室其他作品情况,请访问:www.mikecat.net
//******************************************************************************

新增功能及修改BUG:
1。 修改对服务器端操作系统对WIN2003识别错误BUG。

2。 新增服务器服务器操作系统安装目录检测

3。 新增服务器应用程序安装目录检测

4。 新增服务器CPU个数检测

5。 新增服务器每个CPU详细信息检测(包括 标识、描述、频率、最高频率、二级缓存大小、速度 CPU等级 OEMID等信息)

6。 新增服务器内存信息检测(包括 物理内存、交换文件大小、可用物理内存、内存使用率、虚拟内存信息)

7。 新增逻辑驱动器个数探测

使用方法:

1。 将压缩包内的bin目录内的MikeCat_SiteInfo.dll文件放到你WEB站点虚拟目录内的bin目录内,如果没有虚拟目录,则将其放到站点根目录内的bin目录中即可。

2。 将SiteInfo.aspx上传到你的站点中,即可使用本程序。

探针演示地址:
http://www.mikecat.net/mikecatrssblog/siteinfo.aspx
探针下载地址:
http://www.mikecat.net/mikecatrssblog/mikecatsiteinfo.rar
posted @ 2004-12-21 23:39 迈克老猫 阅读(1363) | 评论 (4)编辑
  2004年12月20日
这个投票系统本来是想做成老猫的理想开源范例里面得一个小例子,可是后来发现还是做成一个独立系统得好。不过现在我想到得功能很有限,希望大家能帮我提出些有建设性得意见。我这里把系统得WEB功能结构图贴出来大家帮我参谋参谋。

按此在新窗口打开图片
posted @ 2004-12-20 22:38 迈克老猫 阅读(2727) | 评论 (12)编辑
  2004年12月18日

初始化文本框、按钮的效果函数。
注释很清楚我就不多说了。

程序代码:
.btnadd_1
{
    font-size: 12px;
    width: 80px;
    height: 22px;
    background-image: url(Images/Btn/btnadd_1.gif);
    border: none;
    padding-top: 3px;
    cursor:hand;
}
.btnadd_2
{
    font-size: 12px;
    width: 80px;
    height: 22px;
    background-image: url(Images/Btn/btnadd_2.gif);
    border: none;
    padding-top: 3px;
    cursor:hand;
}

程序代码:

/// <summary>
/// 控件效果
/// </summary>
/// <param name="ctrls">控件数组,一种类型控件数组,目前只支持Button,TextBox两种类型控件,比如Control ctrls={btn_Add,Btn_Save}</param>
/// <param name="Type1">样式类型1,Button控件,支持鼠标滑过onmouseOver和鼠标滑开两种效果,TextBox控件,支持鼠标获得焦点onFocus和失去焦点两种效果</param>
/// <param name="Type2">样式类型2</param>
public void CtrlAttributes(Control [] ctrls,string Type1,string Type2)
{
    for (int i=0;i<ctrls.Length;i++)
        {
            if (ctrls[i] is TextBox)
                {
                ((TextBox)ctrls[i]).Attributes.Add("class",Type1);
                    ((TextBox)ctrls[i]).Attributes.Add("onFocus","className='"+Type2+"'");
                    ((TextBox)ctrls[i]).Attributes.Add("onBlur","className='"+Type1+"'");
                }
                if (ctrls[i] is Button)
                {
                    ((Button)ctrls[i]).Attributes.Add("class",Type1);
                    ((Button)ctrls[i]).Attributes.Add("onmouseOver","className='"+Type2+"'");
                    ((Button)ctrls[i]).Attributes.Add("onmouseOut","className='"+Type1+"'");
                    
        }
    }
}
posted @ 2004-12-18 00:47 迈克老猫 阅读(674) | 评论 (0)编辑
迈克老猫(MikeCat)

来自:老猫の理想

   在这里给大家提供一些平时经常容易用到的效果的解决方案。我把一些效果封装在了一个类库文件中。

  警告窗口

  /// <summary>
  /// 服务器端弹出alert对话框
  /// </summary>
  /// <param name="str_Message">提示信息,例子:"不能为空!"</param>
  /// <param name="page">Page类</param>
  public void Alert(string str_Message,Page page)
  {
   page.RegisterStartupScript("","<script>alert('"+str_Message+"');</script>");
  }

  重载此警告窗口,使某控件获得焦点

  /// <summary>
  /// 服务器端弹出alert对话框,并使控件获得焦点
  /// </summary>
  /// <param name="str_Ctl_Name">获得焦点控件Id值,比如:txt_Name</param>
  /// <param name="str_Message">提示信息,例子:"请输入您姓名!"</param>
  /// <param name="page">Page类</param>
  public void Alert(string str_Ctl_Name,string str_Message,Page page)
  {
   page.RegisterStartupScript("","<script>alert('"+str_Message+"');document.forms(0)."+str_Ctl_Name+".focus(); document.forms(0)."+str_Ctl_Name+".select();</script>");
  }

   确认对话框

  /// <summary>
  /// 服务器端弹出confirm对话框
  /// </summary>
  /// <param name="str_Message">提示信息,例子:"您是否确认删除!"</param>
  /// <param name="btn">隐藏Botton按钮Id值,比如:btn_Flow</param>
  /// <param name="page">Page类</param>
  public void Confirm(string str_Message,string btn,Page page)
  {
   page.RegisterStartupScript("","<script> if (confirm('"+str_Message+"')==true){document.forms(0)."+btn+".click();}</script>");
  }

   重载确认对话框,点击确定触发一个隐藏按钮事件,点击取消触发一个隐藏按钮事件

  /// <summary>
  ///  服务器端弹出confirm对话框,询问用户准备转向那些操作,包括“确定”和“取消”时的操作
  /// </summary>
  /// <param name="str_Message">提示信息,比如:"成功增加数据,单击\"确定\"按钮填写流程,单击\"取消\"修改数据"</param>
  /// <param name="btn_Redirect_Flow">"确定"按钮id值</param>
  /// <param name="btn_Redirect_Self">"取消"按钮id值</param>
  /// <param name="page">Page类</param>
  public void Confirm(string str_Message,string btn_Redirect_Flow,string btn_Redirect_Self,Page page)
  {
   page.RegisterStartupScript("","<script> if (confirm('"+str_Message+"')==true){document.forms(0)."+btn_Redirect_Flow+".click();}else{document.forms(0)."+btn_Redirect_Self+".click();}</script>");
  }
  

  获得焦点

  /// <summary>
  /// 使控件获得焦点
  /// </summary>
  /// <param name="str_Ctl_Name">获得焦点控件Id值,比如:txt_Name</param>
  /// <param name="page">Page类</param>
  public void GetFocus(string str_Ctl_Name,Page page)
  {
   page.RegisterStartupScript("","<script>document.forms(0)."+str_Ctl_Name+".focus(); document.forms(0)."+str_Ctl_Name+".select();</script>");
  }

 子窗体返回主窗体

  ///<summary>
  ///名称:redirect
  ///功能:子窗体返回主窗体
  ///参数:url
  ///返回值:空
  ///</summary>
  public void redirect(string url,Page page)
  {
   if ( Session["IfDefault"]!=(object)"Default")
   {    
    page.RegisterStartupScript("","<script>window.top.document.location.href='"+url+"';</script>");
   }
  }

  判断是否为数字

  /// <summary>
  /// 名称:IsNumberic
  /// 功能:判断输入的是否是数字
  /// 参数:string oText:源文本
  /// 返回值: bool true:是 false:否
  /// </summary>
  
  public bool IsNumberic(string oText)
  {
   try
   {
    int var1=Convert.ToInt32 (oText);
    return true;
   }
   catch
   {
    return false;
   }
  }

  获得字符串实际长度(包括中文字符)

  //获得字符串oString的实际长度
  public int StringLength(string oString)
  {
   byte[] strArray=System.Text .Encoding.Default .GetBytes (oString);
   int res=strArray.Length ;
   return res;
  }

  将回车转换为TAB

  //当在有keydown事件的控件上敲回车时,变为tab
  public void Tab(System.Web .UI.WebControls .WebControl webcontrol)
  {
   webcontrol.Attributes .Add ("onkeydown", "if(event.keyCode==13) event.keyCode=9");
  }

  datagrid分页中如果删除时出现超出索引

  public void jumppage(System.Web.UI.WebControls.DataGrid dg)
  {
   int int_PageLess; //定义页面跳转的页数
   //如果当前页是最后一页
   if(dg.CurrentPageIndex == dg.PageCount-1)
   {
    //如果就只有一页
    if(dg.CurrentPageIndex == 0)
    {
     //删除后页面停在当前页
     dg.CurrentPageIndex = dg.PageCount-1;  
    }
    else
    {
     //如果最后一页只有一条记录
     if((dg.Items.Count % dg.PageSize == 1) || dg.PageSize == 1)
     {
      //把最后一页最后一条记录删除后,页面应跳转到前一页 
      int_PageLess = 2;
     }
     else      //如果最后一页的记录数大于1,那么在最后一页删除记录后仍然停在当前页
     {
      int_PageLess = 1;
     }
     dg.CurrentPageIndex = dg.PageCount - int_PageLess;
    }
   }
  }

平时经常用到的代码,本人水平有限如有疏漏之处,还请指出!

在这里要感谢艳辉、阿好(hbzxf)的鼎立支持!

posted @ 2004-12-18 00:44 迈克老猫 阅读(1436) | 评论 (1)编辑
迈克老猫(MikeCat)

来自:老猫の理想

   呵呵,本没有写文章之意,看到好友阿好(hbzxf)的文章,也决定把平时的一些东西写出来和大家分享!有疏漏之处,敬请大家指教!

     在asp.net中利用datagrid控件按列进行排序很是方便。可是我们只能单项排序!如果我们需要正反排序那么就需要加入一些代码控制一下,下面我来详细讲解一下这个过程。

  首先我们需要将datagird控件的属性设置为 AllowSorting="True",且需要排序列需要制定排序表达式 eg: SortExpression="kmdm"。设置好这些,我们进入代码文件,来编写响应排序的事件.

  首先在Page_Load时间中加入如下代码:

   if (!IsPostBack)
   {
    if(this.kjkm_dg.Attributes["SortExpression"]==null) //这里kjkm_dg为datagrid   ID
    {
     this.kjkm_dg.Attributes["SortExpression"]="kmdm";  //这里给datagrid增加一个排序属性,且默认排序表达式为kmdm;
     kjkm_dg.Attributes["SortDirection"]="ASC"; //这里给datagrid增加一个排序方向属性,且默认为升序排列;
    }
    mikecatbind(); //绑定函数,下面介绍
   }

  protected void mikecatbind()
  {
   string sqlStr="select * from zc_kjkm";
   DataView dv=new DataView();
   
   string SortExpression=kjkm_dg.Attributes["SortExpression"];
   string SortDirection=kjkm_dg.Attributes["SortDirection"];
   dv=us.Bind(sqlStr).Tables[0].DefaultView;  //来自web service的dataset,这里随便一个ds就可以;
   dv.Sort=SortExpression+" "+SortDirection; //指定视图的排序方式;
   kjkm_dg.DataSource=dv; //指定数据源
   kjkm_dg.DataBind(); //数据绑定

}

   进行完上面的设置后我们进入重要的环节,排序事件的编写:

  private void kjkm_dg_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
  {
   string SortExpression=e.SortExpression.ToString();  //获得当前排序表达式
   string SortDirection="ASC"; //为排序方向变量赋初值
   if(SortExpression==kjkm_dg.Attributes["SortExpression"])  //如果为当前排序列
   {
    SortDirection=(kjkm_dg.Attributes["SortDirection"].ToString()==SortDirection?"DESC":"ASC");     //获得下一次的排序状态

 }
   kjkm_dg.Attributes["SortExpression"]=SortExpression;
   kjkm_dg.Attributes["SortDirection"]=SortDirection;
   mikecatbind();
  }

 

好了,试试看看是不是可以进行正倒序排列啦。

posted @ 2004-12-18 00:42 迈克老猫 阅读(530) | 评论 (0)编辑
本教程参考C#和ASP.NET程序设计教程撰写,有什么不足之处请大家指出,或在老猫的理想BLOG留言。

  好些天不写了。今天事情较少,有几个网友总是问,就又写了点东西。可能疏漏比较多,希望大家帮忙指正

    预处理指令:与c++不同,c#没有独立的预处理器。在c#中,预处理指令并不是编译器开始编译代码之前的一个单独的处理步骤,而是作为词法分析的一部分来执行的。预处理指令都以#号开头并位于行首。
    #define指令用于定义符合,他的作用域是该定义所在的整个文件,符号定义必须放在所有其他语句的前面,或者说在所有“实代码(real code)”之前。(比如:"using system"就是实代码。)
    想取消某个符号的定义,则要用到#undef指令。
    条件编译指令有4个:#if、#elif、#else、#endif,他们用来有条件地将部分程序代码包括进来或排除在外。条件编译指令和if语句有类似的作用。也可以在条件编译指令中用逻辑与(&&)、逻辑或(||)、等于(==)、不等于(!=)等操作符。
    eg:
            #define MF1
            #define MF2
            using System;
            public class MikeCat
            {
                public static void Main()
                {
                    #if (MF1&&!MF2)
                        Console.WriteLine("MF1被定义");
                    #elif(!MF1&&MF2)
                        Console.WriteLine("MF2被定义");
                    #elif(MF1&&MF2)
                        Console.WriteLine("MF1和MF2被定义");
                    #else
                        Console.WriteLine("MF1和MF2没被定义");
                    #endif
                }
            }//运行结果:MF1和MF2被定义
    #error和#warning指令用于发出编译错误和警告。
        eg:
                #define MF1
                #define MF2
                using System;
                public class MikeCat
                {
                    public static void Main()
                    {
                        #if MF1
                            #warning 欢迎来到老猫的理想!
                        #endif
                        #if    MF2
                            #error 老猫的理想BLOG出错
                        #endif
                    }
                }//运行结果:test.cs(9,17): warning CS1030: #warning:“欢迎来到老猫的理想!”
//test.cs(12,15): error CS1029: #error:“老猫的理想BLOG出错”
    #line指令用于修改编译器行号及文件名
        eg:
            using System;
            public class MikeCat
            {
                public static void Main()
                {
                    #line 66 "mfblog.cs" //将编译行号设为66并将文件名改名为mfblog.cs
                    intt i=1;
                    Console.WriteLine("i的值是{0}",i);
                }
            }//运行结果:mfblog.cs(66,6): error CS0246: 找不到类型或命名空间名称“intt”(是否缺少 using指令或程序集引用?)
//mfblog.cs(67,34): error CS0103: 名称“i”在类或命名空间“MikeCat”中不存在
    
    异常处理:在c#中,引发异常有两种状况,第一种:在程序中使用throw语句,立即无条件引发一个异常。第二种情况是c#语句或表达式在执行过程中激发了某个异常的条件,从而使得操作无法正常结束,从而引发异常。
    在c#中,异常是由try语句来处理。try语句提供了一种机制来捕捉程序过程中引发的异常。try有三种可能的结构,即:try-catch|try-finally|try-catch-finally
        try-catch结构:try子句后跟一个或多个catch子句。如果执行try子句中的语句时引发了异常,那么程序将按顺序查找第一个能处理该异常的catch子句,并将控制权转移到catch子句执行。既没定义异常类型,也没定义异常变量的catch子句称为普通catch子句。一个try子句最多只能有一个普通catch子句,而且该子句必须排在其他catch子句的后面。
    eg:
            using System;
            class MikeCat
            {
                static void mf1(string s)
                {
                    if(s==null)
                        throw(new ArgumentNullException());//引发异常
                }
                static void mf2()
                {
                    try
                    {
                        string s=null;
                        mf1(s);//调用mf()方法。由于s=null,因此会引发异常
                    }
                    catch(ArgumentNullException ex)
                    {
                        Console.WriteLine("mf2()方法中的异常:{0}",ex.Message);
                        throw;//再次引发
                    }
                }
                public static void Main()
                {
                    try
                    {
                        mf2();//调用mf2()方法
                    }
                    catch(ArgumentNullException ex)
                    {
                        Console.WriteLine("Main()方法中的异常{0}",e.Message);
                    }
                }
            }//mf2()方法中的异常:值不能为空。
//Main()方法中的异常值不能为空。
        try-finally结构:即try子句后跟一个finally子句。不管try子句是如何退出的(无论正常退出,还是引发异常,甚至执行goto|break|continue|return语句退出),程序的控制权总是会被转移到finally子句执行。
    eg:
        using System;
        public class MikeCat
        {
            public static void Main()
            {
                try
                {
                    Console.WriteLine("执行try子句");
                    //goto leave;//跳转到leave标签
                    return;
                }
                finally
                {
                    Console.WriteLine("执行finally子句");
                }
                leave:
                    Console.WriteLine("执行leave标签!");
            }
        }//执行try子句执行finally子句
            try-catch-finally:即try子句后跟一个或多个catch子句及一个finally子句
        eg:
                using System;
                class MikeCat
                {
                    static void mf(string s)
                    {
                        if(s==null)
                            throw(new ArgumentNullException());//引发异常
                    }
                public static void Main()
                {
                    try
                    {
                        string s=null;
                        mf(s);//调用mf()方法,由于s=null,因此会引发异常
                    }
                    catch(ArgumentNullException ex)
                    {
                        Console.WriteLine("异常发生:{0}",ex.Message);
                    }
                    finally
                    {
                        Console.WriteLine("执行finally子句");
                    }
                }
                }
posted @ 2004-12-18 00:36 迈克老猫 阅读(581) | 评论 (0)编辑
本教程参考C#和ASP.NET程序设计教程撰写,有什么不足之处请大家指出,或在老猫的理想BLOG留言。

   长假就要过去了。钱包也空空如也了,又要投入让人生畏的紧张工作中了... 感慨虽然很多,可是教程还是要继续的写,先发几句牢骚。^_^,不过教程可能以后要写的慢些了,因为心有余而力不足丫!不说废话进入正题:
   有网友说教程过于繁琐,呵呵,下面正好要分析一下流程控制语句,有C程序设计基础的就略过这段,考虑有新手还是简要的介绍一下,详细还请参阅谭浩强教授的《C语言程序设计》一书吧,很强,值得一看。
    c#中,有两种选择语句:if语句、switch语句。
      1.if (布尔表达式)
           {
               内嵌语句;
           }
           else if(布尔表达式)
           {
               内嵌语句;
           }
           else
           {
               内嵌语句;
           }//当布尔表达式的值为真时,执行if后面的内嵌语句。
       还是举个小例子吧,要不总觉得不够透彻。注意例子中穿插介绍的程序入口点带参数的Main()方法、还有char的IsDigit方法。
                   using System;
                   class MikeCat
                   {
                       public static void Main(string[] args)
                       {
                           if(args.Length!=1)//判断参数个数的布尔运算
                           {
                               Console.WriteLine("命令行参数只能是一个");
                           }
                           else
                           {
                               char c=args[0][0];//此处想和大家讨论:第一维感觉是第几个参数的索引,第二维是某个参数的字符数索引。不知是否正确,没有查到相关资料,大家怎么看??
                               if((c>='A')&&(c<='Z'))
                               {
                                   Console.WriteLine("{0}是大写字母",c);
                               }
                               if((c>='a')&&(c<='z'))
                               {
                                   Console.WriteLine("{0}是小写字母",c);
                               }
                               if(Char.IsDigit(c))
                               {
                                   Console.WriteLine("{0}是数字",c);
                               }
                           }
                       }
                   }
           Main 方法是程序的入口点,程序控制在该方法中开始和结束。该方法在类或结构的内部声明。它必须为静态的。它可以具有 void 或 int 返回类型。在 Main 方法中创建对象和调用其他方法。声明 Main 方法时既可以不使用参数,也可以使用参数。
           Main 方法可以是 void 类型:
            static void Main() 
            {
            }
            它还可以返回 int:
            static int Main() 
            {
               return 0;
            }
            Main 方法可以使用参数,在这种情况下它采用下列形式之一:
            static int Main(string[] args)
            static void Main(string[] args)
            Main 方法的参数是表示命令行参数的 string 数组。通常通过测试 Length 属性来检查参数是否存在,例如:
            if (args.Length == 0) 
            {
               Console.WriteLine("Please enter a numeric argument."); 
               return 1; 
            }
            还可以使用 Convert 类或 Parse 方法将字符串参数转换为数值类型。例如,下面的语句使用 Int64 类上的 Parse 方法将字符串转换为 long 型数字:
            long num = Int64.Parse(args[0]);
            也可以使用别名为 Int64 的 C# 类型 long:
            long num = long.Parse(args[0]);
            还可以使用 Convert 类的方法 ToInt64 完成同样的工作:
            long num = Convert.ToInt64(s);
            
    Char.IsDigit 方法
            指示某个 Unicode 字符是否属于十进制数字类别。
             public static bool IsDigit(char);
            指示指定字符串中位于指定位置处的字符是否属于十进制数字类别。
             public static bool IsDigit(string, int);
            using System;
            public class IsDigitSample {
                public static void Main() {
                    char ch = '8';
                    Console.WriteLine(Char.IsDigit(ch));                    // Output: "True"
                    Console.WriteLine(Char.IsDigit("sample string", 7));    // Output: "False"
                }
            }
        2.switch(控制表达式)
            {
                case 常量表达式:
                    内嵌语句;
                    [break;]
                    [goto case 常量表达式]
                ...
                default:
                    内嵌语句;
            }//switch语句是if语句的变种。如果把一个变量或表达式与许多不同的值进行比较并根据不同的比较结果执行不同的程序段。
            注意c#中如果要想实现象c/c++中那样的直达功能,则要使用goto case和goto default跳转语句。
        
        循环语句用于重复执行一行或多行代码。c#中有四种循环语句:while、do...while、for、foreach语句。
    1.while(布尔表达式)
        {
            内嵌语句;
        }//计算布尔表达式的值。当布尔表达式为真时,执行一遍内嵌语句。
    不举例子了,说说需要注意的部分吧:while语句是有条件地重复执行内嵌语句0次或多次。在while语句中,可以用break语句立即结束循环。另外也可以使用continue语句停止内嵌语句的执行,而继续下一次循环。
    2.do...while语句
        区别与while语句首先要执行一次内嵌语句,然后才检查布尔表达式。
    3.for 语句
        for(initializer;condition;iterator)
        {
            内嵌语句;
        }//initializer、condition、iterator均是可选项。initializer用于初始化循环控制变量,此变量可以有一个或多个(用逗号隔开);condition为循环控制条件,也可以有一个或多个语句;iterator按规律改变循环控制变量的值。
    4.foreach语句
        foreach语句从c#中新引入的,c/c++中没有此语句。foreach用于枚举集合中每个元素,并对每个元素执行内嵌语句。
            foreach(type identifier in expression)
            {
                内嵌语句;
            }//类型type和标识符identifier用来声明循环变量,表达式对应要枚举的集合。
                using System;
                using System.Collections;
                class MikeCat
                {
                    public static void Main()
                    {
                        IDictionary envvars=Environment.GetEnvironmentVariables();
                        Console.WriteLine("共有{0}个环境变量",envvars.Keys.Count);
                        //循环输出每个环境变量及其值
                            foreach(string k in envvars.Keys)
                            {
                                Console.WriteLine("{0}={1}",k,envvars[k].ToString());//或者用envvars.Value
                            }
                    }
                }
posted @ 2004-12-18 00:32 迈克老猫 阅读(513) | 评论 (0)编辑
     摘要: 迈克老猫 来自:老猫的理想 本教程参考C#和ASP.NET程序设计教程撰写,有什么不足之处请大家指出,或在老猫的理想BLOG留言。 这次简述一下操作符      1.算术操作符              算术操作符包括加(+)、减(-)、乘...  阅读全文
posted @ 2004-12-18 00:31 迈克老猫 阅读(574) | 评论 (0)编辑

迈克老猫
来自:老猫的理想

本教程参考C#和ASP.NET程序设计教程撰写,有什么不足之处请大家指出,或在老猫的理想BLOG留言。

这次我们首先讲解一下类型转换,我们在写程序时经常用到类型转换,而且特别多的规则。我在这里粗略的讲解一下。
隐式转换是系统默认的、不需要加以声明即可进行的转换。
     1.隐式数值转换
         隐式数值转换实际上就是从低精度的数值类型转换到高精度的数值类型的转换。
             byte x=255;ushort y=x;y=65535;float z=y;//均从低精度到高精度,反之会产生溢出
     隐式数值转换的类型太多,我就不多介绍,记住上面的原则就可以了。详细规则可查看msdn
     2.隐式枚举转换
     隐式枚举转换用于把十进制整数0转换成任何枚举类型,对应的其他整数则不存在这种转换。
          using System;
          enum Color
          {
                  Red,Green,Blue
          };
          class MikeCat
          {
                  static void Main()
                  {
                      Color c;//声明Color的变量c;
                      c=0;//将0转换为Red;
                      Console.WriteLine("c的值是{0}",c);//结果:c的值是Red;如果将c=0改成c=1,则编译器会给出错误。
                  }
          }
     3.隐式引用转换
          从任何引用类型到object的转换。
          从类类型A到类类型B的转换,其中类A从类B派生得到。
          从类类型A到接口类型B的转换,其中类A实现了接口B。
          从接口类型A到接口类型B的转换,其中接口A是从接口B派生。
          从任何数组类型到System.Array的转换。
          从任何委托类型到System.Delegate的转换。
          从任何数组类型或委托类型到System.ICloneable的转换。
          从空类型(null)到任何引用类型的转换。
显示转换也称为强制转换,它需要用户明确地指定转换的类型。
         char c=(char)65;//A
         int i=(int)'A';//65
              显示转换包含所有的隐式转换,即任何系统允许的隐式转换写成显示转换的形式都是允许的。
         int i=300;
         long l=(long)i;
         另外一例:
             using System;
            class MikeCat
            {
                static void Main()
                {
                long longValue = Int64.MaxValue;
                int intValue = (int) longValue;
                Console.WriteLine("(int){0} = {1}", longValue, intValue);
                }
            }
            类型 long 转换为 int 是显式转换,它使用了强制转换表达式。输出为:
            (int) 9223372036854775807 = -1这是因为有溢出发生。
        1.显示数值转换
                显示数值转换是指当不存在相应的隐式转换时从一种数值类型转换为另一种数值类型。转换类型也很繁琐,只需记住转换规则,详细查阅MSDN。由于显示数值转换可能丢失信息或引发异常,因此转换按以下原理被处理:简略说就是高精度显示转换为低精度会引发异常(OverFlowException),未引发异常的情况,源变量的值通过舍入得到最接近的整型值作为转换结果。详细转换时的异常情况查阅MSDN
                /*test.cs*/
                using System;
                public class MikeCat
                {
                    public static void Main()
                    {
                        ushort u=65535;
                        byte b=(byte)u;
                        Console.WriteLine("b的值是{0}",b);
                    }
                
                }
                 编译状况如下:
                     E:\>csc test.cs
                    Microsoft (R) Visual C# .NET 编译器版本 7.10.3052.4
                    用于 Microsoft (R) .NET Framework 版本 1.1.4322
                    版权所有 (C) Microsoft Corporation 2001-2002。保留所有权利。
                    E:\>test.exe
                    b的值是255
                    E:\>csc/checked test.cs ///checked[+|-] 生成溢出检查
                    E:\>test.exe
                    未处理的异常: System.OverflowException: 算术运算导致溢出。
                    at MikeCat.Main()
                    E:\>csc/checked- test.cs
                    E:\>test.exe
                    b的值是255
    2.显示枚举转换
        显示枚举转换其实就是将枚举类型的元素类型与相应类型之间进行隐式显示转换。比如,有一个元素类型int的枚举类型E,当执行从E到byte的显示枚举转换时,实际执行的是从int到byte的显示数值转换。
                    using System;
                    enum Color
                    {
                    Red,Green,Blue
                        };
                    public class MikeCat
                    {
                        static void Main()
                        {
                            Color c;//声明Color的变量c;
                            c=(Color)4;//对数字3进行显示枚举转换
                            Console.WriteLine("c的值是{0}",c);
                        }
                    }
                    结果:c的值是4
    Convert 类
                        将一个基本数据类型转换为另一个基本数据类型。
                        该类返回值与指定类型的值等效的类型。受支持的基类型是 Boolean、Char、SByte、Byte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、Double、Decimal、DateTime 和 String。

                存在将每个基类型转换为每个其他基类型的转换方法。不过,所执行的实际转换操作分为三类:

                从某类型到它本身的转换只返回该类型。不实际执行任何转换。
                无法产生有意义的结果的转换引发 InvalidCastException。不实际执行任何转换。下列转换会引发异常:从 Char 转换为 Boolean、Single、Double、Decimal 或 DateTime,以及从这些类型转换为 Char。下列转换会引发异常:从 DateTime 转换为除 String 之外的任何类型,以及从任何类型(String 除外)转换为 DateTime。
                任何基类型(上面描述的基类型除外)都可以与任何其他基类型进行相互转换。
                如果数字类型转换导致精度丢失(即某些最低有效位丢失),不引发异常。但是,如果结果超出了特定转换方法的返回值类型所能表示的范围,则将引发异常。

下面介绍一下和类型转换相关的装箱、取消装箱
            装箱是值类型到 object 类型或到该值类型所实现的任何接口类型的隐式转换。将一个值的值装箱会分配一个对象实例并将该值复制到新的对象中。

        请看以下值类型变量的声明:

        int i = 123;
        以下语句对变量 i 隐式应用装箱操作:

        object o = i;
        此语句的结果是在堆栈上创建对象 o,而该对象在堆上引用 int 类型的值。该值是赋给变量 i 的值类型值的一个副本。下图说明了两个变量 i 和 o 之间的差异。

        装箱转换
        在堆栈上            在堆上
        i 123
        int i=123;
        o                    (将i装箱)
        object o=i;            int 123
        也可以(但绝不必要)如下例所示显式执行装箱:
        int i = 123;
        object o = (object) i;
        示例
        此例将整数变量 i 通过装箱转换为对象 o。这样,存储在变量 i 中的值就从 123 更改为 456。此例显示对象保留了内容的原始副本,即 123。
        // boxing.cs
        // Boxing an integer variable
        using System;
        class TestBoxing
        {
         public static void Main()
         {
         int i = 123;
         object o = i; // Implicit boxing
         i = 456; // Change the contents of i
         Console.WriteLine("The value-type value = {0}", i);
         Console.WriteLine("The object-type value = {0}", o);
         }
        }
        输出
        The value-type value = 456
        The object-type value = 123

    取消装箱
        取消装箱是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。取消装箱操作包括:

        检查对象实例,确保它是给定值类型的一个装箱值。
        将该值从实例复制到值类型变量中。
        以下语句同时说明了装箱和取消装箱操作:

        int i = 123; // A value type
        object box = i; // Boxing
        int j = (int)box; // Unboxing
        下图显示了以上语句的结果。

取消装箱转换
        在堆栈上        在堆上
        i 123
        int i=123;
        o                (将i装箱)
        object o=i;        int 123
        j 123
        int j=(int) o;
        为使到给定值类型的取消装箱转换在运行时取得成功,源参数的值必须是对某个对象的引用,而该对象先前是通过将该值类型的值装箱创建的。如果源参数为 null 或是对一个不兼容对象的引用,则会引发 InvalidCastException。
        示例
        下面的示例阐释无效取消装箱的情况,即错误的取消装箱如何导致 InvalidCastException。通过使用 try 和 catch,发生错误时会显示错误信息。
        using System;
        public class UnboxingTest
        {
         public static void Main()
         {
         int intI = 123;
         // Boxing
         object o = intI;
         // Reference to incompatible object produces InvalidCastException
         try
         {
         int intJ = (short) o;
         Console.WriteLine("Unboxing OK.");
         }
         catch (InvalidCastException e)
         {
         Console.WriteLine("{0} Error: Incorrect unboxing.",e);
         }
         }
        }
        输出
        System.InvalidCastException
         at UnboxingTest.Main() Error: Incorrect unboxing.
        如果将下列语句:
        int intJ = (short) o;
        更改为:
        int intJ = (int) o;
        转换将执行,而您将得到输出“Unboxing OK”。


posted @ 2004-12-18 00:24 迈克老猫 阅读(518) | 评论 (0)编辑

迈克老猫
来自:老猫的理想

本教程参考C#和ASP.NET程序设计教程撰写,有什么不足之处请大家指出,或在老猫的理想BLOG留言。

继续上回,数组是我们经常用到的,我来介绍一下:数组是具有相同类型的一组数据。当访问数组中的数据时,可以通过下标来指明。c#中数组元素可以为任何数据类型,数组下标从0开始,即第一个元素对应的下标为0,以后逐个递增。数组可以一维也可多维。
     //包含6个元素的一维整数数组;
        int[] mf1=new int[6]; //注意初始化数组的范围,或者指定初值;