值类型和援用类型在内部存款和储蓄器上的储存区域,根底笔记

图片 5

值类型和援用类型在内部存款和储蓄器上的储存区域,根底笔记

程序员开荒平常涉及到的内存区域:堆、栈、静态存款和储蓄区域。

1.字段、属性、方法、构造函数
字段:存款和储蓄数据
属性:保养字段,对字段的取值和设值实行界定
办法:描述对象的作为
构造函数:开首化对象(给目的的各类属性依次的赋值卡塔 尔(英语:State of Qatar)
类中成员,如若不加访谈修饰符,暗中认可都以private
给每个私人住房的字段都配备一个国有的习性
属性的本色正是四个法子

值类型和引用类型的区分:

当大家创造好对象后
给那个指标的性质赋值用set
打字与印刷这一个性子的值的时候实践get

  1. 值类型和援用类型在内部存款和储蓄器上囤积的位置不生机勃勃致。值类型的值是积存在内部存款和储蓄器的栈此中。援引类型的值是储存在内部存款和储蓄器的堆中。
  2. 在传递值类型和传递援引类型的时候,传递格局不一样。值类型大家称之为值传递,援引类型我们称为引用传递。

this:当前类的目的
this:调用当前类
this是把质量和有些变量区分开来的。
构造函数:1、未有重返值 连void也并未
2、构造函数的称谓跟类名雷同

本章节,权且只介绍第2个区分:值类型和引用类型在内部存款和储蓄器上的储存区域。

构造函数能够重载
:this(name,0,0,gender)

 

new:1、在内部存款和储蓄器中开垦一块空间
2、在开荒的长空成立对象
3、调用对象的构造函数

常用值类型:int、double、bool、char、decimal、struct、enum

界定:set get 构造函数

常用援用类型:string、自定义类、数组

静态方法 类名.方法名
实例方法 对象名.方法名


静态方法只好访谈到静态成员
静态类不能够创制对象

 

2、命名空间
取名空间能够视作是类的文件夹
能够感到类是归于命名空间的。
假定在时下项目中从未那么些类的命名空间,需求大家手动的导入这么些类所在的
取名空间。
1)、用鼠标去点
2)、alt+shift+F10
3)、记住命名空间,手动的去援用

 1.值种类存储图解:

3、在八个品类中引用另一个类型的类
1)、在缓慢解决方案财富微机的援用右键增多援引
2)、引用命名空间

图片 1

3、值类型和引用类型
区别:
1、值类型和援用类型在内存上囤积的地点差别等。
2、在传递值类型和传递援引类型的时候,传递的法子不切合。
值类型大家称之为值传递,援引类型大家称为引用传递。
我们学的值类型和引用类型:
值类型:int、double、bool、char、decimal、struct、enum
援用类型:string、自定义类、数组
存储:
值类型的值是储存在内部存款和储蓄器的栈个中。
援用类型的值是积累在内部存款和储蓄器的堆中。

 

堆、栈、静态存款和储蓄区域


int number=10;
在栈中开辟三个空中,在此个空间存储10,给那几个空间起名称为number
string s=”123″;
在堆中开辟四个上空,在这里个空间存储”123″,有一个地方(援用卡塔尔 0x001001,
在栈中开垦一个空间,存堆中的地址0x001001,起名称为s。以往s是指向堆中的内部存款和储蓄器的

 

Person zsPerson=new Person();
zsPerson.Name=”张三”;

 2.援用类型-字符串存款和储蓄图解:

在堆中开荒空间,在这里个空间存款和储蓄 new Person();
“张三”,有三个地方(援引卡塔 尔(英语:State of Qatar)
在栈中开辟一个空中,存堆中的地址,起名为zsPerson

图片 2

4、字符串
1)、字符串的不可变性
当您给二个字符串重新赋值之后,老值并不曾消亡,而是重新开辟一块空间存款和储蓄新值。
当程序截至后,GC扫描整个内部存款和储蓄器,假使开采存些空间未有被针对,则即时把它销毁。

 

int 重新赋值 会在原本的栈空间覆盖原值
string
重新赋值,会在原本的堆空间重新开垦叁个上空存新值。栈中存地址的半空中不改变

 

创建 string s1=”张三”
        string s2=”张三”
只在堆中开发一块空间 存款和储蓄”张三”
在栈中开荒两块空间命名叫s1和s2指向堆中的空间(存款和储蓄堆中的地址)


图片 3

 

私家表达:

3.引用类型-自定义类存款和储蓄图解:

①当您创制了S1和S2后,就能够在栈中开发多少个空中

图片 4

   贰个叫S1,内部存款和储蓄器地址是1000XX


   三个叫S2,内存地址是2002XX

 

②你给S1,S2赋值的string 类型 “张三”

 引用类型存款和储蓄总计:

   是存在堆中开采的空中内

援用类型的靶子存款和储蓄在堆中,并且会分配一个内部存储器地址。该内部存款和储蓄器地址会积累到栈空间,栈空间名为变量名。

   它也会有个内部存款和储蓄器地址是XX0001

即读取援用类型对象的顺序:变量—>内部存款和储蓄器地址—>实例对象。

③你栈中的S1,S2空间存的是堆中  的内存地址XX0001,他们是同四个东西

④倘使你再  S1=”李四”

                    S2=“李四”

 
 它们也只是把S1,S2里面的内部存款和储蓄器地址指向堆中开垦的叁个叫”李四”的长空的内部存储器地址。

   原本堆中存的”张三”不会有别的变动。

⑤当您清理内部存款和储蓄器的时候,那些”张三”因为内部存款和储蓄器地址未有被引述过,就能够被清理掉(垃圾回笼)

窗口-即时-及时窗口-&s1 &s2 能够看s1和s2的内部存款和储蓄器地址
上面是栈中的地点,上面是堆中的地址

图片 5

2)、大家得以把字符串看做是char类型的几个只读数组。
ToCharArray();将字符串转变为char数组
new string(char[] chs):能够将char数组调换为字符串

1 string s = "abcdefg";
2 char[] chs = s.ToCharArray();
3 chs[0] = 'b';
4 s= new string(chs);
5 Console.WriteLine(s);
6 Console.ReadKey();

Stopwatch 计时器
Stopwatch sw=new Stopwatch();
sw.Start();开端计时
sw.Stop();结束计时
sw.elapsed 当前实例度量得出的总运维时刻

StringBuilder sb=new StringBuilder();

sb.Append(i);追加

能把那些i累积到sb里面

 1 StringBuilder sb = new StringBuilder();
 2 //string str = null;
 3 Stopwatch sw = new Stopwatch();
 4 sw.Start();
 5 for (int i = 0; i < 100000; i++)
 6 {
 7 //str += i;
 8 sb.Append(i);
 9 }
10 sw.Stop();
11 Console.WriteLine(sw.Elapsed);
12 Console.ReadKey();

 

string 为何如此慢,因为它每一趟都要开空间
stringbuilder这么快是因为它在内部存款和储蓄器中开空间,用来用去皆以千篇生机勃勃律块类型。
提起底stringbuild仍旧得要tostring转为string 类型。

5、字符串提供的各个措施
//把字符串转为大写
LessonOne =LessonOne.ToUpper();
//把字符串转为小写
LessonOne=LessonOne.ToLower();
//比较七个字符串的值
LessonOne.Equals(LessonTwo,StringComparison.OrdinalIgnoreCase)
Equals相近 StringComparison.OrdinalIgnoreCase
枚举.忽略被比较的字符串的高低写

string s = “a b c 3 12 – + _ , == fdf”;
//分割字符串Split
//把不想要的字符都写在char数组里
//数组就算干掉了,可是仍旧留了三个空””
//后边加上,StringSplitOptions.RemoveEmptyEntries把空给干掉
char[] chs = { ‘ ‘,’_’,’=’,’+’,’,’,’-‘};
string[] str = s.Split(chs,StringSplitOptions.RemoveEmptyEntries);
Console.ReadKey();

练习

Console.WriteLine("请输入日期,格式如2008-08-08");
string s = Console.ReadLine();
//可以不用创建char []chs,直接把它New在里面
string [] date= s.Split(new char [] {'-' },StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine("你输入的日期是{0}年{1}月{2}日",date[0],date[1],date[2]);
Console.ReadKey();

//contains(包涵),推断字符串中是不是含有钦命的字符串

//Replace(替换) 将字符串中有些字符串替换到叁个新的字符串,再次来到
练习

1 string str = "国家领导人老赵";
2 if(str.Contains("老赵"))
3 {
4 str=str.Replace("老赵","**");
5 }
6 Console.WriteLine(str);
7 Console.ReadKey();

1 //Substring 截取字符串
2 string str = "今天天气好晴朗,处处好风光";
3 //把字符串当做数组,从下标0开始截取
4 str = str.Substring(1);
5 //从“天”开始截取,截取2个字
6 str = str.Substring(1,2);
7 Console.WriteLine(str);
8 Console.ReadKey();

 1 //StartsWith()判断字符串中是否以子串value开始 
 2 //EndsWith()判断字符串中是否以子串value结束 
 3 //使用方式相同
 4 string str = "今天天气好晴朗,处处好风光";
 5 if(str.StartsWith("今天"))
 6 {
 7 Console.WriteLine("是的");
 8 }
 9 else
10 {
11 Console.WriteLine("不是");
12 }
13 Console.ReadKey();

1 //判断某个字符串在字符串中第一次出现的下标位置,如果没有返回-1,由int类型接受
2 string str = "今天天气好晴朗,处处好风光";
3 int n=str.IndexOf('天');
4 //后面加个Int类型数字,表示找字符串中的第几个‘天’的下标
5 //int n=str.IndexOf('天',2);
6 //如果要找到所有‘天’的下标,就需要用循环来找
7 Console.WriteLine(n);
8 Console.ReadKey();

1 //LastIndexOf():判断某个字符串在字符串中最后一次出现的位置,如果没有同样返回-1
2 //LastIndexOf()经常和Substring配合使用
3 string path = @"c:abcdefgff苍dsfgdd苍老师.wav";
4 //找最后一个斜线后出现的文字才是最准确的,一直截到最后
5 int index=path.LastIndexOf("\"); 两个斜线表示一个斜线

练习

1 string path = @"c:abcdefgff苍dsfgdd苍老师.wav"; @代表字符串中的都表示
2 int index = path.LastIndexOf("\");字符串中\代表一个
3 path=path.Substring(index+1); 截取是从开始,所以要加1
4 Console.WriteLine(path);
5 Console.ReadKey();

1 //Trim():去掉字符串中前后的空格
2 //TrimEnd():去掉字符串中结尾的空格
3 //TrimStart():去掉字符串中前面的空格
4 string str = " hahaha ";
5 str=str.Trim();
6 Console.Write(str);
7 Console.ReadKey();

 1 //string.IsNullOrEmpty():判断一个字符串是否为空或者为null
 2 string str = null;
 3 if(string.IsNullOrEmpty(str))
 4 {
 5 Console.WriteLine("是的");
 6 }
 7 else
 8 {
 9 Console.WriteLine("不是");
10 }
11 Console.ReadKey();

1 //string.Join():将数组按照指定的字符串连接,返回一个字符串。
2 string[] name = { "张三","李四","王五","赵六","田七" };
3 string str=string.Join("|", name); params可变参数:可以放数组也可以放参数
4 Console.WriteLine(str);
5 Console.ReadKey();

1)、Length:获得当前字符串中字符的个数
2)、ToUpper():将字符转换到大写格局
3)、ToLower():将字符串转变到小写格局
4)、Equals(lessonTwo,StringComparison.OrdinalIgnoreCase):相比七个字符串,可以忽视大小写
5)、Split():分割字符串,重返字符串类型的数组。
6)、Substring():截取字符串。在截取的时候包罗要截取的不胜地方。
7)、IndexOf():判别有些字符串在字符串中首先次现身的岗位,若无回去-1、值类型和援用类型在内部存款和储蓄器上囤积的地点不相通。
8)、LastIndexOf():判别有些字符串在字符串中最终三回现身的地点,若无同样重返-1
9)、StartsWith():判别以….起头 bool类型判别
10)、EndsWith():判别以…停止 bool类型推断
11)、Replace():将字符串中有些字符串替换来三个新的字符串
12)、Contains():决断有些字符串是还是不是含有钦点的字符串 bool类型剖断
13)、Trim():去掉字符串中上下的空格
14)、TrimEnd():去掉字符串中最后的空格
15)、TrimStart():去掉字符串中前面包车型客车空格
16)、string.IsNullOrEmpty():推断二个字符串是或不是为空恐怕为null
17)、string.Join():将数组遵照内定的字符串连接,再次来到三个字符串。

6.复习
字符串要求精晓的独特之处
1卡塔尔国字符串不可变,每新建三个字符串都会在内部存款和储蓄器中开发一块新的空间
2卡塔 尔(英语:State of Qatar)字符串的方式

StringBuilder和String的区别
String在进展览演出算时(如赋值、拼接等卡塔尔会发出二个新的实例,而StringBuilder则不会。
利用StringBuilder实行操作,最终再用ToString转为String类型就能够。

1 string path = @"C:UsersSJDDesktop22.txt"; 路径
2 string [] str= File.ReadAllLines(path,Encoding.Default); 
3 //File(静态类).ReadAllLines(方法,读取所有的行)读取的全是乱码
4 //Encoding.Default 去除乱码
5 Console.ReadKey(); 

7.练习
char类型数组转为string类型

1 char[]chs={‘1’,‘2’,‘3’};
2 string str=new string(chs);

求出字符串中存有现身的e的职位
@第生机勃勃种艺术(必需会卡塔尔国

 1 string str = "daghdewejhadgwehhjfhajejwwe";
 2 int index = str.IndexOf('e');
 3 Console.WriteLine("第1次出现e的位置是{0}", index);
 4 int count = 1;
 5 while (index != -1)
 6 { 
 7 index = str.IndexOf('e', index + 1);
 8 count += 1;
 9 if (index == -1)
10 {
11 break;
12 }
13 Console.WriteLine("第{0}次出现e的位置是{1}", count, index);
14 }
15 Console.ReadKey();

第二种办法
搜求多少个字的话就特出

1 string str = "daghdewejhadgwehhjfhajejwwe";
2 for (int i = 0; i < str.Length; i++)
3 {
4 if(str[i]=='e')
5 {
6 Console.WriteLine(i);
7 }
8 }
9 Console.ReadKey();

8.继承
每一个类都要单独写在叁个类公事里。

大家兴许会在一些类中,写一些再度的成员,大家能够将这一个重新的分子,
单独的包装到三个类中,作为这几个类的父类。

格式 子类:父类
Student、Teacher、Driver 子类 派生类
Person 父类 基类

子类世襲了父类,那么子类从父类这里世袭过来了什么样?
率先,子类世袭了父类的习性和方式,然而子类并未继续父类的村办字段。能收看也不能用
李三个有钱亲戚挂了,收益人是李,不过并未有给他银行密码。他继续过来了却用持续。
主题素材:子类有未有接二连三父类的构造函数?
答:子类并未有世襲父类的构造函数,不过。子类会私下认可的调用父类无参数的构造函数,
制造父类对象,让子类能够选用父类中的成员。
因而,假如在父类中重新写了多少个有参数的构造函数之后,那些无参数的就被干掉了,
子类就调用不到了,所以子类会报错。

实践完父类无参构造函数,再去试行子类的
试行父类的构造函数,就一定于创建三个父类的目的
因为还未父类的指标,子类不可能用父类的习性
创设子类对象的时候,也顺便创立了她父类的靶子,那样才具用到父类的习性和措施,成员
子类满含了投机的质量和父类对象(构造函数),内部的父类又满含了她的习性和章程

继续构造函数的历程能够参与子类的品质

父类私下认可调用无参的并不是有参的
消除办法:
1)、在父类中再次写三个无参数的构造函数。
2)、在子类中展现的调用父类的构造函数,使用首要字:base()

9.持续的特征
1、世襲的单根性:二个子类只可以有三个父类。
2、继承的传递性:外祖父-父亲-外孙子-儿子

10.查看类图
右键类文件-视图-查看类图 能够看类之间的三翻五次关系

11.object是全部类的基类。
假定未有让贰个类世襲于其余一个类,那么那一个类就气势磅礴于object

12.new关键字
1)、创制对象
2)、隐敝从父类这里世袭过来的同名成员。
潜伏的结局正是子类调用不到父类的成员。

子类成员名称和父类成员名称生机勃勃致,会暗藏世袭的父类成员,隐蔽后果正是调不到了。
加上new后只是不报错

13.复习
值类型
援用类型
字符串 不可变性
生机勃勃坨方法
StringBuilder
继承 单根性
传递性
子类跟父类构造函数的涉及
子类世襲了父类的哪些?
new关键字

admin

网站地图xml地图