本教程参考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子句");
}
}
}
好些天不写了。今天事情较少,有几个网友总是问,就又写了点东西。可能疏漏比较多,希望大家帮忙指正
预处理指令:与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子句");
}
}
}