初始化文本框、按钮的效果函数。
注释很清楚我就不多说了。
| 程序代码: |
.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 迈克老猫 阅读(884) 评论(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 迈克老猫 阅读(1520) 评论(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 迈克老猫 阅读(562) 评论(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 迈克老猫 阅读(619) 评论(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 迈克老猫 阅读(557) 评论(0)
编辑
摘要: 迈克老猫 来自:老猫的理想 本教程参考C#和ASP.NET程序设计教程撰写,有什么不足之处请大家指出,或在老猫的理想BLOG留言。 这次简述一下操作符 1.算术操作符 算术操作符包括加(+)、减(-)、乘...
阅读全文
posted @ 2004-12-18 00:31 迈克老猫 阅读(621) 评论(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 迈克老猫 阅读(594) 评论(0)
编辑
迈克老猫
来自:老猫的理想
本教程参考C#和ASP.NET程序设计教程撰写,有什么不足之处请大家指出,或在老猫的理想BLOG留言。
继续上回,数组是我们经常用到的,我来介绍一下:数组是具有相同类型的一组数据。当访问数组中的数据时,可以通过下标来指明。c#中数组元素可以为任何数据类型,数组下标从0开始,即第一个元素对应的下标为0,以后逐个递增。数组可以一维也可多维。
//包含6个元素的一维整数数组;
int[] mf1=new int[6]; //注意初始化数组的范围,或者指定初值;
//包含6个元素的一维整数数组,初值1,2,3,4,5,6
int[] mf2=new int[6](1,2,3,4,5,6);
//一维字符串数组,如果提供了初始值设定项,则还可以省略 new 运算符
string[] mf3={"c","c++","c#"};
//一维对象数组
Object[] mf4 = new Object[5] { 26, 27, 28, 29, 30 };
//二维整数数组,初值mf5[0,0]=1,mf5[0,1]=2,mf5[1,0]=3,mf5[1,1]=4
int[,] mf5=new int[,]{{1,2},{3,4}};
//6*6的二维整型数组
int[,] mf6=new mf[6,6];
下面来看一个一维字符串数组的遍历
using System;
public class MikeCat
{
static void PrintArray(string[] arr)
{
//打印数组元素,arr.Length 表示数组元素的个数
for(int i=0;i<arr.Length;i++)
{
Console.WriteLine("arr[{0}]={1}",i,arr[i]);
}
}
public static void Main()
{
string[] arr={"c","c++","c#"};
//将数组作为一个参数传递
PrintArray(arr);
}
}
程序结果:arr[0]=c arr[1]=c++ arr[2]=c#
下面来看一个4行2列(4*2)的整型数组的遍历:
using System;
public class MikeCat
{
static void PrintArray(int[,] arr)
{
//通过两次FOR循环遍历二维数组
for(int i=0;i<4;i++)//初始化i作为循环变量,i++实现该变量的自增运算。
//for循环满足条件后执行完循环体一次后执行i++,然后进入下次循环。简单的c语法,这里做简单介绍照顾初学者。(详细可参阅谭浩强先生的c语言程序设计一书)
{
for(int j=0;j<2;j++)
{
Console.WriteLine("arr[{0},{1}]={2}",i,j,arr[i,j]);//打印每个二维数组元素
}
}
}
public static void Main()
{
//主函数
//将数组作为一个参数传递
PrintArray(new int[,]{{1,2},{3,4},{5,6},{7,8}};
}
}
运行结果:arr[0,0]=1 arr[0,1]=2 arr[1,0]=3 arr[1,1]=4 arr[2,0]=5 arr[2,1]=6 arr[3,0]=7 arr[3,1]=8
类是面向对象程序设计的基本构造块,详细我们在后面介绍。这里我们介绍两个特殊的类,即object类和string类
1.object类
object类是预定义类System.Object的别名,它是所有其他类型的基类。c#中所有类型都直接或间接从object类中继承。因此,一个object类的变量可以赋予任何类型的值。
int i=30;
object obj1;
obj1=i;
object obj2='a';
2.string类
string类专门用于对字符串的操作,他是预定义类System.String的别名
string str1="mikecat";
可以用"+"号连接两个字符串。
string str2="username:"+"mikecat";
如果访问单个字符,则要用下标。
char c=str1[0];
比较两个字符串是否相等,可用比较操作符"=="//有别于basic语法
bool b=(str1==str2);
c#中,取消了c和c++中使用最灵活,也是最难掌握的指针。那么在c#中如何提供c/c++中的函数指针的功能?c#提供了委托(delegate),委托是继承自System.Delegate类的引用类型。它相当于函数指针原型。与函数指针不同的是,委托在c#中是类型安全的,委托特别适合于匿名调用。要使用委托需经过三个步骤,即声明、实例化、调用。
using System;
//声明一个名为mfDelegate的委托,该委托有一个string类型的参数
//c#编译器编译时会产生一个新类,该类继承自System.Delegate,类
//名为mfDelegate
public delegate void mfDelegate(string name);
public class MikeCat
{
//定义与mfDelegate有相同参数类型的方法Hello()
public static void Hello(string name)
{
Console.WriteLine("您好,{0}!",name);
}
//定义与mfDelegate有相同参数类型的方法GoodBye()
public static void GoodBye(string name)
{
Console.WriteLine("再见,{0}!",name);
}
public static void Main()
{
//创建一个mfDelegate实例 mf1
mfDelegate mf1=new mfDelegate(Hello);
//调用mf1
mf1("mikecat");
mfDelegate mf2=new mfDelegate(GoodBye);
mf2("mikecat");
//将mf1 mf2组合成一个新的委托mf3
mfDelegate mf3=mf1+mf2;
//调用mf3
mf3("迈克老猫");
//从组合的委托mf3中删除mf1
mfDelegate mf4=mf3-mf1;
mf4("mikecat");
}
}
程序结果:您好,mikecat!//mf1; 再见,mikecat!//mf2
您好,迈克老猫! 再见,迈克老猫!//mf3
再见,mikecat!//mf4
posted @ 2004-12-18 00:19 迈克老猫 阅读(808) 评论(1)
编辑
迈克老猫
来自:老猫的理想
本教程参考C#和ASP.NET程序设计教程撰写,有什么不足之处请大家指出,或在老猫的理想BLOG留言。
首先讲解一下c#,这里只是粗略的讲解,详细内容请购买相关书籍,或参阅相关文档。c#已经取消了c++中的指针,并且在c++中大量被使用的操作符(:: ->)已经不在出现,c#中指支持一个"."。c#具有面向对象编程语言的所有特性,如封装、继承、多态等。而且比java更面向对象,每种类型都可以看作一个对象。但c#指允许单继承,即一个类不会有多个基类。另外,c#没有了全局函数,没有了全局变量,也没有了全局常量。一切都必须封装在一个类中。
下面举一个控制台应用程序的小例子:
using System;
class MikeCat
{
public static void Main()
{
Console.WriteLine("迈克老猫c# asp.net入门系列教程--欢迎访问老猫的理想");
}
}
在c#中程序总是从Main()方法开始,Main()方法必须且只能包含在一个类中,Main()方法返回的类型可以是void(无返回值)或int(返回代表应用程序错误级别的整数)。
上面的using System;用于导入名字空间(Namespace)用来表明类的层次关系。如果不用using导入名字空间,则每次用某一个类时就得在类名前面加上名字空间。
c#程序的输入输出通过Console来实现。Console是System名字空间下的一个类。在屏幕上输出一个字符串用Console.WriteLine(),接受输入设备的输入用Console.ReadLine()方法。
程序代码:
class MikeCat
{
public static void Main()
{
System.Console.WriteLine("迈克老猫c# asp.net入门系列教程--欢迎访问老猫的理想\n");
System.Console.WriteLine("请输入用户名:");
string user=System.Console.ReadLine();
System.Console.WriteLine("欢迎你:{0}的光临!",user);
}
}
WriteLine()方法的参数表中紧随串后的第一个参数将替换{0}。
如果执行程序时要传递命令行参数给应用程序,则Main()方法的格式应为:
using System;
public class MikeCat
{
public static void Main(string[] args)
{
Console.WriteLine("共有{0}个命令行参数",args.Length);
for(int i=0;i<args.Length;i++)
{
Console.WriteLine("Arg[{0}]=[{1}]",i,args[i]);
}
}
}
c#中的单行注释用//,多行注释用/*...*/
c#中使用常量:
using System
class MikeCat
{
public const double PI=3.14;
public static void Main()
{
Console.WriteLine("圆周率PI的值为{0}",PI);
}
}
结构体类型(struct)是一种复合数据类型,用于将某些相关的数据组织到一个新的数据类型中。
using System;
struct MikeCat
{
public string Mike;//user
public uint Age;//age
public string Email;//email
}
class mf
{
public static void Main()
{
MikeCat zl;//声明结构体类型变量zl
zl.Name="迈克老猫";
zl.Age=24;
zl.Email="mike@hebut.com";
Console.WriteLine("姓名:{0},年龄:{1},邮箱:{2}",zl.Name,zl.Age,zl.Email);
}
}
c#中枚举类型(enum)是一组逻辑上密不可分的整数值:
using System;
enum WeekDay
{
Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
};//注意这里的分号
class MikeCat
{
static void Main()
{
WeekDay day;//声明枚举型变量day
day=WeekDay.Tuesday;
Console.WriteLine("day的值是{0}",day);
}
}
c#中枚举类型中的每个元素类型均为int byte long short型,且第一个元素值为0,其后面的按1递增。在枚举中也可以直接给元素赋值,后面的递增。
enum WeekDay:byte
{
Sunday=1,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
};
posted @ 2004-12-18 00:09 迈克老猫 阅读(673) 评论(0)
编辑