特点:
1,纯粹的面向对象的语言。
2,严格区分大小写
3,强类型语言。
C# 跨平台
1,C#变量
规则:不能以数字,特殊符号开头的。
C#变量分为两种类型的变量
1,值类型
int,double,byte,float,eumn,struct,char,bool,long
这些值类型都有一个引用类型与之对应。
2,引用类型
string,类,数组,接口,delegate。
注意:默认情况下,c#中的整数类型是int,浮点类型是double类型。
byte:字节类型,只能表示0-255之间的整数。可以直接把整数类型赋值给byte类型。
那么,如果有n个byte类型的变量进行数学运算的时候,那么系统会把运算后的结果转换为int类型。
此时如果把这个结果再次的赋值给byte类型则需要强制类型转换。用convert方法或(int)来进行强制类型转化
如果是小类型的整数类型,在做数学运算的时候,都是把运算的结果转换为int类
float:单精度类型,小数点后面保留的小数位要小于double类型。
在定义float类型的时候,后面要加上f,以此说明是float类型。
float类型的变量进行数学运算的时候还是float类型。小类型数据相混运算的时候,先把小类型数据转化大类型数据,在做运算,运算的结果也是大类型。
总结:
小类型数据复制给大类型数据的时候,可以直接赋值除(byte),大类型数据赋值给小类型数据的时候,要进行强制类型转换(可能损失精度)
3,string类型
@:可以通过@符号把需要转移的字符都转移,但是如果要转义的字符是“"则,需要用两个"”代表一个,
\:也可以进行转义字符。
4,C#语法
if,while,for,switch
foreach(Type t in Collection)
{
//定义一个t变量到Collection集合中,把Collection中的元素,一个一个拿出来。
}
5,C#函数
(1)方法的定义
[访问修饰符] {static} 返回值类型 函数名 ([参数列表])
{
//方法体
}
public static void SayHello()
{
Console.WriteLine("hello");
}
返回值类型:
void:没有返回值,也是一个类型,这个类型代表的含义函数的返回值为空。
int,string,double。
所有的数据类型都可以作为函数的返回类型。
函数名:
命名规则不能使用关键字,不能以数字,特殊字符开头。函数==方法==功能。
特殊的方法:
作用:
1,封装代码块。代码的重用性。
2,一个函数就是一个整体,起到一个功能。只负责一件事。
(2)函数参数的类型
*1,值传递
void plus(int a,in b)
{
}
传递的是a和b变量中的值。
2,址传递
void TestRef(ref int a)
{
}
传递的是a这个变量的地址
3,out传递
传递的是a这个变量的地址,要求没有初值。
*4,params可变长变量
1,变量的类型是数组类型,在传递的时候,可以是数组,也可以是一些列元素。
2,一般情况下,params声明的参数在最后。
public static void TestParam(int a,params int[] b)
{
b[0];
/*
foreach(int c in b)
{
Console.WriteLine(c);
}
*/
}
此时他们的定义基本相同,也就是看他们()里边的值有无特殊标示,ref是址传递.就是把值个数所在的地址传递过去。
6,C#面向对象
类:把一些系列东西,把他们的共同的属性和方法抽象出来,给他起一个名字就是XXX类。
对象:凡是能够看得见摸得着的东西就是对象,说白了就是某个类里面的一个具体的东西(成员)。
类:静态----属性 ,动态---功能
*面向对象编程:在程序中,一切运行的基本单位是对象。
[访问修饰符] class 类名
{
//类体
}
在程序里面有且只能有一类包含Main方法,这个类称之为主类。 创建对象过程是:就是把类里面所有的东西赋值一份,放到对象的内存空间中。那么对象方式属性和方法是自己内存空间中的
属性和方法。
一个类可以创建n个对象,那么n个对象之间是没有任何的关系,唯一是他们产生于一个类。
类名 对象名 = new 类名();
一,属性
属性是对成员变量的一个封装,使得这个变量具有了读和写的权利。
一般情况下,成员变量是私有类型,只能在类的内部使用。如果在类的外面使用,则应该把成员变量封装成属性。
二,访问修饰符
public:共有的,在哪里都能够方法
private:私有的,只能在类的内部使用,也就是对象的内存空间中使用。
由private定义的变量和方法,对象不能够直接对其调用。但是可以通过间接来访问。
注意:
对象===成员===实例
成员的变量=实例的变量=对象的变量
三,成员方法
成员方法=成员函数=成员功能
[访问修饰符] 返回值 函数名(参数列表)
{
}
public void Say()
{}
如果访问修饰符不写时默认是private
他们创建的方法都是属于成员的也就是对象的。
三,构造函数
构造函数是用来创建对象的。就是把它里边的东西复制一份放到空的对象中。
构造函数是一个特殊的函数,没有返回值。
[访问修饰符] 类名(构造函数名)(参数列表)
{
}
构造函数名必须和类名一样。
构造函数除了用来创建对象之外,还起到以下作用:
1,初始化成员变量
2,对象的多元化
默认情况下,系统会为类提供一个空的构造函数:
public People(){}
一旦为类增加了构造函数,那么系统就不会为这个类添加一个默认的构造函数。
建议:无论在什么情况下,必须显示定义一个空的构造函数。
四,函数的重载
函数重载值指的是函数的方法名相同,但是参数的类型,个数,顺序不一样互为函数的重载。就是在同一个类里面,功能一样,但是处理的内容方式不一样时,就要对此进行重载。
五,this关键字
this指的就是当前对象。
使用this关键字可以使得参数变量名见名知意,其实也是对成员变量和参数之间的区别。
注意:this关键字是多态的。
六,static关键字
通过static关键字修饰方法,变量,属性都是属于类的。只能通过类来调用,不能通过对象来访问。
凡是static关键字修饰的方法,只能调用有static修饰的方法和变量。不能直接调用成员的变量和方法。
那么成员的方法可以直接的调用Static修饰的方法和变量。建议直接通过类名来访问Static修饰的变量和方法。
static修饰的变量和方法在内存中只创建一次。直到程序退出,才会消失。
注意:是谁的谁调用。
七,新特性
1,属性
可以直接写属性,而不需要成员变量,get和set也不需要实现。
public string Name()
{
get;set;
}其实系统会默认的把它转换成以前的形式。
3,创建对象
在创建对象的时候,可以直接给属性赋值。
Animal a = new Animal(){Name="",Age=9};
4,通过var关键字来标示任何类型的变量,但不是说就是弱类型语言。它和javaScript中的var是不一样的。它本身就是一个强类型的语言。
var s = "sss";
var p = new People();
但是,Var定义的变量是私有的,只能够在方法里面使用。
5,匿名对象
可以通过new关键字来创建一个匿名对象,它没有类型。属性可以随意定义。注意,匿名对象只能通过Var关键字
定义的变量来接受。
八,C#继承
父类=基类=超类=base class
子类=sub类=派生类
继承是用来扩展自身的功能。就是把父类里的东西复制一份给子类。可以直接调用子类里的方法。
通过关键字“:”来实现继承。
1,继承中的构造函数
默认情况下,子类中的构造函数调用的是父类的空的构造函数。
如果父类中没有空的构造函数,子类就去调用父类中的其中一个构造函数。
2,base关键
base指得是父类对象。
1,如果base放在子类构造函数后,则base调用的是父类的构造函数。
2,如果base在普通方法中,则指的是创建的父类对象,可以调用父类对象中的方法和属性。
3,方法的重写
由于父类的方法不能够完成某种功能,但是还必须得调用这个方法,则子类可以重写这个方法,加强其功能。
在父类里面,如果一个函数可以让子类重写,必须在方法的返回类型前面用vritual关键来修饰。说明这个方法可以被
子类重写。
如果在子类里面,要重写父类的方法,则应在方法返回类型前面加上override关键字,说明这个方法是重写父类的。
注意:重写方法的要求是
1,必须有继承
2,重写的方法和被重写的方法必须一模一样。
4,多态
一个事物可以同时具有多种角色,但是在某一种特殊的场合只表现出一中。这就要因环境而改变了。
1,上转型
把子类对象赋值给父类对象,称之为上转型。
原理:实际上是把子类对象中的父类对象赋值了父类,此时的赋值语句两边的类型是相同的。
此时,这个父类对象能够调用的方法是:自己的方法和已经重写过的方法,如果方法没有被子类重写,那么调用的
还是自己的方法。
WuDang w = new People();
w.sing();//已经重写的方法。
w.print();//print没有重写的方法
用途:方便同一标准,根据具体实现不同,而调用不同的方法,从而实现不同的功能和样式。
2,下转型
把已经上转型的父类对象赋值给子类对象。
原理:就是把已经上转型后的父类对象所对应的原来的子类对象在赋值给子类对象。
此时,这个对象能够调用的方法是自身的方法,继承来得方法和已经重写过得方法。
注意,下转型需要通过显示的类型转换。
People pp = (People) w;
3,注意
C#中只支持单继承,一个类只能有一个直接的父类。
5,抽象类
[访问修饰符] abstract class 类名
{
//拥有了普通类出构造函数外的任何东西
//还可以有抽象函数
}
6,sealed关键字
1,如果sealed修饰的是类,则这个类是无法被继承,不能当父类,但是可以继承其他的类。
2,如果sealed修饰方法,则子类是不能重写这个方法的。
把方法或类进行密封。
7,interface
为了解决多继承的问题而诞生的一种特殊的“类”。
pubilc interface 接口名
{
}
接口里面只能写方法的定义和属性的定义。
在接口中的方法定义前面不能含有public
子类在实现接口的方法时,不能使用override关键字。
注意:
如果一个类同时要继承类也要实现接口,那么父类要写在前面,接口在后。
8,protected
由protected关键字修饰的变量和方法只能在本类和子类中去使用,不能通过对象来访问。他是受保护的。
9,namespace
命名空间,是为了解决重名的问题,方便管理类。
namespace 名字
{
//只能够放,类,接口,枚举,结构体,委托
//不能有方法,变量的。
}
命名空间可以嵌套。
命名空间于物理路径没有关系,只和逻辑上有关系。
10,enum
枚举:把有限的元素放在一起。使用字母代替数字标示的含义。枚举是一个值类型。
public enum 枚举名
{
枚举元素,...,枚举元素
}
1 public enum Seasons 2 { 3 spring,summer,autumn=6,winter 4 } 5 public class studyEnum 6 { 7 public static void Main() 8 { 9 Seasons s = Seasons.spring; 10 Console.WriteLine(s); 11 Seasons a = Seasons.summer; 12 Console.WriteLine((int)a); //这是把Seasons转换成Int类型 13 Seasons b = Seasons.autumn; 14 Console.WriteLine((int)b); 15 Seasons c = Seasons.winter; 16 Console.WriteLine((int)c); 17 } 18 }
默认情况下,枚举元素的类型是int类型.并且从0开始,每次递加1。
如果有一个枚举元素有初值,那么后续的元素以此元素为基础递加1
?如何编译cs文件:
打开VS编译工具,通过cd+空格+文件路径,切换到指定编译地方。通过命令csc+空格+文件名.cs来编译,编译后可以直接运行生成的.exe文件。也可以在VS命令工具中键入文件名来查看运行结果。