.NET FRAMEWORK平台

  1. .NET FRAMEWORK也可运行在其他操作系统上,例如:Mono,他是.net framework的开源版本
    可运行在linux、mac、ios、android
  2. . net framework主要包含庞大的代码库和公共语言运行库(Common Language Runtime,CLR)

CIL和JIT

代码—(由vs完成)–>通用中间语言(Common Intermediate Language,CIL)—(编译器,Just In Time,JIT)—->本机代码

程序集

程序集包括可执行的应用程序文件(.exe文件)和其他应用程序使用的库(dll文件)。

程序集包含CIL代码、元数据(程序集中包含的数据信息)和可选资源(CIL使用的其他数据,如声音、图片)

托管代码

在将代码编译为CIL,再用JIT编译为本机代码后,CLR还需要管理正在执行的用.NET FRAMEWORK编写的代码。即CLR管理着应用程序,其方式是管理内存、处理安全性以及允许进行跨语言调试等。相反,不受CLR控制的应用程序属于非托管类型。

垃圾回收

GC只针对托管代码

GC会定期检查计算机内存,从中删除不再需要的内容,垃圾回收的时间并不固定,可能一秒执行数千次检查,也可能几秒才执行一次

全局程序缓存集(GAC)

字符串是引用类型

goto语句

c#允许给代码加上标签,使用goto直接跳转到这些代码行上。

优点:这是控制什么时候执行哪些代码的一种简单方式。

缺点:过多的使用将使代码晦涩难懂。

用法: goto 标签名;

标签定义: 标签名:代码

        int myInteger = 5;
        goto mylable;
        myInteger += 10;
         mylable:
        Console.WriteLine("myInteger={0}", myInteger);

switch语句

一个case语句处理完后,不能自由的进入下一个case语句,但是有个例外,如果把多个case语句放在一起,其后加一个代码块,实际是一次检查多个条件,如果满足这些条件中的任何一个,就会执行代码。

循环的中断

break—立即中断循环

continue—立即终止当前循环,继续执行下一次循环

goto—可跳出循环

return–跳出循环及函数

使用goto时,退出循环是合法的,从外部进入循环是非法的

类型转换

在将一个值放在一个变量中时,如果该值过大,不能放在该类型的变量中,就会导致溢出,这就需要检查

checked和unchecked检查

        byte de;
        short so = 281;
        de = checked((byte)so);
        Console.WriteLine("sd={0}", so);
        Console.WriteLine("de={0}", de);

以上代码会出现错误,用unchecked代替checked,会得到同样结果,但不报错。

枚举

枚举的基本类型可以是byte、sbyte,short,ushort,int,uint,long,ulong

在枚举声明中添加类型,就可以指定其他基本类型,如果不制定,则默认为int

默认情况下,每个值都会根据定义的顺序(从0开始),被自动赋予对应的基本类型,可以使用‘=’来重写这个赋值的过程,指定每个枚举的实际值

enum orientation : byte
{
    north = 1,
    south = 2,
    east = 3,
    west = 4
}

class Program
{
    static void Main(string[] args)
    {
        byte directionByte;
        string directionString;
        orientation myDirection = orientation.north;
        Console.WriteLine("myDirection = {0}", myDirection);//输出north
        directionByte = (byte)myDirection;//把枚举值转换为其他类型,必须使用显示转换
        directionString = Convert.ToString(myDirection);//获得枚举字符串的值,使用Convert.ToString
        Console.WriteLine("byte equivalent = {0}", directionByte);//输出1
        Console.WriteLine("string equivalent = {0}", directionString);//输出north
        Console.ReadKey();
    }
}

如果将byte类型转换为枚举类型也要显式转换

myDirection=(orientation)directionByte;

String类型转换枚举类型

string myString = "north";
orientation myDirection = (orientation)Enum.Parse(typeof(orientation), myString);

结构

使用struct声明结构,要让其他地方的代码访问结构的数据成员,可以使用public修饰

enum orientation : byte
{
    north = 1,
    south = 2,
    east = 3,
    west = 4
}

struct route
{
    public orientation direction;
    public double distance;
}

class Program
{
    static void Main(string[] args)
    {
        route myRoute;
        int myDirection = -1;
        double myDistance;
        Console.WriteLine("1) North\n2) South\n3) East\n4) West");
        do
        {
            Console.WriteLine("Select a direction:");
            myDirection = Convert.ToInt32(Console.ReadLine());
        }
        while ((myDirection < 1) || (myDirection > 4));
        Console.WriteLine("Input a distance:");
        myDistance = Convert.ToDouble(Console.ReadLine());
        myRoute.direction = (orientation)myDirection;
        myRoute.distance = myDistance;
        Console.WriteLine("myRoute specifies a direction of {0} and a " +
           "distance of {1}", myRoute.direction, myRoute.distance);
        Console.ReadKey();
    }
}

数组

foreach对数组内容进行只读访问,所以不能改变任何元素的值

声明二维数组 int[,] name;

声明多维数组 int[,,,] name;

数组的数组

2种方式的初始化

shuzu =new int[2][];
shuzu[0]=new int[3];
shuzu[1]=new int[4];
第二种方式/
int[][] shuzu={new int[] {1,2,3,},new int[] {1},new int[] {1,2}};

string

string类型变量可以看成是char的只读数组

Trim()命令不只是去前后空格,也可删除其他字符,只要在一个char数组中指定这些字符即可

char[] chars = { ' ', 'e', 's' };
string str = "Yeeees";
str = str.Trim(chars);//值是Y

TrimStart()去前空格,TrimEnd()去后空格。这些命令都可以指定char数组

PadLeft()左边加空格,PadRight()右边加空格。使字符串达到指定长度

string str="aligned";
str=str.PadLeft(10);//值是"   aligned"

也可以添加指定字符达到指定长度

str=str.PadLeft(10,'-');//值是"---aligned"

参数数组

c#允许为函数指定一个特殊的参数,这个参数必须是函数定义中的最后一个参数,称谓参数数组。参数数组允许使用个数不定的参数调用函数,可使用params关键字定义他们

参数数组可以简化代码,因为在调用代码中不必传递数组,而是传递同类型的几个参数,这些参数会被放在可在函数中使用的一个数组中

 static int Sumvals(params int[] vals)
    {
        int sum = 0;
        for (int i = 0; i < vals.Length; i++)
        {
            sum += vals[i];
        }
        return sum;
    }

    static void Main(string[] args)
    {
        int sum = Sumvals(1, 5, 2, 9, 8);
        Console.WriteLine("结果是:" + sum.ToString());
    }

调试和错误处理

Debug.WriteLine();//仅在调试模式下运行,不能编译为可发布程序,在发布版本中,该命令会消失
Trace.WriteLine();//可以编译为发布程序

进入中断模式

进入中断模式的方式有2种:

1.抛出未处理异常时

2.生成判定语句(assertion)时

Debug.Assert();
Trace.Assert();//发布后如果触发判定语句,用户会看到提示框,仅在判定条件为false时触发
Trace.Assert(myvar < 10, "数值超出界限", "请检查错误");

要在监视窗口中添加变量,可以把变量从源代码拖动到该窗口中

posted on 2017-08-01 21:57  NE_STOP  阅读(2)  评论(0编辑  收藏  举报  来源