首先我们要知道C#语言是一种面向对象的语言由C和C++演变而来,它依赖于.NET Framework。.NET Framework可以提供一个强大的代码库供其调用。之所以说C#语言依赖于.NET Framework是由于C#源代码只有经过编译器(指VS或VCE)的编译之后,变成CIL(Common Intermediate Language)通用中间语言。其实通常是我们常见的.exe或者.dll文件也叫作程序集。当我们运行.exe文件时,程序集将被CLR—公共语言运行时(Common Language Runtime)翻译为CPU的指令然后交由CPU完成。所以我们用C#只能编写托管环境下的代码(要受CLR控制)。学过JAVA的人可以把CLR理解为JAVA虚拟机,主要负责管理内存、处理安全性、垃圾回收、以及跨语言调试等。
学习一门编程语言我们还要了解它的基本语法:关于语法大家只要有一本系统介绍C#语言的书大致都差不多。
1、关于显示转换和隐式转换
隐式转换:类型A到B在所有情况下都可以进行,编译器自主进行转换。那么什么时候执行隐式转换呢?-只要类型A的取值范围完全包含在取值B中就可以执行隐式转换。
1 char str = 'a'; 2 ushort newStr; 3 newStr = str; 4 Console.WriteLine("str {0}", str); 5 Console.WriteLine("newStr {0}", newStr);
输出结果:str a
newStr 97
此时编译器自动执行了隐式转换。ushort和char类型的取值范围都在0~65535之间,所以可以执行类型转换。
显式转换:微软在程序中为我们提供了显示转换相关的方法(Convert)。但要注意溢出问题,如果实际需要转换的A类型值超过了B类型的取值范围就会发生溢出,但系统默认不会报错,但是会造成数据丢失。可以通过chack方法进行检查。
short str = 285; byte newStr; newStr =Convert.ToByte(str); Console.WriteLine("str {0}", str); Console.WriteLine("newStr {0}", newStr);
会报: 值对于无符号的字节太大或太小。
2 函数中的参数问题
首先注意函数调用时实参和形参要类型匹配。
c#允许指定一个(也只能是一个)特定的参数,必须是参数的最后一个用params修饰,称为参数数组。
static int sumVals(params int[] vals) { int sum=0; foreach(int val in vals) { sum+=val; } return sum; }
引用参数 ref 和 out
ref的特点是有进有出,即在传递参数之前就已经对它进行赋值,在传入方法体时,是将该数的地址传了进来,如果对其进行相应的赋值操作,直接改的是地址里的值,所以,当该方法执行完,该数的值也就跟着改变了。而out与ref的唯一区别是,在方法接收参数后,对它进行初始化(如果没有初始化,将会报错的),其余的用法都和ref一样。
ref 关键字使参数按引用传递,当执行调用方法时,在方法中对参数的任何更改都将反映在该变量中。学过C++可以类比引用。
class Ref { static void refExample(ref int i) { i = 20; } static void Main() { int val = 0; refExample(ref val); Console.WriteLine(val);//此时打印出20 } }
static void Main(string[] args) { int i ; Add( out i); Console.WriteLine(i);//结果输出11 } static void Add(out int i) { i=10; //如果没有这个赋值,将会报错的 i = i + 1; }