BITED程序员语言学习心得之:C#语言基础
一、HelloWorld
我们先来看看最简单的C#代码——HelloWorld:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DailyCSHARP20130829
8 { 9 class HelloWorld 10 { 11 public static void Main() 12 { 13 System.Console.WriteLine("Hello World!"); 14 System.Console.ReadLine(); 15 } 16 } 17 }
二、标识符
然后我们说说C#标识符。标识符的命名规则有三:
- 类名和函数名用大写字母开头的单词组成。
- 变量和参数用小写字母开头的单词组成。
- 常量用全用大写的单词,用下划线分隔单词。
三、变量和常量
我们通过以下一段代码来认识C#的各种变量类型。
1 class A 2 { 3 public static int x; 4 int y; 5 void F(int[] v, int a, ref int b, out int c) { 6 int i = 1; 7 c = a + b++; 8 } 9 }
其中x是静态变量,y是实例变量,v[0]是数组元素,a是数组参数,b是引用参数,c是输出参数,i是局部变量。
四、数据类型
数组在声明时不能指定大小。
装箱和拆箱:装箱和拆箱是一个抽象的概念 ,装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型;利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来。
例如:
1 int val = 100; 2 object obj = val; 3 Console.WriteLine (“对象的值 = {0}", obj);
这是一个装箱的过程,是将值类型转换为引用类型的过程。
1 int val = 100; 2 object obj = val; 3 int num = (int) obj; 4 Console.WriteLine ("num: {0}", num);
这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程。
注:被装过箱的对象才能被拆箱!
数据类型转换
除了显式转换、隐式转换,我们还可以用Convert类进行转换。
Convert类的每个ToXXX方法都能够把一个值转换为一个基本的.NET类型,例如:
1 static void Main() 2 { 3 string str1 = "999"; 4 int i = System.Convert.ToInt32(str1); 5 i++; 6 System.Console.WriteLine(i); 7 }
其输出结果为1000。
五、语句、运算符和表达式
foreach语句:为数组或对象集合中的每个元素重复一个嵌入语句组。
1 foreach(String strkey in envvars.keys) 2 { 3 Console.WriteLine(); 4 }
六、类
构造函数:总是public的,且和它的类名相同。
1 class test 2 { 3 public test():base { }//由编译器提供 4 }
析构函数以类名的前面加上“~”的方式命名,以释放这些资源。
1 public void ~test{ 2 //清除 3 }
方法
- 输入参数:一般情况下,如果没有设定,输入参数总是用值传递。
- 引用参数:例如:
1 void myMethod(ref int nInOut)
因为传递了一个变量给该方法(不仅是它的值),变量必须被初始化,否则编译器会报警。使用引用参数,定义和调用都加上ref限定符。 - 输出参数:out 类型 变量名
- 改写方法:程序员可以用virtual关键字设计方法:
1 virtual void CanBOverridden()
当从基类派生时,派生类要做的就是在新方法中加入override关键字:
1 override void CanBOverridden()
以下展示一个改写基类的方法:
1 class Triangle 2 { 3 public virtual double ComputeArea(int a, int b, int c) 4 { 5 double s = (a + b + c) / 2.0; 6 double dArea = Math.Sqrt(s*(s-a)*(s-b)*(s-c)); 7 return dArea; 8 } 9 } 10 11 class RightAngledTriangle : Triangle 12 { 13 public override double ComputeArea(int a, int b, int c) 14 { 15 double dArea = a * b / 2.0; 16 return dArea; 17 } 18 } 19 20 class TriangleTestApp 21 { 22 public static void Main() 23 { 24 Triangle tri = new Triangle(); 25 Console.WriteLine(tri.ComputeArea(2, 5, 6)); 26 RightAngledTriangle rat = new RightAngledTriangle(); 27 Console.WriteLine(rat.ComputeArea(3, 4, 5)); 28 } 29 }
当我需要调用基类时可以用:
1 dArea = base.ComputeArea(a,b,c);//用base来实现
- 方法屏蔽:重定义方法的另一种方法就是屏蔽基类的方法。当从基类派生类时,此功能特别有用。下面给出一个例子演示如何运用new修饰符。(屏蔽基类方法)
1 class BaseClass 2 { 3 public void TestMethd() 4 { 5 Console.WriteLine("Base"); 6 } 7 } 8 9 class DerivedClass : BaseClass 10 { 11 new public void TestMethod() 12 { 13 Console.WriteLine("Derived"); 14 } 15 }
这种行为不同于之前所说的改写方法,后者能保证大部分派生方法获得调用。
七、异常处理
- 校验和非校验语句:
C#自动处理溢出情况,而不明确的发出警告。通过给整个应用程序(经编译器开关)或语句级允许溢出校验,就可以改变这种情况。
1 //运行以下编译器指令,可以达到给整个应用程序控制溢出校验 2 csc factorial.cs /cheacked+ 3 4 //checked为语法溢出校验,unchecked为非校验 5 checked {} 6 unchecked{}
unchecked即如果允许了溢出校验,被unchecked的语句所括住的代码将不会引发溢出校验。
2. 异常处理语句:
-
- 使用try和catch捕获异常:try语句中包含容易产生异常的代码,接着就是捕获异常。无论异常什么时候发生,在catch段里的代码会进行适当的处理。一般化异常处理代码
1 try 2 { 3 ... 4 } 5 6 catch(System.Exception e) 7 { 8 ... 9 }
但要注意的是,不能使用ref和out修饰符传递e对象给一个方法,也不能赋给他一个不同的值。
- 使用try和finally清楚异常:这里只关心清除而不是错误处理。它不仅抑制出错信息,而且所有包含在finally块中的代码在异常被引发后仍然会被执行。
- 使用try-catch-finally处理所有异常:下例显示了处理零除错误的途径:
1 class CatchIT 2 { 3 public static void Main() 4 { 5 try 6 { 7 int nTheZero = 0; 8 int nResult = 10 / nTheZero; 9 } 10 catch (DivideByZeroException divEx) 11 { 12 Console.WriteLine("divide by zero occured!"); 13 } 14 catch (Exception Ex) 15 { 16 Console.WriteLine("some other exception"); 17 } 18 finally 19 { 20 } 21 } 22 }
- 使用try和catch捕获异常:try语句中包含容易产生异常的代码,接着就是捕获异常。无论异常什么时候发生,在catch段里的代码会进行适当的处理。一般化异常处理代码
3. 引发异常:
C#提供了throw语句来引发异常。使用throw语句既可以引发系统异常,也可以引发自定义异常。使用throw语句抛出异常的语法如下:
1 throw ExObject;
ExObject:所要抛出的异常对象,这个异常对象是派生自System.Exception类的类对象。
实例代码如下:
1 using System; 2 class Program 3 { 4 static void Main() 5 { 6 int[]array = new int[4]; 7 try 8 { 9 for (int i = 0; i < 5; i++) 10 { 11 array[i] = i; 12 if (i < array.Length) 13 throw new IndexOutOfRangeException(); 14 } 15 } 16 catch (IndexOutOfRangeException e) 17 { 18 Console.WriteLine(e.Message); 19 } 20 } 21 }
下面列出runtime提供的标准异常:
Exception 所有异常对象的基类
SystemException 运行时产生的所有错误的基类
IndexOutOfRangeException 当一个数组的下标超出范围时运行时引发
NullReferenceException 当一个空对象被引用时运行时引发
InvalidOperationException 当对方法的调用对对象的当前状态无效时,由某些方法引发
ArgumentException 所有参数异常的基类
ArgumentNullException 在参数为空(不允许)的情况下,由方法引发
ArgumentOutOfRangeException 当参数不在一个给定范围之内时,由方法引发
InteropException 目标在或发生在CLR外面环境中的异常的基类
ComException 包含COM 类的HRESULT信息的异常
SEHException 封装win32 结构异常处理信息的异常
Copyright ©2013 BITED.All rights reserved.