欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#基础一

程序员文章站 2022-03-27 09:29:40
...

.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, "数值超出界限", "请检查错误");

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

相关标签: C#基础-第一部分