.NET基础-9-类|堆和栈|静态成员|字符串方法

类:类是一个模型,一个蓝图,确定了一个对象所拥有的属性和方法.他实际上并没有任何的数据,对象是类的实例,类决定了实例有什么组成并且可以进行什么操作,构成类的属性和方法称为类的成员

类是不能直接使用的,需要使用则需要创建这个类的对象,创建类的对象的过程叫做对类进行实例化

类中的成员如果不加修饰符,则全部默认为private(私有的,只能在类的内部使用,在类的外面无法访问)

类的成员:

字段:(蓝色方块)保存数据,比较重要,不应该被外界访问到,使用private来修饰,与属性搭配使用

private int _age;

常量:

属性(小手/小扳手):用来封装字段,把字段隐藏起来,对字段起到保护作用,对字段的赋值和取值进行限制,在类中每个字段都要对应的有个属性

        public int Age
        {
            get
            {//取值的时候如果获取的数据不符合,则直接返回规定的值
                if (_age > 150 || _age < 0)
                {
                    return 0;
                }
                return _age;
            }
            set
            {//赋值的时候如果输入的结果不符合,则直接赋值规定的值
                _age = value;
                if (value < 0 || value > 150)
                {
                    _age = 0;
                }
            }

        }

属性分为三种;

有get方法和set方法的称为可读可写属性

只有get方法没有set方法的是只读属性

只有set方法没有get方法的是只写属性

Ctrl+R+E:光标定位到字段,使用该快捷键可以快速为字段创建属性

函数(方法)(粉色方块):

构造函数:

this关键字:表示当前类


值类型和引用类型

值类型:都衍生于System.ValueType

包括:int,double,char,bool,decmial,struct,enum,byte,float,long,sbyte,short,uint,ulong,ushort

引用类型:他们都衍生与System.Object,且object就是System.Object

包括:string,class,interfase,delegate,object,数组

值类型存储在栈上(如int,double),而引用类型的值存储在堆上面(如string,数组)

例如:

int num=10;声明一个int类型变量num,则在栈上开辟了一个空间,空间名称叫做num,空间存储的内容为10

string name="张三";声明一个string类型的变量,则是在栈上开辟一个空间A,空间A的名称叫做name,空间A存的内容是地址(如0x00001),然后又在堆上开辟了一个空间B,空间B的地址是(0x00001),这个堆上空间B存储的内容为"张三",此时空间A存储的内容属实指向空间B的地址


程序的内存分配:C/C++/C#编译的程序占用的内存分为以下几个区域

栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈

堆区(heap):一般有程序员分配释放,如果程序员没有释放,则在程序结束时有由GC回收这部分内存空间,他与数据结构中的堆完全不同,分配方式类似于链表

全局区/静态区(static):全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一个区域,未初始化的全局变量和静态变量在相邻的另一个区域,分配的空间有程序结束后统一由系统释放

文子常量区:存放常量字符串,程序结束后由系统统一释放

程序代码区:存放函数的二进制代码

ps:这个堆和栈与数据结构中的堆和栈不同


堆与栈

申请方式:

栈有系统分配空间,int num=10;系统为在栈中直接分配空间,空间大小确定,空间内存储内容为10

堆有程序员自己确定开辟的空间大小,char[] p=new char[10];在堆上开辟一个长度为10的空间,但是注意p是在栈上的,此时栈中存储的是指向堆的地址

申请之后系统的响应:

栈:只要栈上的剩余空间大于申请的空间,系统就会在栈上开辟一个空间出来,如果空间不够则会报内存溢出的错误

堆:操作系统有一个记录空闲内存的链表,当系统收到程序的申请的时候,会遍历该链表,寻找第一个空间大于说申请空间的堆节点,然后将该节点从可用空间链表中删除,并将该节点的空间分配给程序.在这块空间进行使用的时候,会在首地址记录下分配的空间大小,这样delete才能正确释放空间的大小,而且应为找到的空间节点和申请的内存大小可能不是刚好一致,系统会将多余的空间重新放到空闲链表中

申请大小的限制:

栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域,意思是栈定的地址和栈的大小是系统预先规定好的(2M),如果申请的空间超过栈剩余的空间,将会提示overflow,因此能从栈获取的空间较小

堆:堆是向高地址扩展的数据结构,是不连续的内存区域,这是应为系统是用链表存储空闲空间地址的,而链表的遍历是从低地址向高地址的,堆的地址受限于计算机系统中有效的虚拟内存

申请效率:

栈有系统自动分配,速度快,但是不收控制,栈在读取的时候速度比较快

堆是在new的时候分配的,一般速度较慢,而且容易产生空间碎片,但是使用起来方便,


静态成员

被static修饰的成员被称为静态成员,可以是类,字段,属性,函数

在一个非静态类中可以出现静态成员

在一个非静态函数中可以访问静态字段,属性等成员

在静态类中不能出现非静态的函数,字段等非静态成员

在静态函数中不能访问到非静态成员

调用:在调用实例的时候,必选先对类进行实例化,这时操作的是实例化出来的对象.在调用静态成员的时候,使用的是类名.静态成员名的格式,静态类是不允许创建对象的

ps:C#中没有全局变量这个东西,但是有静态的成员,可以使成员变成共享的


访问修饰符

类的访问修饰符只有两种

public:公开的

internal:表示该类只能在当前程序集内部访问,出了该程序集就无法访问了

类必须声明程public,如果没有加public修饰符,则默认为internal


字符串

字符串是引用类型,内存分配在堆上

string具有不可变性,示例如下

string name="张三";//声明一个变量name,在堆上开辟一个空间A存储内容"张三",A空间的地址为(0x00001),并且在栈上开辟一个空间name,他存储的内容为空间A的地址(0x00001)

name="李四";//重新为变量赋值为"李四",这时会在堆上重新开辟一个空间B,存储的内容为"李四",B空间的地址为(0x00010),此时栈上空间name存储的内容为B的地址(0x00010),而且堆上的空间A仍然存在并且内容为"张三",只是地址的指向变了

string str="abcdef";

char chr=str[0];//字符串可以进行度的操作,根据下标读取字符串中的字符

str[0]='b';//这样操作是不行的,这里只能读操作不能写操作

char[] chs=str.ToCharArray();//把字符串装换为字符数组

str=new string(chs);//把字符数组转换成字符串

str.Length:求字符串的长度

str.ToUpper;转换成大写

str.Tolower:转换成小写

str.Equals(str2);判断两个字符串是否有相同的值(不区分大小写)

str.Equals(str2,StringComparison.OrdinalIgnoreCase);忽略大小写比较

str.Split('|');分割字符串,返回的是一个string[] 数组

           练习1

            string str = "1988  --,   -,-    ,  10--  ,--05";
            //使用参数StringSplitOptions.RemoveEmptyEntries去掉空的字符串元素
            string[] strNew = str.Split(new char[] { ' ', '-', ',' }, StringSplitOptions.RemoveEmptyEntries);

            Console.ReadKey();

           练习2

            string date = "2018-03-13";//输出为2018年05月13日
            string[] newDate = date.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
            date = newDate[0] + "年" + newDate[1] + "月" + newDate[2] + "日";
            Console.WriteLine(date);
            Console.ReadKey();

str.Remove(1);//返回当前实例中从指定位置到最后位置的所有以删除的字符的新字符串

str.Replace("赵", "**");//把字符串str中的所有[赵]替换成[***]

str.Substring(1,2);//返回该字符串从指定的字符位置开始且具有指定的长度的新字符串

str.IndexOf(string s);//获取第一个指定子字符串的的下标

str.LasrIndexOf(string s);//获取最后一个指定字符串的下标

            int index = str.IndexOf('b');//获取字符串中[b]的下标
            Console.WriteLine(index);

            Console.ReadKey();

string.Join(string s,str);//在数组中插入字符串s,并返回一个新的字符串

            string[] names = { "诸葛亮", "鸟叔", "卡卡西", "卡哇伊" };
            string s = string.Join("|", names);
            Console.WriteLine(s);
            Console.ReadKey();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值