C#基础三次学习

1.对一个程序来说,静态指编辑期、编译期,动态指运行期。 
静态时装在硬盘里,动态时装在内存里。

2.反射示例 

通过反射获得类的属性和方法。

static void Main(string[] args)
{
    Type myType = typeof(Form);
    Console.WriteLine(myType.BaseType.FullName + Environment.NewLine + myType.FullName);
    var pInfos = myType.GetProperties();
    foreach (var p in pInfos)
    {
        Console.WriteLine(p.Name);
    }
    var mInfos = myType.GetMethods();
    foreach (var m in mInfos)
    {
        Console.WriteLine(m.Name);
    }
}

3.Stack Overflow 栈的溢出

3.1.函数调用过多(算法错误) 下面的不良递归

public void BadMethod()
{

int x=100;
BadMethod();

}

3.2.栈上分配了过多的内存  unsafe为不安全的代码 

 unsafe
{
int *p=stackalloc int [9999999];
}

4.C#语言类型系统

  1. C# 类型分为引用类型和值类型

  1. 引用类型包括类、接口、委托,值类型包括结构体和枚举

  1. 所有类型都以 Object 为自己的基类型

5.方法永远都是类的成员

C# namespace中不能有方法。

6.构造器

构造函数译为构造器,成员函数译为方法,本质都是函数。

 以上的方法也可以初始化,但是成员变量需要公有。

初始化构造器一般选择构造方法实现。

7.重载

方法签名:方法名称 + 类型形参的个数 + 每个形参(从左往右)的类型和种类(值、引用或输出)。方法签名不包含返回类型。

重载:方法名相同,参数个数、次序、类型不同。 

重载对返回值没有要求。

如果参数的个数、类型、次序都相同,方法名也相同,仅返回值不同,则无法构成重载。

 哪怕次序不同都是重载。与返回类型无关。

8.字段和属性

字段就是与对象或类型相关联的变量。

属性是用于访问对象或类型的特征的成员,是字段的自然扩展。

建议:永远使用属性(而不是字段)来暴露数据,即字段永远是 private 或 protected 的。 
字段只在类内部使用,类之间交换数据,永远只用属性。

9.委托与事件

委托是类,声明的位置和class同一个级别。委托却和一般类的声明不同,是为了照顾可读性和C/C++传统。

委托的一般使用:把方法当做参数传给另一个方法。

事件和委托的关系类似于字段和属性,事件是委托的包装器。

我:委托的使用层次还是比较高的,以后真的需要用的时候还是需要好好的研究。

10.多态和重写

多态是基于重写的

1.继承:向子类中添加父类没有的成员,子类对父类的横向扩展

2.重写:纵向扩展,成员没有增加,但成员的版本增加了

Override重写

子类对父类成员的重写。

只有对子类可见的父类成员可以重写,具体说就是 protected 和 public。例如子类能继承父类 private 的成员,但无法访问,即不可见、不可重写。

重写需要父类成员标记为 virtual,子类成员标记 override

Hide (此情况了解即可,原则不会用到Hide)

如果子类和父类中函数成员签名相同,但又没标记 virtual 和 override,称为 hide 隐藏

class Program
{
    static void Main(string[] args)
    {
        Vehicle v = new Car();
        v.Run();
    }
}

class Vehicle
{
    public void Run()
    {
        Console.WriteLine("I'm running!");
    }
}

class Car : Vehicle
{
    public void Run()
    {
        Console.WriteLine("Car is running!");
    }
}

这会导致 Car 类里面有两个 Run 方法,一个是从 Vehicle 继承的 base.Run(),一个是自己声明的 this.Run()。

可以理解为 v 作为 Vehicle 类型,它本来应该顺着继承链往下(一直到 Car)找 Run 的具体实现,但由于 Car 没有 Override,所以它找不下去,只能调用 Vehicle 里面的 Run。

11.抽象类与开闭原则

猜你喜欢

转载自www.cnblogs.com/cdjbolg/p/11962913.html
今日推荐