值类型与引用类型,值类型和引用类型在内存上的储存区域

程序员开发平日提到到的内部存款和储蓄器区域:堆、栈、静态存款和储蓄区域。

  类别小说目录地址:

一.值品种与引用类型的界别:

一.字段、属性、方法、构造函数
字段:存款和储蓄数据
天性:爱抚字段,对字段的取值和设值进行限定
主意:描述对象的表现
构造函数:开端化对象(给指标的每一个属性依次的赋值)
类中成员,如若不加访问修饰符,暗中认可都以private
给每3个私人住房的字段都陈设一个国有的习性
属性的本色就是三个艺术

亚洲必赢官网,值类型和引用类型的界别:

.NET面试题解析(00)-开篇来商讨面试 &
体系小说索引

CLR支持七只品种:引用类型值类型。那是.NET语言的功底和主要,他们从类型定义、实例创设、参数字传送递,到内部存款和储蓄器分配都有所分化。

当大家成立好对象后
给这几个目的的性质赋值用set
打字与印刷这一个天性的值的时候实施get

  1. 值类型和引用类型在内部存款和储蓄器上囤积的地方不同。值类型的值是储存在内部存款和储蓄器的栈个中。引用类型的值是储存在内部存款和储蓄器的堆中。
  2. 在传递值类型和传递引用类型的时候,传递格局不平等。值类型我们称之为值传递,引用类型大家誉为引用传递。

  常会晤试标题:

  1. 值类型和引用类型的界别?

  2. 组织和类的分裂?

  3. delegate是援引类型或然值类型?enum、int[]和string呢?

  4. 堆和栈的差异?

  5. 怎样处境下会在堆(栈)上分红数据?它们有总体性上的分裂吗?

六.“结构”对象恐怕分配在堆上吗?什么情状下会发生,有怎么着要求小心的吧?

  1. 驾驭参数按值传递?以及按引用传递?

  2. outref 的界别与相同点?

  3. C#支持哪几个预订义的值类型?C#支持什么预订义的引用类型?

  4. 有两种办法能够判明值类型和引用类型?

  5. 说说值类型和引用类型的生命周期?

12.
若是结构体中定义引用类型,对象在内部存款和储蓄器中是怎么存款和储蓄的?例如上边结构体中的class类
User对象是储存在栈上,照旧堆上?

public struct MyStruct 
{ 
    public int Index; 
    public User User; 

亚洲必赢官网 1

this:当前类的靶子
this:调用当前类
this是把品质和有个别变量区分开来的。
构造函数:一、未有回来值 连void也尚未
二、构造函数的名目跟类名相同

本章节,暂且只介绍第三个组别:值类型和引用类型在内部存款和储蓄器上的囤积区域。

  认识值类型与引用类型

万变不离其宗,只要搞清楚值类型和引用类型的规律,上边装有标题就都消除了。

下图清晰了体现了.NET中项目分类,值类型首假使有的粗略的、基础的数据类型,引用类型首要用来更增加的、复杂的、复合的数据类型。

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

 

亚洲必赢官网 2 基本概念

CL汉兰达协助多只品种:引用类型值类型。那是.NET语言的底子和重大,他们从类型定义、实例创设、参数字传送递,到内部存储器分配都有所不一样。即使看起来大约,但确确实实清楚其内涵的人却看似并不多。

亚洲必赢官网 3

图片引用

下图清晰了体现了.NET中项目分类,值类型主若是壹些粗略的、基础的数据类型,引用类型首要用于更丰硕的、复杂的、复合的数据类型。

亚洲必赢官网 4

亚洲必赢官网 5

new:壹、在内部存款和储蓄器中开辟一块空间
二、在开拓的长空创制对象
三、调用对象的构造函数

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

亚洲必赢官网 6 内部存款和储蓄器结构

值类型和引用类型最根源的区分正是其内部存款和储蓄器分配的差异,在那前边率先要掌握CLSportage的内部存款和储蓄器中七个第一的定义:

Stack 栈:线程栈,由操作系统管理,寄存值类型、引用类型变量(正是引用对象在托管堆上的地址)。栈是基于线程的,也正是说三个线程会含有二个线程栈,线程栈中的值类型在对象功效域截至后会被清理,功能很高。

GC
Heap托管堆
:进度开首化后在进程地址空间上划分的内部存储器空间,存款和储蓄.NET运维进程中的对象,抱有的引用类型都分配在托管堆上,托管堆上分配的目标是由GC来治本和刑释解教的。托管堆是基于进度的,当然托管堆内部还有其它更为复杂的组织,有趣味的能够深深通晓。

组成下图精晓,变量a及其值三都以储存在栈下边。变量b在栈上存款和储蓄,其值指向字符串“1二三”的托管堆对象地址(字符串是引用类型,字符串对象是储存在托管堆上边。字符串是二个特有的引用类型,前面小说会特地琢磨)”

亚洲必赢官网 7

值类型从来都存款和储蓄在栈上边吗?全部的引用类型都存款和储蓄在托管堆上面吧?

一.单身的值类型变量,如局地值类型变量都以储存在栈上边包车型大巴;

二.当班值日类型是自定义class的三个字段、属性时,它随引用类型存款和储蓄在托管堆上,此时她是援引类型的一片段;

四.富有的引用类型肯定都以存放在托管堆上的。

伍.还有壹种景况,同地点标题1二,结构体(值类型)中定义引用类型字段,结构体是储存在栈上,其引用变量字段只存款和储蓄内部存款和储蓄器地址,指向堆中的引用实例。

值类型和引用类型最根源的界别正是其内部存款和储蓄器分配的差异,在那从前率先要驾驭CLHummerH二的内部存款和储蓄器中五个根本的概念:

限制:set get 构造函数

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

亚洲必赢官网 8 对象的传递

将值类型的变量赋值给另二个变量(恐怕作为参数字传送递),会执行三回值复制。将引用类型的变量赋值给另一个引用类型的变量,它复制的值是引用对象的内部存款和储蓄器地址,由此赋值后就会多个变量指向同一个引用对象实例。明白那一点尤其关键,上面代码测试证澳优下:

int v1 = 0;
            int v2 = v1;
            v2 = 100;
            Console.WriteLine("v1=" + v1); //输出:v1=0
            Console.WriteLine("v2=" + v2); //输出:v2=100

            User u1=new User();
            u1.Age = 0;
            User u2 = u1;
            u2.Age = 100;
            Console.WriteLine("u1.Age=" + u1.Age); //输出:u1.Age=100
            Console.WriteLine("u2.Age=" + u2.Age); //输出:u2.Age=100,因为u1/u2指向同一个对象

当把对象作为参数字传送递的时候,效果同地点壹样,他们都称之为按值传递,但因为值类型和引用类型的分别,导致其发出的效应也不如。

Stack
:线程栈,由操作系统一管理理,存放值类型、引用类型变量(正是引用对象在托管堆上的地方)。栈是基于线程的,也等于说1个线程会含有二个线程栈,线程栈中的值类型在目的功效域停止后会被清理,作用很高。

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


参数-按值传递:

private void DoTest(int a)
        {
            a *= 2;
        }

        private void DoUserTest(User user)
        {
            user.Age *= 2;
        }

        [NUnit.Framework.Test]
        public void DoParaTest()
        {
            int a = 10;
            DoTest(a);
            Console.WriteLine("a=" + a); //输出:a=10
            User user = new User();
            user.Age = 10;
            DoUserTest(user);
            Console.WriteLine("user.Age=" + user.Age); //输出:user.Age=20
        }

下边的代码示例,五个办法的参数,都以按值传递

  • 对于值类型(int a)
    :传递的是变量a的值拷贝副本,因而原本的a值并不曾变动。
  • 对此引用类型(User user)
    :传递的是变量user的引用地址(User对象实例的内部存储器地址)拷贝副本,由此他们操作都以同三个User对象实例。

GC
Heap托管堆
:进程早先化后在经过地址空间上划分的内存空间,存储.NET运行进程中的对象,享有的引用类型都分配在托管堆上,托管堆上分配的靶子是由GC来保管和刑释的。托管堆是依照进度的,当然托管堆内部还有别的更为复杂的布局,有趣味的能够深刻摸底。

静态方法只可以访问到静态成员
静态类无法创设对象

 

参数-按引用传递:

按引用传递的五个重点关键字:out
ref不管值类型或然引用类型,按引用传递的职能是相同的,都不传递值副本,而是引用的引用(类似c++的指针的指针)。out

ref告知编写翻译器方法传递额是参数地址,而不是参数本身,精晓这点很关键。

代码简单测试一下,倘诺换到out效果是千篇1律的

private void DoTest( ref int a)
        {
            a *= 2;
        }

        private void DoUserTest(ref User user)
        {
            user.Age *= 2;
        }

        [NUnit.Framework.Test]
        public void DoParaTest()
        {
            int a = 10;
            DoTest(ref a);
            Console.WriteLine("a=" + a); //输出:a=20 ,a的值改变了
            User user = new User();
            user.Age = 10;
            DoUserTest(ref user);
            Console.WriteLine("user.Age=" + user.Age); //输出:user.Age=20
        }

outref的主要性异同

  • outref都提醒编写翻译器传递参数地址,在表现上是同一的;
  • 他们的运用机制稍有例外,ref须要参数在动用在此以前要显式伊始化,out要在章程内部先河化;
  • out值类型与引用类型,值类型和引用类型在内存上的储存区域。 和 ref不能重载,就是无法定义Method(ref int a)和Method(out
    int
    a)那样的重载,从编译角度看,2者的本质是相同的,只是使用时有分歧;

构成下图理解,变量a及其值三都以储存在栈下边。变量b在栈上存款和储蓄,其值指向字符串“1二三”的托管堆对象地址(字符串是引用类型,字符串对象是储存在托管堆下面。字符串是一个特出的引用类型,前面作品会尤其研究)”

2、命名空间
取名空间能够看成是类的公文夹
能够认为类是属于命名空间的。
比方在近来项目中尚无这么些类的命名空间,供给大家手动的导入这一个类所在的
命名空间。
一)、用鼠标去点
2)、alt+shift+F10
3)、记住命名空间,手动的去引用

 壹.值品类存款和储蓄图解:

亚洲必赢官网 9 常见难点

亚洲必赢官网 10

亚洲必赢官网 11

三、在多个品种中引用另多少个品种的类
一)、在化解方案财富管理器的引用右键添加引用
二)、引用命名空间

亚洲必赢官网 12

  题目答案解析:

值类型一贯都存款和储蓄在栈上边吗?全部的引用类型都存款和储蓄在托管堆上边吧?

三、值类型和引用类型
区别:
一、值类型和引用类型在内部存储器上囤积的地点不一致等。
二、在传递值类型和传递引用类型的时候,传递的方法不雷同。
值类型大家称之为值传递,引用类型我们誉为引用传递。
大家学的值类型和引用类型:
值类型:int、double、bool、char、decimal、struct、enum
引用类型:string、自定义类、数组
存储:
值类型的值是储存在内部存款和储蓄器的栈个中。
引用类型的值是储存在内部存款和储蓄器的堆中。

 

1. 值品种和引用类型的界别?

值类型包涵简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等。

  • 一、赋值形式:将叁个值类型变量赋给另1个值类型变量时,将复制包涵的值。那与引用类型变量的赋值不一致,引用类型变量的赋值只复制对象的引用(即内部存款和储蓄器地址,类似C++中的指针),而不复制对象自笔者。
  • 二、继承:值类型不可能派生出新的品类,全体的值类型均隐式派生自
    System.ValueType。但与引用类型相同的是,结构也得以兑现接口。
  • 叁、null:与引用类型不一样,值类型不容许蕴涵 null
    值。然则,可空类型允许将 null
    赋给值类型(他实在只是壹种语法格局,在clr底层做了出格处理)。
  • 四、各种值类型均有叁个隐式的私下认可构造函数来开始化该类型的暗许值,值类型开始会私下认可为0,引用类型暗许为null。
  • 伍、值类型存款和储蓄在栈中,引用类型存款和储蓄在托管堆中。

一.独自的值类型变量,如部分值类型变量都是储存在栈下边包车型地铁;

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


二. 布局和类的区分?

结构体是值类型,类是引用类型,首要不相同如题一。别的的界别:

  • 布局不补助无惨构造函数,不接济析构函数,并且无法有protected修饰;
  • 结构常用来数据存款和储蓄,类class多用于行为;
  • class要求用new关键字实例化对象,struct能够不适用new关键字;
  • class能够为抽象类,struct不援救抽象;

贰.当班值日类型是自定义class的三个字段、属性时,它随引用类型存储在托管堆上,此时她是引用类型的一部分;

int number=十;
在栈中开拓3个空中,在那一个空间存款和储蓄10,给那个空间起名称为number
string s=”1贰三”;
在堆中开发一个上空,在这几个空间存款和储蓄”1贰三”,有3个地点(引用) 0x00十0壹,
在栈中开拓八个空中,存堆中的地址0x00100一,起名称叫s。今后s是指向堆中的内部存款和储蓄器的

 

三. delegate是援引类型大概值类型?enum、int[]和string呢?

enum枚举是值类型,其余都以援引类型。

四.具有的引用类型肯定都以存放在在托管堆上的。

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

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

4. 堆和栈的区分?

线程堆栈:简称栈 Stack
托管堆: 简称堆 Heap
  • 值类型大多分配在栈上,引用类型都分配在堆上;
  • 栈由操作系统一管理理,栈上的变量在其功能域实现后就被假释,功用较高,但空间有限。堆受CL宝马X5的GC控制;
  • 栈是基于线程的,每种线程都有自身的线程栈,开首大小为1M。堆是遵照进度的,一个经过分配3个堆,堆的轻重缓急由GC依据运市场价格况动态控制;

五.还有一种境况,同地方标题1二,结构体(值类型)中定义引用类型字段,结构体是储存在栈上,其引述变量字段只存款和储蓄内部存款和储蓄器地址,指向堆中的引用实例。

在堆中开发空间,在这些空间存储 new Person();
“张三”,有三个地址(引用)
在栈中开辟1个空间,存堆中的地址,起名字为zsPerson

亚洲必赢官网 13

6.“结构”对象也许分配在堆上吗?什么动静下会时有爆发,有怎么着供给留意的呢?

组织是值类型,有二种状态会分配在对地点:

  • 组织作为class的八个字段或性质,会随class壹起分配在堆下面;
  • 装箱后会在堆中蕴藏,尽量幸免值类型的装箱,值类型的拆箱和装箱都有质量损失,下一篇会首要关切;

目的的传递

4、字符串
1)、字符串的不可变性
当您给三个字符串重新赋值之后,老值并从未灭绝,而是重新开发1块空间存款和储蓄新值。
当程序结束后,GC扫描整个内部存款和储蓄器,借使发现有个别空间未有被针对,则立时把它销毁。

 

柒. 明了参数按值传递?以及按引用传递?

  • 按值传递:对于值类型传递的它的值拷贝副本,而引用类型传递的是引用变量的内部存款和储蓄器地址,他们依旧指向的同一个指标。
  • 按引用传递:通过重点字out和ref传递参数的内存地址,值类型和引用类型的职能是1律的。

将值类型的变量赋值给另二个变量(大概当作参数字传送递),会执行2遍值复制。将引用类型的变量赋值给另三个引用类型的变量,它复制的值是引用对象的内部存款和储蓄器地址,由此赋值后就会多二个变量指向同三个引用对象实例。当把对象作为参数字传送递的时候,都叫作按值传递。

int 重新赋值 会在原先的栈空间覆盖原值
string
重新赋值,会在原本的堆空间重新开发3个上空存新值。栈中存地址的长空不变

 

8. outref的分别与相同点?

  • outref都提醒编写翻译器传递参数地址,在作为上是一致的;
  • 她俩的使用机制稍有例外,ref供给参数在应用从前要显式初阶化,out要在艺术内部初始化;
  • outref不得以重载,就是不可能定义Method(ref int a)和Method(out
    int
    a)那样的重载,从编写翻译角度看,二者的嵩山真面目是壹样的,只是利用时有差别;

亚洲必赢官网 14

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


9. C#支撑哪多少个预约义的值类型?C#支撑什么预约义的引用类型?

值类型:整数、浮点数、字符、bool和decimal

引用类型:Object,String

亚洲必赢官网 15

 

拾. 有二种方法能够断定值类型和引用类型?

简言之来说,继承自System.ValueType的是值类型,反之是引用类型。

村办表达:

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

1一. 说说值类型和引用类型的生命周期?

值类型在功用域截止后释放。

引用类型由GC垃圾回收期回收。那一个答案恐怕太简单了,更详细的答案在后头的篇章会聊起。

1当您创制了S1和S二后,就会在栈中开辟五个空中

亚洲必赢官网 16

12. 假使结构体中定义引用类型,对象在内部存款和储蓄器中是何等存款和储蓄的?例如下边结构体中的class类 User对象是储存在栈上,还是堆上?

public struct MyStruct 
{ 
    public int Index; 
    public User User; 
}

MyStruct存储在栈中,其字段User的实例存款和储蓄在堆中,MyStruct.User字段存款和储蓄指向User对象的内部存款和储蓄器地址。

 

style=”font-family: 微软雅黑; font-size: small;”>版权全数,小说来源: style=”font-family: 微软雅黑; font-size: small;”>http://www.cnblogs.com/anding

style=”font-family: 微软雅黑; font-size: small;”>个人能力有限,本文内容仅供就学、商讨,欢迎指正、交换。

.NET面试题解析(00)-开篇来切磋面试 &
连串小说索引

   3个叫S一,内部存款和储蓄器地址是一千XX


  参考资料:

Value type and Reference type
Explained:

C# 值类型与引用类型
(上):

书籍:CLR via C#

图书:你无法不掌握的.NET

   1个叫S二,内存地址是两千XX

 

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

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

   是存在堆中开拓的上空内

引用类型的对象存款和储蓄在堆中,并且会分配一个内部存款和储蓄器地址。该内部存款和储蓄器地址会蕴藏到栈空间,栈空间名称为变量名。

   它也有个内部存储器地址是XX000一

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

三您栈中的S一,S二空间存的是堆中  的内存地址XX000一,他们是同三个事物

肆一旦您再  S一=”李四”

                    S2=“李四”

 
 它们也只是把S1,S贰里面包车型客车内部存款和储蓄器地址指向堆中开辟的3个叫”李四”的半空中的内部存款和储蓄器地址。

   原来堆中存的”张3″不会有其它改动。

5当您清理内部存款和储蓄器的时候,那多少个”张三”因为内部存款和储蓄器地址未有被引述过,就会被清理掉(垃圾回收)

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

亚洲必赢官网 17

二)、大家得以把字符串看做是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 类型。

伍、字符串提供的各样情势
//把字符串转为大写
LessonOne =LessonOne.ToUpper();
//把字符串转为小写
LessonOne=LessonOne.ToLower();
//相比较三个字符串的值
LessonOne.Equals(LessonTwo,StringComparison.OrdinalIgnoreCase)
Equals同样 StringComparison.OrdinalIgnoreCase
枚举.忽略被相比较的字符串的轻重写

string s = “a b c 3 12 – + _ , == fdf”;
//分割字符串Split
//把不想要的字符都写在char数组里
//数组即使干掉了,不过照旧留了2个空””
//前面加上,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(替换) 将字符串中某些字符串替换到3个新的字符串,重返
练习

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:\a\b\c\d\e\f\g\ff\苍\ds\fgd\d\苍老师.wav";
4 //找最后一个斜线后出现的文字才是最准确的,一直截到最后
5 int index=path.LastIndexOf("\\"); 两个斜线表示一个斜线

练习

1 string path = @"c:\a\b\c\d\e\f\g\ff\苍\ds\fgd\d\苍老师.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();

一)、Length:获得当前字符串中字符的个数
二)、ToUpper():将字符转换到大写格局
三)、ToLower():将字符串转换来小写方式
4)、Equals(lessonTwo,StringComparison.OrdinalIgnoreCase):比较八个字符串,能够忽略大小写
5)、Split():分割字符串,再次回到字符串类型的数组。
6)、Substring():截取字符串。在截取的时候包蕴要截取的老大地点。
7)、IndexOf():判断有些字符串在字符串中首先次面世的地点,如若未有回来-一、值类型和引用类型在内部存款和储蓄器上囤积的地点不均等。
八)、LastIndexOf():判断有个别字符串在字符串中最后二次面世的职位,要是没有壹样重回-壹
玖)、StartsWith():判断以….起始 bool类型判断
十)、EndsWith():判断以…甘休 bool类型判断
1一)、Replace():将字符串中有些字符串替换到一个新的字符串
1二)、Contains():判断有些字符串是还是不是带有钦命的字符串 bool类型判断
1叁)、Trim():去掉字符串中左右的空格
1四)、TrimEnd():去掉字符串中最终的空格
1伍)、TrimStart():去掉字符串中后面的空格
1陆)、string.IsNullOrEmpty():判断八个字符串是或不是为空只怕为null
17)、string.Join():将数组遵照钦赐的字符串连接,重回三个字符串。

6.复习
字符串供给控制的帮助和益处
一)字符串不可变,每新建三个字符串都会在内部存款和储蓄器中开发1块新的上空
二)字符串的方法

StringBuilder和String的区别
String在开始展览演算时(如赋值、拼接等)会生出3个新的实例,而StringBuilder则不会。
应用StringBuilder进行操作,最终再用ToString转为String类型即可。

1 string path = @"C:\Users\SJD\Desktop\22.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.继承
每二个类都要单独写在1个类公事里。

我们兴许会在1些类中,写1些再次的成员,大家能够将那些再一次的分子,
单身的包装到四个类中,作为这么些类的父类。

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

子类继承了父类,那么子类从父类那里继承过来了怎么?
第二,子类继承了父类的习性和方式,可是子类并从未继续父类的民用字段。能观察也不可能用
李3个有钱亲人挂了,收益人是李,可是没有给她银行密码。他延续过来了却用持续。
问题:子类有未有继续父类的构造函数?
答:子类并从未持续父类的构造函数,可是。子类会暗许的调用父类无参数的构造函数,
创建父类对象,让子类能够采纳父类中的成员。
所以,假诺在父类中再次写了叁个有参数的构造函数之后,那一个无参数的就被干掉了,
子类就调用不到了,所以子类会报错。

履行完父类无参构造函数,再去执行子类的
施行父类的构造函数,就也等于创设一个父类的目的
因为尚未父类的目的,子类不能够用父类的质量
创设子类对象的时候,也有意无意创设了他父类的靶子,那样才能用到父类的属性和办法,成员
子类包蕴了协调的天性和父类对象(构造函数),内部的父类又饱含了他的属性和情势

继承构造函数的进度能够参加子类的习性

父类默许调用无参的而不是有参的
化解办法:
1)、在父类中重新写叁个无参数的构造函数。
二)、在子类中突显的调用父类的构造函数,使用主要字:base()

玖.延续的性状
一、继承的单根性:八个子类只可以有三个父类。
2、继承的传递性:曾祖父-阿爸-孙子-孙子

拾.查看类图
右键类文件-视图-查看类图 能够看类之间的接续关系

11.object是全体类的基类。
假定未有让一个类继承于此外3个类,那么那些类就继续于object

12.new关键字
一)、创制对象
二)、隐藏从父类那里继承过来的同名成员。
躲藏的结局正是子类调用不到父类的积极分子。

子类成员名称和父类成员名称相同,会隐藏继承的父类成员,隐藏后果正是调不到了。
添加new后只是不报错

13.复习
值类型
引用类型
字符串 不可变性
壹坨方法
StringBuilder
继承 单根性
传递性
子类跟父类构造函数的关系
子类继承了父类的怎么?
new关键字

网站地图xml地图