您的位置:首页 > 编程语言 > C#

C#基础知识延伸

2017-07-09 17:21 295 查看
 
 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 set和get的简写手段,例如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
{
  
abstract
class
Bird
   
{
       
private
float speed = 100;
       
public
abstract
void Fly();//定义了一个抽象类,飞行
   
}
   

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

namespace
ConsoleApplication5
{
   
class
Crow:Bird
   
{
       
public
override
void Fly()
       
{
           
Console.WriteLine("乌鸦在飞翔");       

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

class
Program
   
{
       
static
void Main(string[]
args)
       
{
           
Crow crow =
new
Crow();
           
crow.Fly();
           
Console.ReadKey();
       
}
   
}
}
26.密封方法
1.
      
namespace _010_密封方法
{
   
class
BaseClass
   
{
       
public
virtual
void Move()
       
{
           
Console.WriteLine("这是一个虚拟方法方法");     

       
}
   
}
}
2.
namespace
_010_密封方法
{
   
class
DrivedClass:BaseClass
   
{
       
public
sealed
override
void Move()//我们可以将重写的方法进行密封,表示该方法不能被重写
       
{
           
base.Move();
       
}
   
}
}
27.派生类
1.我们先定义一个基类,并且给他定义一个构造函数
namespace
派生类
{
   
class
BaseClass
   
{
       
public BaseClass()
       
{
 
           
Console.WriteLine("这里是父类的构造方法");
 
       
}
   
}
}
2
namespace
派生类
{
   
class
DerivedClass:BaseClass
   
{
       
public DerivedClass() :
base()//调用父类中的无参构造函数
       
{
           
Console.WriteLine("这里是子类的方法");
 
       
}
   
}
}
3.在主程序中运行
这里会先调用父类构造函数,再调用子类构造函数
namespace
派生类
{
   
class
Program
   
{
       
static
void Main(string[]
args)
       
{
           
DerivedClass o1 =
new
DerivedClass();
           
Console.ReadKey();
       
}
   
}
}

上面的是无参的,现在介绍有参的
1.    在父类初始化x的值
    
 private
int x;
       
public BaseClass(int
x){
           
//对字段进行初始化
           
this.x = x;
           
Console.WriteLine("x被赋值");
           
}
}
2.这里表示调用父类的构造函数,并且给y赋值
  
private
int y;
 
       
public DerivedClass(int
x,int y) :
base(x)
       
{
 
           
this.y = y;
           
Console.WriteLine("y被赋值");
 
       
}
   
}
在主函数中调用
class
Program
   
{
       
static
void Main(string[]
args)
       
{
           

           
DerivedClass o2 =
new
DerivedClass(1, 2);
           
Console.ReadKey();
       
}
   
}
这就算结果,和无参一样也是先父类后子类

28.修饰符
用public修饰的可以在别的项目中调用,private修饰的只能在自身内部调用
class两种写法,public class和class,一个可以在别的项目中调用,一个不行
如果没有继承的话,private和protect的作用是一样的,但是有派生类的话,派生类可以调用父类protect修饰的字段,使用static修饰的字段,只能通过类名去访问
29.接口的实现和定义
接口中不允许提供任何任何成员的实现方法,一般来说接口只包含方法,属性,索引器,事件的声明
1.定义一个IA
 
interface
IA
   
{
       
void Method1();
   
}
2.定义一个IB继承IA,这样IB中就有两个方法
namespace
创建和实现接口
{
   
interface
IB:IA
   
{
       
void Method2();
   
}
}
3.要想实现接口多重继承,要在里面给出向对应的方法体
namespace
创建和实现接口
{
   
class
Bird:IFly,IB
   
{
       
public
void Fly()
       
{
 
           
Console.WriteLine("小鸟在飞翔");
       
}
 
       
public
void Method1()
       
{
           

       
}
 
       
public
void Method2()
       
{
           

       
}
   
}
namespace
创建和实现接口
{
   
interface
IFly
   
{
       
void Fly();
   
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: