• c#之类


    引用刘铁猛老师(大神)内容:https://www.bilibili.com/video/BV13b411b7Ht?p=23

    1.面向对象主要是指封装,继承,多态。

    2.类

    类是一种数据结构,他可以包含数据成员(常量和字段),函数成员(方法,属性,事件,索引器,运算符,实例构造函数,静态构造函数和析构函数)以及嵌套类型。

    (1)类是一种抽象数据结构,是一种抽象的结果。比如一个学生,我们可以抽取这个学生的姓名学号,电话等封装在一起,形成一个学生类,这个类中有学生的成员。可以通过类来实现继承与多态。

    (2)类是数据类型,是一种自定义的引用类性。

    (3)在一定程度上代表了现实世界中的“种类”

    2.如下面的代码:

    (1)

    Student student=new Student ();  

    “=”左侧是声明了一个student对象,右侧则是创建了实例。

    namespace TestClass
    {
        class Program
        {
            static void Main(string[] args)
            {
                Student student = new Student() { Id=1,Name="张安"};
                Console.WriteLine("Hello World!");
            }
            
        }
        class Student
        {
    
            public int Id { get; set; }
    
            public String Name { get; set; }
    
            public void Report()
            {
                Console.WriteLine($"主键: {Id},Name:{Name}");
    
            }
        }
    }

    (2)实例构造器

    再看上面的截图,在这里会默认调用类的无参构造函数,对于类中的数据成员,值类型会默认为0,引用类性则默认为null

     有参数的实例构造器:

    类在创建实例的时候就像一个模板一样,来帮助我们创建实例,用这个模板创建出来的对象可以调用类中的数据成员与函数成员。

    创建出来对象之后调用类的构造器,我们可以按照自己的想法来进行一些改变,比如下面的代码,将id与name按照自己意愿设置值。需要注意的是这一步肯定是在初始化对象给对象赋值之前,

    namespace TestClass
    {
        class Program
        {
            static void Main(string[] args)
            {
                Student student = new Student(1, "构造器");
                Console.WriteLine(student.Id);
                Console.WriteLine(student.Name);
                Console.ReadKey();
            }
            
        }
        class Student
        {
            /// <summary>
            /// 有参数的构造函数
            /// </summary>
            /// <param name="id"></param>
            /// <param name="name"></param>
            public Student(int id,string name)
            {
                this.Id = id;
                this.Name = name;
    
            }

    /// <summary>
    /// 静态构造器必须给静态成员赋值,而且必须是无参数
    /// </summary>
    static Student()
    {
    Amount = 100;

    
    

    }

     public static int Amount { get; set; }
            public int Id { get; set; }
    
            public String Name { get; set; }
    
            public void Report()
            {
                Console.WriteLine($"主键: {Id},Name:{Name}");
    
            }
        }
    }

    (3)实例析构器

    GC是垃圾回收(Garbage Collector)的缩写。GC可以说是.NET众多机制中最为重要的,对程序员代码书写方式影响最大的机制。在CLR规范制定之初,所有机制都还在斟酌的时候,垃圾回收已经被确定会存在于.NET框架之中。

    .NET的程序大部分被称为被托管的代码。托管的意义很广泛,其中重要的一点就是代码中对象内存的分配和释放是由.NET内存管理和垃圾回收机制统一管理的。和传统C++的程序员不同,C#或者其他面向.NET框架语言的程序员不再需要时刻警惕内存的泄露,因为托管对象的内存最终会被垃圾回收释放掉,尽管不同的编写方式会产生不同的运行效率。 

    所谓的垃圾回收,是指.NET清理托管堆上不会再被使用的对象内存,并且移动仍在被使用的对象,使它们紧靠托管堆的一边。下图展示了一次垃圾回收后托管堆上的变化。

    需要注意的是当一个类调用了系统的一些底层资源,当GC收回不再使用的对象的时候,可能不会知道这个类的对象还会占用一些系统资源,所以需要我们使用析构器手动释放资源。

    如下面代码,当在Main函数执行完毕之后,方法内部的student对象不会被使用了,所以此时会执行析构函数。但是注意一般情况不需要使用析构器,这会造成性能上的影响。

     
    namespace TestClass
    {
        class Program
        {
            static void Main(string[] args)
            {
                Student student = new Student(1, "构造器");
                Console.WriteLine(student.Id);
                Console.WriteLine(student.Name);
                Console.ReadKey();
            }
            
        }
        class Student
        {
            /// <summary>
            /// 有参数的构造函数
            /// </summary>
            /// <param name="id"></param>
            /// <param name="name"></param>
            public Student(int id,string name)
            {
                this.Id = id;
                this.Name = name;
    
            }
            ~Student()
            {
                Console.WriteLine("析构函数");
            }
    
            public int Id { get; set; }
    
            public String Name { get; set; }
    
            public void Report()
            {
                Console.WriteLine($"主键: {Id},Name:{Name}");
    
            }
        }
    }

     (4)静态的实例构造器

    静态的成员只能是由静态的构造函数来执行,Main方法中在第一次创建类对象的时候,会先调用静态构造函数,给Amount一个默认值100,然后调用对应的构造函数,具体调用的是默认的无参构造函数,还是有参数的构造函数,看具体的调用,在创建第二个对象stu的时候,只会再次调用非静态构造函数,因为在第一次调用的时候已经给静态变量Amount赋值了,

    namespace TestClass
    {
        class Program
        {
            static void Main(string[] args)
            {
                Student student = new Student(1, "构造器");
                Student stu  = new Student(2, "构造器");
                Console.WriteLine(student.Id);
                Console.WriteLine(student.Name);
                Console.WriteLine(Student.Amount);
                Console.ReadKey();
            } 
        }
        class Student
        {
            /// <summary>
            /// 有参数的构造函数
            /// </summary>
            /// <param name="id"></param>
            /// <param name="name"></param>
            public Student(int id,string name)
            {
                this.Id = id;
                this.Name = name;
                Amount++;
            }
            /// <summary>
            /// 静态构造器必须给静态成员赋值,而且必须是无参数
            /// </summary>
            static Student()
            {
                Amount = 100; 
            }
            ~Student()
            {
                Console.WriteLine("析构函数");
            }
            public static int Amount { get; set; }
            public int Id { get; set; }
    
            public String Name { get; set; }
    
            public void Report()
            {
                Console.WriteLine($"主键: {Id},Name:{Name}");
    
            }
        }
    }

    结果:

    1
    构造器
    102
  • 相关阅读:
    Codeforces Round #595 (Div. 3) C题题解
    Educational Codeforces Round 83 (Rated for Div. 2)
    【算法竞赛进阶指南】Supermarket 贪心+并查集
    【算法竞赛进阶指南】字典树 The XOR Longest Path
    【算法竞赛进阶指南】字典树 The XOR Largest Pair
    【算法进阶指南】双端队列 DP+思维
    【算法进阶指南】蚯蚓 队列
    【2019 杭电多校第一场】Path 最短路+最小割
    【2017 ICPC 沈阳】G.Infinite Fraction Path 暴力优化
    【2017 CCPC 秦皇岛】A.Balloon Robot 思维
  • 原文地址:https://www.cnblogs.com/anjingdian/p/13121215.html
Copyright © 2020-2023  润新知