zoukankan      html  css  js  c++  java
  • 定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型

    为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会。 面向对象编程也叫做OOP编程 简单来说面向对象编程就是结构化编程,对程序中的变量结构划分,让编程更清晰。

    类的概念

    类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。 类定义了类的每个对象(称为实例)可以包含什么数据和功能。

    类中的数据和函数称为类的成员:数据成员        函数成员

    数据成员: 数据成员是包含类的数据--字段,常量和事件的成员。

    函数成员: 函数成员提供了操作类中数据的某些功能。(方法,属性,构造方法和终结器(析构方法),运算符,和索引器)

    字段的声明:访问修饰符 类型 字段名称;

    方法的声明:访问修饰符 返回值类型 方法名称(参数){ //方法体 }

    定义一个类来表示一个顾客:

    class Customer{
        public string name;
        public string address;
        public int age;
        public string buyTime;
        public void Show(){
            Console.WriteLine("名字:"+name);
            Console.WriteLine("年龄:"+age);
            Console.WriteLine("地址:"+address);
            Console.WriteLine("购买时间:"+buyTime);
        }
    }
    在这里我们定义了一个类,叫做Customer(顾客),里面包含了四个字段,存储了顾客的名字,年龄,地址和购买时间,包含了一个Show()方法,用来输出自身的一些信息的,在这里Customer就是一个新的数据类型
    类似于结构体的定义
    struct Customer......;

    如何利用类创建对象:

    使用我们自定义的类声明的变量也叫做对象,这个过程也叫做实例化。

    ClassName myClass = new ClassName();

    其中ClassName是我们定义的类的名字,myClass是我们声明的变量(对象)的名字,后面的new是一个关键字,使用new 加上类型名()表示对该对象进行构造,如果不进行构造的话,这个对象是无法使用的。

    构造函数:

    我们构造对象的时候,对象的初始化过程是自动完成的,但是在初始化对象的过程中有的时候需要做一些额外的工作,例如需要初始化对象存储的数据,构造函数就是用于初始化数据的函数。

    声明基本的构造函数的语法就是声明一个和所在类同名的方法,但是该方法没有返回类型。

    public class MyClass{

    public MyClass()

    { 这个构造函数的函数体 }

    }

    当我们使用new关键字创建类的时候,就会调用构造方法。 我们一般会使用构造方法进行初始化数据的一些操作。 构造函数可以进行重载,跟普通函数重载是一样的规则

    注意: 当我们不写,任何构造函数的时候,编译器会提供给我们一个默认的 无参的构造函数,但是如果我们定义了一个或者多个构造函数,编译器就不会再提供默认的构造函数

    属性的定义:

    属性的定义结构:

    public int MyIntProp{
            get{
                // get code
            }
            set{
                //set code
            }
        }

    1,定义属性需要名字和类型

    2,属性包含两个块 get块和set块

    3,访问属性和访问字段一样,当取得属性的值的时候,就会调用属性中的get块,所以get块,类型需要一个返回值就是属性的类型;

          当我们去给属性设置值的时候,就会调用属性中的set块,我们可以在set块中通过value访问到我们设置的值。

    通过属性来访问字段:

    我们习惯上把字段设置为私有的,这样外界不能修改字段的值,然后我们可以通过定义属性来设置和取得字段中的值。

    private int age;
    public int Age{//习惯上属性大写 字段小写
        set{
            if(value<0)return;
            age = value;
        }
        get{
            return age;
        }
    }

    设置属性的只读或者只写:

    private string name;
    public string name{
        get{
            return name;
        }
    }
    属性可以值只提供一个set块或者get块

    属性的访问修饰符

    public string name{
        get{
            return name;
        }
        private set{
            name = value;
        }
    }

    自动实现的属性

    public int Age{get;set;}
    编译器会自动创建private int age属性

    匿名类型(var)

    我们创建变量(对象的时候),必须指定类型,其实我们也可以不去指定类型,这个就是匿名类型,我们可以使用var声明一个匿名类型。 使用var声明的匿名类型,当初始化的时候,这个变量的类型就被确定下来,并且以后不可以修改。

    var var1 = 34;

     

    堆和栈 : 程序运行时的内存区域

    我们把内存分为堆 空间和栈空间

    栈空间比较小,但是读取速度快 堆空间比较大,但是读取速度慢

    栈的特征: 数据只能从栈的顶端插入和删除 把数据放入栈顶称为入栈(push) 从栈顶删除数据称为出栈(pop)[后进先出] 

    堆是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除

    GC Garbage Collector垃圾回收器:

    CLR的GC就是内存管理机制,我们写程序不需要关心内存的使用,因为这些都是CLR帮我们做了。

     

    值类型和引用类型:

    类型被分为两种:值类型(整数,bool struct char 小数)和引用类型(string 数组 自定义的类,内置的类)。

    值类型只需要一段单独的内存,用于存储实际的数据,(单独定义的时候放在栈中)

    引用类型需要两段内存 第一段存储实际的数据,它总是位于堆中 第二段是一个引用,指向数据在堆中的存放位置

    当我们使用引用类型赋值的 时候,其实是赋值的引用类型的引用 如果数组是一个值类型的数组,那么数组中直接存储值,如果是一个引用类型的数组(数组中存储的是引用类型),那么数组中存储的是引用(内存地址)

  • 相关阅读:
    POJ3320 Jessica's Reading Problem
    POJ3320 Jessica's Reading Problem
    CodeForces 813B The Golden Age
    CodeForces 813B The Golden Age
    An impassioned circulation of affection CodeForces
    An impassioned circulation of affection CodeForces
    Codeforces Round #444 (Div. 2) B. Cubes for Masha
    2013=7=21 进制转换
    2013=7=15
    2013=7=14
  • 原文地址:https://www.cnblogs.com/dsh20134584/p/7384626.html
Copyright © 2011-2022 走看看