C#基础知识延伸

来源:互联网 发布:统赢编程说明书 编辑:程序博客网 时间:2024/06/18 03:56

 

 1.C#知识点延深

 

 

1.断点调试工具,可以通过快捷键f9或者在行首点击添加上断点

2.断点调试一般分成逐语句和逐过程两种调试,区别在于一个会执行函数内部方法,一个会直接跳过函数

3.异常处理常使用trycatch,finally方式,try中放的是可能出错的语句,catch的话则会捕捉和自己定义类型相同

 的异常,finally则是无论怎样都会执行的语句,我们加入异常处理,使得程序变得健壮,这样也防止出现错误.

4.我们自己定义的类声明变量时,通常需要将该类进行初始化,而初始化的方法就是 new+函数名();

5.同一个项目下,类的调用可以直接声明,如调用play下的run()方法,在主函数中Playplay=new Play() ,play.run()即可

6.编程习惯上,我们习惯把类内部的字段都设置为private的,即变量只能在类的内部进行访问

7.方法内部,同名参数我们优先访问最近的,而我们通常使用this.表示访问的是类的字段和方法.

8.当我们没有定义构造函数时候,系统一般会默认给我们一个无参的和类同名的构造函数,但是当我们自己定义了一个或者多个构造函数时,它就不会自动生成了

9.构造函数一般用于属性的初始化,这样避免了后续设置属性的麻烦.

10.类的调用必须放在同一个命名空间下

11.构造函数中定义的形参要想使用必须先用this.进行访问,这样才能成功调用形参内定义的变量

12.当我们给字段中的属性设置值的时候,我们会使用set方法,当我们取得值的时候,我们调用的是get方法

13.set,get方法作用有很多,比如1set可以在获取值之前对值进行校验.

14 setget的简写手段,例如public string Name{get;set},编译器会自动给我们生成一个get,set方法,设置和返回值

15.匿名类型并不是不给类型,比如你var j=89;这个j就被定义成了int类型,你字符串就不能赋值给它了

16.内存空间有两种,堆和栈,堆的空间大但是运行速度慢,栈的空间小但是运行速度快.

17.栈是先将数据压入栈底,读取时再从栈顶挨个释放,一般存放的是数值型的数据,如int类型,char类型,bool类型

18.堆里面存放的是引用类型,然后给栈一个内存地址,当释放数据时候,先把栈内数据全部情况,然后gc垃圾回收处理器检测到堆中数据没人引用,再释放堆内数据

19.内存地址的赋值,其实是引用的转换,假设v1.x=300,v2.x=200,当你将v1的值赋给v2时,v2原先存储的内存空间就不和内存地址有连接,v1的内存空间会有两个连接

因此再次进行访问的时候,v2原先的内存空间就会被释放,因此,无论我们改v2的值还是v1的值,都会影响v1所在的内存空间,这样当我们修改v2.x的时候,v1.x也会发生变化

20.实现继承和封装继承,实现继承表示当一个类继承另一个类的所有成员和变量,当多个类需要实现某个类中的重要共有方法时,这种继承非常实用,除此之外还要接口继承,这种

继承一般只继承函数签名而不继承任何代码,而继承一般时继承公有类型

21.父类声明的对象可以用子类去构造,而反之不成立,但是引用时还是要用强制类型转换将父类的类型转换成子类的类型

22.当我们给父类里的一个方法用virtual修饰将其定义为虚方法,这样我们就可以在子类中进行调用,用override对它进行重写,当我们调用时,优先调用子类内部重写的方法

23.当我们在子类里重写了虚函数的方法时,我们在任何里都是调用子类里重写的方法,当然前天时我们用子类去构造父类里的方法才会这样

24.this.的作用是表示声明了某个字段,属性或者方法,这样的作用是当访问重名字段时,this可以表示是访问类中的字段,base.的作用则是访问父类中的方法和字段当然不添加base也行,但是用base修饰后ide会很快给出父类中的各种方法方便选择,

25.关于抽象类的实现,这里补充可以用抽象类去声明对象,但是不可以构造

1。定义一个抽象类Bird

namespace ConsoleApplication5

{

  abstractclassBird

   {

       privatefloat speed = 100;

       publicabstractvoid Fly();//定义了一个抽象类,飞行

   }

   

}

2.新建一个乌鸦类,重写鸟类的方法,继承鸟的抽象类

namespace ConsoleApplication5

{

   classCrow:Bird

   {

       publicoverridevoid Fly()

       {

           Console.WriteLine("乌鸦在飞翔");       

}

   }

}

3Program里将它实现调用,输出乌鸦在飞翔

classProgram

   {

       staticvoid Main(string[] args)

       {

           Crow crow =newCrow();

           crow.Fly();

           Console.ReadKey();

       }

   }

}

26.密封方法

1.

      namespace _010_密封方法

{

   classBaseClass

   {

       publicvirtualvoid Move()

       {

           Console.WriteLine("这是一个虚拟方法方法");     

       }

   }

}

2.

namespace _010_密封方法

{

   classDrivedClass:BaseClass

   {

       publicsealedoverridevoid Move()//我们可以将重写的方法进行密封,表示该方法不能被重写

       {

           base.Move();

       }

   }

}

27.派生类

1.我们先定义一个基类,并且给他定义一个构造函数

namespace派生类

{

   classBaseClass

   {

       public BaseClass()

       {

 

           Console.WriteLine("这里是父类的构造方法");

 

       }

   }

}

2

namespace派生类

{

   classDerivedClass:BaseClass

   {

       public DerivedClass() :base()//调用父类中的无参构造函数

       {

           Console.WriteLine("这里是子类的方法");

 

       }

   }

}

3.在主程序中运行

这里会先调用父类构造函数,再调用子类构造函数

namespace派生类

{

   classProgram

   {

       staticvoid Main(string[] args)

       {

           DerivedClass o1 =newDerivedClass();

           Console.ReadKey();

       }

   }

}

上面的是无参的,现在介绍有参的

1.    在父类初始化x的值

     privateint x;

       public BaseClass(int x){

           //对字段进行初始化

           this.x = x;

           Console.WriteLine("x被赋值");

           }

}

2.这里表示调用父类的构造函数,并且给y赋值

  privateint y;

 

       public DerivedClass(int x,int y) :base(x)

       {

 

           this.y = y;

           Console.WriteLine("y被赋值");

 

       }

   }

在主函数中调用

classProgram

   {

       staticvoid Main(string[] args)

       {

           

           DerivedClass o2 =newDerivedClass(1, 2);

           Console.ReadKey();

       }

   }

这就算结果,和无参一样也是先父类后子类

28.修饰符

public修饰的可以在别的项目中调用,private修饰的只能在自身内部调用

class两种写法,public classclass,一个可以在别的项目中调用,一个不行

如果没有继承的话,privateprotect的作用是一样的,但是有派生类的话,派生类可以调用父类protect修饰的字段,使用static修饰的字段,只能通过类名去访问

29.接口的实现和定义

接口中不允许提供任何任何成员的实现方法,一般来说接口只包含方法,属性,索引器,事件的声明

1.定义一个IA

 interfaceIA

   {

       void Method1();

   }

2.定义一个IB继承IA,这样IB中就有两个方法

namespace创建和实现接口

{

   interfaceIB:IA

   {

       void Method2();

   }

}

3.要想实现接口多重继承,要在里面给出向对应的方法体

namespace创建和实现接口

{

   classBird:IFly,IB

   {

       publicvoid Fly()

       {

 

           Console.WriteLine("小鸟在飞翔");

       }

 

       publicvoid Method1()

       {

           

       }

 

       publicvoid Method2()

       {

           

       }

   }

namespace创建和实现接口

{

   interfaceIFly

   {

       void Fly();

   }

}

原创粉丝点击