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"; //用@来将反斜杠转义,在要输出的字符串前面加上(@)说明字符串里面的反斜杠不是用来做转义用的,而是我们想要输出的。
注:@只能对反斜杠起作用对其他的符号不起作用。
5)Console.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=“
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
{
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
{
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中的元素排序。