C#基本语法(一)

一、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}",其中的数字0,1,2,顺序不能改变,我们要输出三个参数,也只能按顺序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(参数);将false,true字符串转换为布尔型(既有判断性质,而不是一个简单的字符串)

7)两个字符串相连

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

如:string x=”abc”;

string y=def”

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

2.循环的中断

1)continue结束本次循环;

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++;

            }

2)break跳出循环,如果循环语句遇到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();

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

static void Retu()
{
  while (true)
            { 
                string s=Console.ReadLine();
                if (s == "q")
                    return;// 这个程序中while看上去是个死循环,但是在if这里用了return,return是跳出整个函数(这里直接跳出Retu这个函数,不往下执行),如果是跳出主函数,跳出了主函数就以为着程序结束了。
                else
                {
                    int i = Convert.ToInt32(s);
                    Console.WriteLine(i*2);
                }                
            }
}

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

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

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

3.类型转换

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

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

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

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;
//m、x、x1被用枚举类型Meiji来定义了,那么m、x、x1的值就只能等于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#的定义数组和c,c++不一样,用的时候是一样的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中起作用(这和c,C++不一样c,c++中是如果出了for只要在同一个函数中他都起作用);
            {
                s = s + home[i] + "|";
            }
            s = s + home[home.Length - 1];
            Console.WriteLine(s);
方法3:
//string[] home;
//home[1]=”bao”; 不能就这样赋值,不同于c,c++;
string[] arr;//先定义后实例化;
            arr = new string[5];//必须实例化后才能为他赋值
            arr[0] = "bao";
            foreach (string ar in arr)
            {
                Console.WriteLine(ar);
            }
3)foreach遍历数组
           string[] names = {"bao","wen","wei"};
            foreach (string name in names)
            {
                Console.WriteLine("我的名字叫{0}",name);
            }

注:1)如果int[] i=new int[2];没有为i数组赋值,那么他就默认为两个0(i[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来实例化)后才能为他赋值;

4)ArryList

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

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

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

•         (1) Add向ArrayList中增加元素。

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

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

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

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

•         (6) Reverse将ArrayList中的元素倒排。

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

原创文章,作者:27149,如若转载,请注明出处:http://wpbbw.com/34.html

发表评论

登录后才能评论