C# 基础语法

http://www.cnblogs.com/wenwei/archive/2011/10/14/2212351.html

一、c#基础

1.控制台基本操作

Console控制台标准输入、输出流和错误流,此类不能继承;下面的输入、输出都要通过他才能做到。

1)输出WriteLine是输出一个值并换行,Write是输出一个值不换行;

如:Console.WriteLine("hello"); Console.Write("hello");

2)输入ReadLine()读取一行字符,Read()读取下一个字符;如:string s= Console.ReadLine()

记住:无论你输入的是数字还是字符,他都当成一个字符串来处理;

如果想输入数字就要转换他的类型:

 string i = Console.ReadLine();输入一个数字字符

            int ii = Convert.ToInt32(i);将数字字符转换为int型,不能将abc……字符转换为int型;

            Console.WriteLine(ii*2);

3)占位符用大括号表示“{参数}”,占位符从中的参数从0开始,我们后面有几个值就用几个占位符,占位符中的序号也是要跟着的,比如有三个值要输出,那么占位符就应该是:{0}{1}{2}

例如:

int i1 = 10;

int i2 = 21;

Console.WriteLine("{0}+{1}={2}", i1, i2, i1 + i2); //占位符"{0}+{1}={2}",其中的数字012,顺序不能改变,我们要输出三个参数,也只能按顺序012,不能用014,随便乱用,占位符的顺序是从0开始的。

Console.WriteLine("{0}{1}",s,c);//还能在占位符之间加任意的字符串。

注:占位符中间写什么编译器他不管,他只管占位符{},其他的做一个字符串输出。

4)转义符:用反斜杠(\)作为转义符,@转义符的转义符

string z = "\"abc\""; //我们想输出(”abc”)不能这样写""abc"";,要用反斜杠将双引号转义告诉编译器第

二个和第三个双引号是我们要输出的而不是用来“框”字符串的。

string y = "\\\\\\"; //如果我想输出6个反斜杠,那么这样的话只能输出3个,因为每个反斜杠前面的那个反斜杠会变成一个转义符,

string x = @"\\\\\jk";  //@来将反斜杠转义,在要输出的字符串前面加上(@)说明字符串里面的反斜杠不是用来做转义用的,而是我们想要输出的。

注:@只能对反斜杠起作用对其他的符号不起作用。

5Console.ReadKey();//当按下一个按键时继续执行;如果这里不加上这一句的话,运行控制台程序时就会一闪而过,根本看不到他输出的是什么。

6)字符串的转换

Convert.ToInt32(参数);将参数转换为int32型,

Convert.ToString(参数);将参数转换为字符串;

Convert.ToBoolean(参数);falsetrue字符串转换为布尔型(既有判断性质,而不是一个简单的字符串)

7)两个字符串相连

c#要将两个字符串相连,不用像cc++里面一样需要用函数才能连接,直接用加号即可

如:string x=”abc”;

string y=def”

Console.WriteLine(x+y);结果为abcdef

2.循环的中断

1continue结束本次循环;

continue陷阱:

int sum=0;

            while (sum<100)

            {

                if (sum % 7 == 0)

                {

                    Console.WriteLine(sum);

                    sum++;//这里就是continue的陷阱,因为当sum能被7整除的时候他就跳出本次循环,那么下面的sum就不能自加1,当下一次循环的时候,sum还是上一次能被7整除的那个值,上一次能被7整除,如果这里不自加的话,他将永远被整除下去,这里就陷阱所在。就是说你continue跳过本次循环,那么你要为你跳过本次循环的后果负责,如果后果不要就的话那么你可以不负责,显然这个循环是要求负责的。

                    continue;

                }

                sum++;

            }

 

2break跳出循环,如果循环语句遇到break,那么就不在循环了,直接跳出循环执行循环外面的语句。

int max = 0;

            while (true)

            {

                string s = Console.ReadLine();

                if (s =="end")

                {

                    Console.WriteLine("最大值为:{0}",max);

                    Console.ReadKey();

                    break;// 直接跳出循环(或者说结束本次循环);                   

                }

                int i = Convert.ToInt32(s);

                if (i > max)

                {

                    max = i;

                }

            }

            Console.WriteLine("如果if里面用return,则不会执行到这里来直接返回主函数了");

            Console.ReadKey();

 

3return返回函数,直接跳出函数。

static void Retu()

{

 while (true)

            {

                string s=Console.ReadLine();

                if (s == "q")

                    return;// 这个程序中while看上去是个死循环,但是在if这里用了returnreturn是跳出整个函数(这里直接跳出Retu这个函数,不往下执行),如果是跳出主函数,跳出了主函数就以为着程序结束了。

                else

                {

                    int i = Convert.ToInt32(s);

                    Console.WriteLine(i*2);

                }               

            }

}

注:1continue;这个的意思是说跳出本次循环,比如这里是执行100次,ifs=10continue;那么当执行到10的时候被跳过不执行然后接着执行11之后面的循环。而如果这里换成break时,当执行到10的时候直接跳出while循环,不执行11后面的语句(但能执行while外面的语句)。

2break,continue是用来终止循环的,而return是用来返回函数值的,在有return的函数里面,return后面的语句都不能被执行。

3)对于循环中又有循环,那么break怎么结束,continue又跳出的是哪个循环?答案就是与他跳出他最近的那个,就如同有多个if且只有一个else,那么else与那个匹配呢,当然是与他最近的那个了。

 

3.类型转换

将一种类型的值转换为大小相等或更大的另一种类型时,所发生的转换为扩大转换(隐式转换);

将一种类型的值转换为较小的另一种类型时,所发生的转换为缩小转换(显示转换)

每种类型都有MaxValueMinValue这两个属性值,用来查看类型的最大值和最小值。

Console.WriteLine("int的最大值{0},int的最小值{1}",int.MaxValue,int.MinValue);

Console.WriteLine("byte的最大值{0},byte的最小值{1}", byte.MaxValue, byte.MinValue);

1)隐式转换

 byte i = 3;

int j = i;// 小到大,系统自动将我的转换了,不告诉我们,所以叫隐式转换。

2)显示转换

byte i;

int z = 22;

i = (byte)z;// 从大到小,因为byte不能将int的值装下所以要显示转换(也叫强制转换),

如果这里z=288因为byte最大值不能超过255,这样的强制转换就会溢出,产生一个不可预知的错误。

注意:这种转换如果大数据类型的值(如z)在小数据类型所表示的范围(byte表示范围为-255+255)内则不会出现问题,如果大于如果大数据类型的值超出小数据类型所表示的范围(int范围可以达到20亿多,而byte最大值为255,如果将int型数据大于255强制转换为比他小的数据类型如byte型,那么byte型不能将他装下就会溢出,他所打印出来的值就是一个不可预知的值)

4.枚举和数组

1)用enum来定义一个枚举

enum Meiji{bao,wen,wei};//定义一个枚举类型,并且赋值;(和struck联想一下其实也没什么的)

                      //枚举和类这些类型的等级一样,所以不能定义在类里面,也不能定义在里面;                                                       

    class Program

    {

        static void Main(string[] args)

        {

            Meiji m = Meiji.bao;

            Meiji x = Meiji.wei;

            Meiji x1 = Meiji.wen;

//mxx1被用枚举类型Meiji来定义了,那么mxx1的值就只能等于Meiji里面所有的值,而不能等于其他值。

            Console.WriteLine(m + "" + x + "" + x1);// 不能写成这样(m+x+x1),枚举不能和+运算发在一起,字符串、数值可以,因为字符和int类型可以重新赋值,而枚举的值是固定的。            Console.WriteLine("{0}{1}{2}", m, x, x1);

             Console.ReadKey();

注:1)枚举的意义就在于限定了变量的取值范围;如果现在用枚举来类型在定义变量,那么被他所定义的变量只能是枚举里面的值,不能赋其他的值; 如:Meiji y=Meiji.tianxia;这是错误的,因为Meiji里面没有tianxia这个值,所以不能用来赋值给y

2)当我们知道某些变量的取值范围的时候,将他们“装在”枚举里面会为我们省去很多不必要的麻烦,比如定义的时候超出了我们所要定义的范围。

2

Enum能够也能定义类型:

enum typeName:int

    {

      var1=1,

      var2=2,

      var3=3

    }

    class Program

    {

        static void Main(string[] args)

        {

            typeName i=typeName.var1;

            int j = Convert.ToInt32(i);

            Console.WriteLine(i);

            Console.WriteLine(j);

            Console.ReadKey();

        }

    }

 

2)数组

c#中数组是对象,system名称空间的Array类是所有c#数组的基础,由于C#数组是对象,所以必须使用new操作符来实例化;在初次实例化数组时,也需要指明数组能容纳的子项数量(指定数组的长度或者说大小)。

方法1

string[] name = { "bao", "wen" };

int[] shuzu = {1,2,3,4};// C#的定义数组和cc++不一样,用的时候是一样的shuzu[0],c中定义是int shuzu[]={1,2,3};            Console.WriteLine("数组的长度为{0}",shuzu.Length);// Length查看数组的长度;

            for (int i = 0; i < shuzu.Length;i++ )

            {

                Console.WriteLine(shuzu[i]);

            }

方法2

string[] home = new string[3];

            home[0] = "bao";

            home[1] = "tian";

            home[2] = "wen";

            string s = "";//字符串必须先赋值,如果不确定就用“”表示空字符串;            Console.WriteLine(home[0] + home[1] + home[2]);// 将三个字符串相连,如果是枚举就不可以了。            for (int i = 0; i < home.Length - 1; i++)// for中的变量i出来这个for就不起作用了,在for中定义的变量只在for中起作用(这和cC++不一样cc++中是如果出了for只要在同一个函数中他都起作用);

            {

                s = s + home[i] + "|";

            }

            s = s + home[home.Length - 1];

            Console.WriteLine(s);

方法3

//string[] home;

//home[1]=”bao”; 不能就这样赋值,不同于cc++

string[] arr;//先定义后实例化;

            arr = new string[5];//必须实例化后才能为他赋值

            arr[0] = "bao";

            foreach (string ar in arr)

            {

                Console.WriteLine(ar);

            }

3foreach遍历数组

          string[] names = {"bao","wen","wei"};

            foreach (string name in names)

            {

                Console.WriteLine("我的名字叫{0}",name);

            }

注:1)如果int[] i=new int[2];没有为i数组赋值,那么他就默认为两个0i[0]=i[1]=0

2)如果string[] s=new string[2];没有为s数组赋值,那么他就默认为两个空字符串””(s[0]=s[1]=””)

3)如果Student[] st=new Student[2];没有为st对象数组赋值,那么他就默认为两个null.

对象中的null类似于int中的0(从意义上来说,在我们做判断一个数组是否为空时还是要根据类型来说话);

4)c#中一切皆对象,所以就算是数组也必须先实例化(通过new来实例化)后才能为他赋值;

4ArryList

首先,它的大小是随着它所包容的元素的多少而动态变化的

其次,在ArrayList中可以很方便地把一个元素插入到指定的位置,也可以很轻松地删除一个元素。

但是,为了能够提供这样大的灵活性,ArrayList的效率与数组相比就要差一些。

         (1) AddArrayList中增加元素。

         (2) Insert:在ArrayList的某个特定位置插入元素。

         (3) Remove删除ArrayList中的某个元素。

         (4) RemoveAt:删除ArrayList中的某个特定位置的元素。

         (5) IndexOf:返回ArrayList中某个元素的索引。

         (6) ReverseArrayList中的元素倒排。

         (7) Sort:将ArrayList中的元素排序。

原文地址:https://www.cnblogs.com/zuiyirenjian/p/2535313.html