C#
一.如何编译cs文件:
打开VS编译工具,通过cd+空格+文件路径,切换到指定编译地方。通过命令csc+空格+文件名.cs来编译,编译后可以直接运行生成的.exe文件。也可以在VS命令工具中键入文件名来查看运行结果。
二.C#变量:
1.值类型:int,double,byte,float,enum,struct,char,bool.值类型都有一个引用类型与之相对应。
2.引用类型:string,数组,类,接口,delegate.
三.类型转换:
1.把小类型的数据赋值给大类型数据时候,系统自动进行隐式转换。反之则需要进行显式转换
1强制转换:类型A a = (类型A) b;
一般用于值类型与值类型间的转换或者引用类型间的转换。
2通过Convert.ToType()进行转换;
值类型与引用类型间的相互转换最好使用Convert转换。
四.string类型的字符拼接:
通过@来全部转义,也可以通过斜杠"\"来转义
1 public static void Main() 2 { 3 //{"name":"小强","age":22,"book":"钢铁是怎样炼成的"} 4 Console.WriteLine(@"{""name"":""小强"",""age"":22,""book"":""钢铁是怎样炼成的""}"); 5 string name = "小强"; 6 int age = 22; 7 Console.WriteLine(@"{""name"":"""+name+@""",""age"":"+age+@",""book"":""钢铁是怎样炼成的""}"); 8 // insert into emp values(1001,'小强',34,89); 9 // deletefrom emp where sid = var; 10 int sid = 1001; 11 Console.WriteLine("insert into emp values(1001,'小强',34,89)"); 12 Console.WriteLine(@"deletefrom emp where sid = "+sid+""); 13 }
五.数组的定义
1.Type[] 数组名 = new Type[size];
2.Type[] 数组名 = {元素,……,元素};
3.Type[] 数组名 = new Type[]{元素,……,元素};
new操作符是在内存中开辟一段连续的空间。获取数组长度:数组名.Length。
六.C#函数
[访问修饰符] [static] 返回值 函数名([参数列表])
{
//方法体
}
函数即方法即功能
1.函数作用:1封装代码块,提高代码重用性2一个函数就是一个方法,实现一个功能。
2.函数参数的传递:
1.值传递(传递a,b变量中的值)
public static void Main() { int b = 7; Console.WriteLine(b); } public static void TestRef(int a) { a = 9; }
2.址传递(传递的时变量的地址)
public static void Main() { int b = 7; TestRef(ref b); Console.WriteLine(b); } public static void TestRef(ref int a) { a = 9; }
3.out传递(址传递,要求变量没有初值)
public static void Main() { int b; TestOut(out b); Console.WriteLine(b); } public static void TestOut(out int a) { a = 24; }
4.param可变长变量
1 public static void Main() 2 { 3 TestParams("1",2,3,4); 4 } 5 public static void TestParams(string a,params int[]a) 6 { 7 foreach(int i in a) 8 { 9 Console.WriteLine(i); 10 } 11 }
注意:params变量类型是数组类型,在传递的时候可以传入一系列元素。一般情况可变长的params变量放到参数类表的最后面。
七.C#面向对象
1.类:具有公共属性和方法的抽象和封装。
[访问修饰符] class 类名
{
//类体;
}
类包含:成员变量、成员属性、成员方法。
变量:成员变量一般是Private类型,在类外部使用通常需要把变量封装成属性。
属性:对成员的变量进行的封装,使它具有读写权利。
方法:成员变量即为成员函数亦等于成员功能
[访问修饰符] 返回值 函数名([参数列表])
{
}
2.对象:类实例化的具体成员。在程序中一切运行的基本单位都为对象。
创建对象的过程就是把类中所有变量、属性、方法复制一份赋给对象的内存空间。
对象即为成员即为实例
3.构造函数:
构造函数是用来创造函数的,能开辟出一个内存空间,放在堆里面。创造的对象指向堆的内存空间。构造函数没有返回值。
[访问修饰符] 类名(构造函数名)
{
}
构造函数名必须和类名一样。
作用:1创建对象2初始化成员变量3实现对象的多元化
默认情况下,系统会为类提供一个空的构造函数。自己增写构造函数后,默认的构造函数消失。
4.函数的重载:
具有相同方法名,但是参数类型、顺序、个数不同的函数互为重载。互为重载的函数必须位于一个类里面。
5.this关键字:
this关键字指得是当前对象。使用this关键字可以区别成员变量和参数,起到明确使用对象的作用。
6.static关键字:
通过static关键字修饰的方法、变量、属性是属于类的,不能通过对象来访问。(是谁的谁调用)。但是成员的方法可以直接调用static修饰的方法和变量,建议用类调用static修饰的方法和变量。static创建的变量和方法直至程序退出,内存空间才会释放。
1 public class StudyStatic 2 { 3 public static void Main() 4 { 5 People.sing(); 6 } 7 } 8 public class People 9 { 10 public static string name = "人类"; 11 public static void sing() 12 { 13 Console.WriteLine("这是类的方法"); 14 People p = new People(); 15 p.Test(); 16 } 17 public void Test() 18 { 19 Console.WriteLine("这是成员方法"); 20 } 21 }
7.readonly关键字:
由readonly修饰的关键字不能再赋值:public static readonly string name = "小强";
8.新特性:
1.属性
可以直接写属性,不需要定义成员变量,也不需要具体实现get set 方法
1 public class StudyNewProperty 2 { 3 public static void Main() 4 { 5 People p = new People(); 6 p.Name = "小强"; 7 p.Age = 1; 8 p.Print(); 9 } 10 } 11 public class People 12 { 13 public string Name 14 { 15 get;set; 16 } 17 public int Age 18 { 19 get;set; 20 } 21 public void Print() 22 { 23 Console.WriteLine(Name + "今年" + Age + "岁了。"); 24 } 25 }
2.创建对象:
可以直接给属性赋值,属性之间用逗号隔开。
1 public class StudyNewProperty 2 { 3 public static void Main() 4 { 5 People p = new People(){Name = "小强",Age = 1}; 6 p.Print(); 7 } 8 } 9 public class People 10 { 11 public string Name 12 { 13 get;set; 14 } 15 public int Age 16 { 17 get;set; 18 } 19 public void Print() 20 { 21 Console.WriteLine(Name + "今年" + Age + "岁了。"); 22 } 23 }
3.var关键字和匿名对象
可以通过var关键字标识任何类型的变量。
通过new关键字来创建匿名对象,这个对象没有类型,属性可以随意定义,只能通过var关键字定义的变量来接收对象。
1 public class StudyNewProperty 2 { 3 public static void Main() 4 { 5 var p = new People(){Name = "小强",Age = 1}; 6 p.Print(); 7 //匿名对象 8 var a = new{forcolor = "yellow",leg = 4}; 9 Console.WriteLine(a.leg); 10 } 11 } 12 public class People 13 { 14 public string Name 15 { 16 get;set; 17 } 18 public int Age 19 { 20 get;set; 21 } 22 public void Print() 23 { 24 Console.WriteLine(Name + "今年" + Age + "岁了。"); 25 } 26 }
八.继承:
继承是用来扩展自身功能,通过":"来实现继承。
c#中只支持单继承,即一个类只能有一个直接父类。
父类=基类=超类
子类=sub类=派生类
1继承中的构造函数:
默认情况,子类中的构造函数调用的是父类默认的空的构造函数。
父类中自定义了构造函数,则子类中必须显式的调用父类中任意一个构造函数(:base())
1 public class StudyExtend 2 { 3 public static void Main() 4 { 5 People p = new People("小强"); 6 } 7 } 8 public class WuDang 9 { 10 private string name; 11 public WuDang() 12 { 13 Console.WriteLine("i'm first"); 14 } 15 public WuDang(string str) 16 { 17 Console.WriteLine("i'm first"); 18 } 19 public WuDang(string str,int i) 20 { 21 Console.WriteLine("i'm first"); 22 } 23 public WuDang(int i ) 24 { 25 Console.WriteLine("i'm first"); 26 } 27 public string Name 28 { 29 get{return this.name;} 30 set{this.name = value;} 31 } 32 public void Taiji() 33 { 34 } 35 } 36 public class People : WuDang 37 { 38 public People(string name) :base("aaa") 39 { 40 Console.WriteLine("I'm second"); 41 } 42 }
2方法的重写:
当父类方法不能实现某功能,但却调用了此方法,则可以通过子类方法的重写,完善其功能。
父类被重写的方法前面加上virtual关键字修饰。重写的子类方法前面加上override关键字。
重写要求存在继承关系,而且重写的方法与被重写方法类型一致。
3多态
不同环境下充当不同的角色
1上转型:子类对象赋值给父类对象;此时父类对象调用的是自己的属性、方法、变量或者是子类重写过的方法。
用途:指定标准。根据具体实现不同,调用不同的方法,继而实现不同功能和样式。
1 public class StudyExtend 2 { 3 public static void Main() 4 { 5 //上转型 6 WuDang w = new People(); 7 w.sing(); 8 } 9 } 10 public class WuDang 11 { 12 public virtual void sing() 13 { 14 Console.WriteLine("father"); 15 } 16 } 17 public class People : WuDang 18 { 19 public override void sing() 20 { 21 Console.WriteLine("son"); 22 } 23 }
2下转型:把已经上转型的父类对象赋值给子类对象(需要强制转换)例如:People p =(People) w;
1 public class StudyExtend 2 { 3 public static void Main() 4 { 5 //上转型 6 WuDang w = new People(); 7 w.sing(); 8 //下转型 9 People p =(People) w; 10 p.Test(); 11 } 12 } 13 public class WuDang 14 { 15 public virtual void sing() 16 { 17 Console.WriteLine("father"); 18 } 19 public virtual void Print() 20 { 21 Console.WriteLine("fffff"); 22 } 23 } 24 public class People : WuDang 25 { 26 public override void sing() 27 { 28 Console.WriteLine("son"); 29 } 30 public void Test() 31 { 32 Console.WriteLine("sssss"); 33 } 34 }
4抽象类:
[访问修饰符] abstract class 抽象类名
{
//不能有构造函数
//可以定义像普通类一样的变量、属性、方法
//可以有抽象函数
}
1 public class StudyAbstract 2 { 3 public static void Main() 4 { 5 God.Say(); 6 YeSu y = new YeSu(); 7 y.sing(); 8 //抽象方法的调用 9 y.Fun(); 10 //可以把子类的对象给抽象类变量,从而实现抽象方法调用。 11 God g = new YeSu(); 12 g.Fun(); 13 } 14 } 15 public abstract class God 16 { 17 //类方法可以由抽象类直接调用 18 public static void Say() 19 { 20 Console.WriteLine("Hello"); 21 } 22 //抽象类没有构造函数,即不能通过new关键字创建对象, 23 //无法直接调用成员方法。可以通过继承抽象类,实现 24 //方法的调用。 25 public void sing() 26 { 27 Console.WriteLine("哈利路亚"); 28 } 29 //----------------抽象方法-----------------------// 30 //抽象方法没有只有方法的定义,没有实现。 31 public abstract void Fun(); 32 public abstract void Fun1(); 33 public abstract void Fun2(); 34 } 35 //继承抽象类的子类必须实现抽象类中的全部抽象方法 36 public class YeSu : God 37 { 38 public override void Fun() 39 { 40 Console.WriteLine("fly"); 41 } 42 public override void Fun1() 43 { 44 } 45 public override void Fun2() 46 { 47 } 48 }
5 sealed关键字
1如果sealed修饰类,这类不能被继承(绝育类) pblic sealecd class(){}
2如果sealed修饰方法,则方法不能被重写 public sealed void sing(){}
6 interface
为解决多继承问题而产生的特殊"类"。
public interface 接口名
{
//只能写方法的定义和属性的定义(不能在接口里去实现方法或属性)
}
接口定义方法前面不能家public等修饰符
在实现接口的时候不能在方法前加override关键字
要继承类也要实现接口时候,必须把父类写前面,接口写在后面,中间都好隔开
1 public class StudyInterface 2 { 3 public static void Main() 4 { 5 //上转型 6 UStorage u = new UStorage(); 7 Phone p = new Phone(); 8 KnowUSB(u); 9 KnowUSB(p); 10 } 11 public static void KnowUSB(IUSB usb) 12 { 13 usb.know(); 14 } 15 } 16 public class A 17 { 18 } 19 public interface IUSB 20 { 21 //只能编写方法或属性的定义,不能在接口中实现 22 void know(); 23 } 24 public class UStorage : A,IUSB 25 { 26 public void know() 27 { 28 Console.WriteLine("识别U盘"); 29 } 30 } 31 public class Phone : IUSB 32 { 33 public void know() 34 { 35 Console.WriteLine("识别手机"); 36 } 37 }