C#笔记3

来源:互联网 发布:单相变压器实验数据 编辑:程序博客网 时间:2024/05/19 00:11


结构 struct关键字,级别与类保持一致,写在命名空空间下

结构中的字段不能赋初始值

结构中不能包含显示无参数构造函数
在结构函数中必须要为结构体的所有字段赋值
在构造函数中为属性赋值不认为是对字段赋值因为属性不一定是去操作字段。
结构是1个值类型的。在传递结构变量的时候会将结构对象里的每一个字段复制1份然后拷贝到新的结构变量的字段中
不能定义自动属性,因为自动属性会生成一个字段,而这个字段必须要求在构造函数中但是我们又不知道这个字段叫声明名字
声明结构体对象可以不new关键字,但是这个时候结构体对象的字段没有初始值,因为没有调用构造函数,而构造函数中必须为字段赋值所以通过new关键字创建结构体对象这个对象的字段就有默认值了
结构用法:
1、栈的访问速度快,但是空间小
2、堆的访问速度慢,但是空间大
3、当我们要表示1个轻量级的对象的时候,就可以定义结构,以提高速度。
4、根据传值的影响来选择希望传引用就定义为类,希望穿拷贝就定义为结构
 Gc问题
 托管代码被CLR管理的代码
 非托管代码不被CLR管理的代码
 分配在栈空间的变量一旦执行完其所在的作用域这个变量就会被CLR立即回收
 分配在堆里面的对象当没有任何变量引用它的时候,这个对象就被标记为“垃圾对象”等待垃圾回收器回收。
 GC清理垃圾对象的频率程序员无法决定CLR会自动控制。 
 最大只有三代,当第0代满时,进行清理,并把存活的存入第1代,一次类推。。。新变量一致在第0代中
 栈空间里的将在过完作用域之后立即被系统回收
堆空间里的对象当没有任何变量指向它的时候标记为”可回收”,GC会定时清理在堆空间上被标记为”可回收”的对象
 GC.Collect();强制即时进行垃圾回收;
垃圾回收器会定时对堆空间进行清理,这个时间是CLR定义的,程序员无法干预
Person p=new Person();
Person p1=p;
int gen=GC.GetGeneration(p);
int i=GC.MaxGeneration;
Console.WriteLine(gen);
p=null;
p1=null;
GC.Collect();

〉〉〉静态问题:

静态成员只被创建一次,所以静态成员只有一份。实例成员有多少个对象就有多少份。 静态成员会被创建在静态存储区中,一旦被创建直到程序退出,才会被回收。
使用范围:
变量需要被共享的时候;一个方法在程序运行中经常被调用,可以定义为静态方法。
 this/base关键字在静态方法中不能使用因为有可能对象不存在。
 可以创建这个类的对象指定对象的成员在静态方法中操作
 在实例方法中可以调用静态成员,因为这个时候静态成员肯定存在
 
 静态成员和实例成员异同:
 1、生命周期不同
 2、在内存中存储的位置不同
 静态类:
 静态类中必须全部都是静态成员
 静态类中不能有实例构造函数。
 静态类不能被实例化.
 静态类的本质是1个抽象的密封类,所以不能被继承也不能实例化。
 如果一个类下面的所有成员都需要被共享,那么就可以把这个类定义为静态类
 不能生命一个静态类的变量
 
 非静态类也可以有静态构造函数
 继承问题:
 protected修饰的成员只能在本类和子类中访问。
 创建子类对象的时候,在子类对象中会为子类对象的字段开辟空间也会为父类对象的所有字段开辟空间,只不过父类私有的成员访问不到而已。
 子类的访问级别不能比父类高
 子类从父类继承父类所有的非私有成员。
 
 base关键字显示调用父类的非私有成员
 创建子类对象的时候,会调用1、子类的构造函数,2、调用父类的构造函数,3、执行父类的构造函数,4、执行子类的构造函数
子类的构造函数后面默认加了一个:base()通过这个调用父类的无参数的构造函数。
如果父类没有无参数的构在函数,将会报错,因为子类的构造函数默认会调用父类的无参数的构造函数
是用base关键字可以显示的指定子类构造函数调用父类有参的构造函数
为什么要调用父类的构造函数?
父类的构造函数会初始化父类属性的值
继承的单根性和传递性
1、单根性
一个类只能由一个父类
2、传递性
object所有的类都直接或者间接的从object继承。
不要为了继承而继承
父类与子类存在同名成员的时候,如果创建1个子类对象调用这个子类对象的同名方法
会调用子类的

new关键字的第2个作用隐藏父类的同名成员

实例代码:

class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public bool Gender { get; set; }

        public Person(int age,string name,bool gender)
        {
            this.Age = age;
            this.Name = name;
            this.Gender = gender;
        }
         public Person()
        {
            Console.WriteLine("我是父类的构造函数");
        }
    }
class Student:Person
    {
        public Student()
        {
            Console.WriteLine("我是苦逼的学生,每天都要交作业");
        }
        public Student():base(12,"jack",true)
        {
            Console.WriteLine("我是子类的构造函数");
        }
    }

 class Teacher:Person 
    {
       
        public int Year { get; set; }
        public Teacher()
        {
            Console.WriteLine("我是老师,我是来检查作业的");
        }
}
 


0 0
原创粉丝点击