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

  体系小说目录地址:

1.值门类与引用类型的差别:

一.字段、属性、方法、构造函数
字段:存款和储蓄数据
性情:体贴字段,对字段的取值和设值举行限定
措施:描述对象的表现
构造函数:伊始化对象(给目的的各种属性依次的赋值)
类中成员,假若不加访问修饰符,暗许都以private
给每三个私人住房的字段都配备三个国有的性质
质量的本质就是七个措施

值类型和引用类型的界别:

.NET面试题解析(00)-开篇来谈谈面试 &
类别小说索引

CL帕Jero扶助三只品种:引用类型值类型。那是.NET语言的底蕴和主要性,他们从类型定义、实例创制、参数字传送递,到内部存款和储蓄器分配都有所不相同。

当大家成立好对象后
给这几个指标的性质赋值用set
打字与印刷那脾本性的值的时候实施get

  1. 引用类型,值类型和引用类型在内部存款和储蓄器上的储存区域。值类型和引用类型在内存上囤积的地方分裂。值类型的值是储存在内部存款和储蓄器的栈当中。引用类型的值是储存在内部存款和储蓄器的堆中。
  2. 在传递值类型和传递引用类型的时候,传递情势不平等。值类型大家称之为值传递,引用类型大家誉为引用传递。

  常相会试标题:

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

  2. 结构和类的区别?

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

  4. 堆和栈的不相同?

  5. 什么情状下会在堆(栈)上分红数据?它们有总体性上的差距吧?

陆.“结构”对象恐怕分配在堆上吗?什么意况下会发生,有怎样供给小心的吧?

  1. 了解参数按值传递?以及按引用传递?

  2. outref 的分别与相同点?

  3. C#帮助哪多少个预约义的值类型?C#协理什么预订义的引用类型?

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

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

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

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

金沙注册送58 1

this:当前类的目的
this:调用当前类
this是把品质和局地变量区分开来的。
构造函数:壹、未有回去值 连void也并未
二、构造函数的称呼跟类名相同

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

  认识值类型与引用类型

万变不离其宗,只要搞清楚值类型和引用类型的法则,上面装有标题就都化解了。

下图清晰了展示了.NET中项目分类,值类型重假使有个别大致的、基础的数据类型,引用类型首要用以更增进的、复杂的、复合的数据类型。

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

 

金沙注册送58 2 基本概念

CLPAJERO帮助三只品种:引用类型值类型。那是.NET语言的功底和重大,他们从类型定义、实例创立、参数字传送递,到内部存款和储蓄器分配都有所差异。即使看起来大约,但真的领会其内涵的人却就像并不多。

金沙注册送58 3

图形引用

下图清晰了呈现了.NET中项目分类,值类型主要是一对简练的、基础的数据类型,引用类型主要用以更充分的、复杂的、复合的数据类型。

金沙注册送58 4

金沙注册送58 5

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

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

金沙注册送58 6 内部存款和储蓄器结构

值类型和引用类型最根源的区分便是其内存分配的出入,在那后面率先要清楚CLOdyssey的内部存储器中八个关键的定义:

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

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

组成下图精晓,变量a及其值三都以储存在栈上边。变量b在栈上存款和储蓄,其值指向字符串“12三”的托管堆对象地址(字符串是引用类型,字符串对象是储存在托管堆下面。字符串是三个特殊的引用类型,前边文章会特意探究)”

金沙注册送58 7

值类型平昔都存款和储蓄在栈上边吗?全体的引用类型都存款和储蓄在托管堆上边吧?

一.独立的值类型变量,如局地值类型变量都以储存在栈上边的;

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

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

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

值类型和引用类型最根源的区分就是其内部存款和储蓄器分配的异样,在那前边率先要清楚CL中华V的内部存款和储蓄器中八个首要的定义:

限制:set get 构造函数

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

金沙注册送58 8 对象的传递

将值类型的变量赋值给另一个变量(只怕当做参数字传送递),会进行1回值复制。将引用类型的变量赋值给另1个引用类型的变量,它复制的值是引用对象的内部存款和储蓄器地址,因而赋值后就会五个变量指向同1个引用对象实例。了解这点卓殊首要,上边代码测试证美赞臣(Meadjohnson)下:

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
:线程栈,由操作系统一管理理,存放值类型、引用类型变量(便是引用对象在托管堆上的地方)。栈是基于线程的,也正是说三个线程会含有3个线程栈,线程栈中的值类型在对象效率域截止后会被清理,成效很高。

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


参数-按值传递:

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对象实例的内部存款和储蓄器地址)拷贝副本,由此他们操作都是同3个User对象实例。

GC
Heap托管堆
:进程初始化后在经过地址空间上划分的内部存款和储蓄器空间,存储.NET运营进度中的对象,持有的引用类型都分配在托管堆上,托管堆上分配的对象是由GC来保管和自由的。托管堆是根据进度的,当然托管堆内部还有任何更为复杂的布局,有趣味的能够深刻摸底。

静态方法只可以访问到静态成员
静态类不能够创制对象

 

参数-按引用传递:

按引用传递的七个基本点关键字:out
ref不管值类型或许引用类型,按引用传递的功效是同样的,都不传递值副本,而是引用的引用(类似c++的指针的指针)。out

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

代码简单测试一下,借使换成out效果是如出壹辙的

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都提示编译器传递参数地址,在表现上是1样的;
  • 她们的应用机制稍有差别,ref要求参数在选择在此之前要显式初叶化,out要在章程内部初步化;
  • outref不得以重载,正是无法定义Method(ref int a)和Method(out
    int
    a)那样的重载,从编写翻译角度看,2者的真面目是同样的,只是利用时有差异;

组成下图驾驭,变量a及其值三都是储存在栈下边。变量b在栈上存款和储蓄,其值指向字符串“1二三”的托管堆对象地址(字符串是援引类型,字符串对象是储存在托管堆上边。字符串是二个卓殊的引用类型,后边小说会尤其斟酌)”

2、命名空间
取名空间能够当做是类的文件夹
能够认为类是属于命名空间的。
一经在时下项目中尚无那一个类的命名空间,必要咱们手动的导入这么些类所在的
取名空间。
一)、用鼠标去点
2)、alt+shift+F10
三)、记住命名空间,手动的去引用

 一.值档次存款和储蓄图解:

金沙注册送58 9 常见难题

金沙注册送58 10

金沙注册送58 11

叁、在二个品类中援引另一个类型的类
一)、在化解方案财富管理器的引用右键添加引用
2)、引用命名空间

金沙注册送58 12

  标题答案解析:

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

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

 

一. 值项目和引用类型的分别?

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

  • 一、赋值格局:将四个值类型变量赋给另二个值类型变量时,将复制包含的值。那与引用类型变量的赋值分化,引用类型变量的赋值只复制对象的引用(即内部存款和储蓄器地址,类似C++中的指针),而不复制对象自笔者。
  • 贰、继承:值类型不容许派生出新的档次,全部的值类型均隐式派生自
    System.ValueType。但与引用类型相同的是,结构也得以完毕接口。
  • 三、null:与引用类型不一致,值类型不恐怕包罗 null
    值。但是,可空类型允许将 null
    赋给值类型(他实在只是1种语法情势,在clr底层做了尤其处理)。
  • 四、每个值类型均有1个隐式的暗中同意构造函数来开头化该类型的暗中认可值,值类型初始会暗中认可为0,引用类型暗中同意为null。
  • 伍、值类型存款和储蓄在栈中,引用类型存款和储蓄在托管堆中。

一.独立的值类型变量,如有的值类型变量都以储存在栈上边的;

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


贰. 布局和类的界别?

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

  • 结构不帮衬无惨构造函数,不支持析构函数,并且不可能有protected修饰;
  • 组织常用来数据存款和储蓄,类class多用来行为;
  • class必要用new关键字实例化对象,struct能够不适用new关键字;
  • class能够为抽象类,struct不协理抽象;

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

int number=十;
在栈中开辟3个空间,在这些空间存款和储蓄十,给那个空间起名字为number
string s=”12叁”;
在堆中开拓二个空中,在这些空间存款和储蓄”1二三”,有3个地址(引用) 0x00十0一,
在栈中开发3个上空,存堆中的地址0x00十0壹,起名称为s。未来s是指向堆中的内部存款和储蓄器的

 

三. delegate是引用类型也许值类型?enum、int[]和string呢?

enum枚举是值类型,别的都以援引类型。

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

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

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

4. 堆和栈的区分?

线程堆栈:简称栈 Stack
托管堆: 简称堆 Heap
  • 值类型大多分配在栈上,引用类型都分配在堆上;
  • 栈由操作系统一管理理,栈上的变量在其成效域完结后就被放走,功用较高,但空间有限。堆受CLQashqai的GC控制;
  • 栈是基于线程的,每一个线程都有友好的线程栈,开首大小为1M。堆是基于进程的,三个进度分配二个堆,堆的轻重缓急由GC依据运市价况动态控制;

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

在堆中开发空间,在那几个空间存款和储蓄 new Person();
“张三”,有2个地方(引用)
在栈中开拓三个空中,存堆中的地址,起名称叫zsPerson

金沙注册送58 13

6.“结构”对象恐怕分配在堆上吗?什么动静下会发生,有怎样要求小心的吧?

布局是值类型,有二种状态会分配在对上面:

  • 布局作为class的三个字段或性质,会随class一起分配在堆下边;
  • 装箱后会在堆中储存,尽量幸免值类型的装箱,值类型的拆箱和装箱都有总体性损失,下1篇会重点关切;

对象的传递

4、字符串
壹)、字符串的不可变性
当你给三个字符串重新赋值之后,老值并没有灭绝,而是重新开发1块空间存款和储蓄新值。
当程序截止后,GC扫描整个内部存款和储蓄器,假如发现有的空间未有被指向,则马上把它销毁。

 

柒. 知道参数按值传递?以及按引用传递?

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

将值类型的变量赋值给另贰个变量(大概当作参数字传送递),会执行叁次值复制。将引用类型的变量赋值给另贰个引用类型的变量,它复制的值是引用对象的内存地址,因而赋值后就会多一个变量指向同2个引用对象实例。当把对象作为参数字传送递的时候,都称之为按值传递。

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

 

8. outref的区分与相同点?

  • outref都提醒编写翻译器传递参数地址,在行为上是壹样的;
  • 他俩的利用机制稍有两样,ref供给参数在选择以前要显式开始化,out要在章程内部开端化;
  • outref不得以重载,就是不能够定义Method(ref int a)和Method(out
    int
    a)这样的重载,从编写翻译角度看,二者的精神是同1的,只是选用时有不同;

金沙注册送58 14

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


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

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

引用类型:Object,String

金沙注册送58 15

 

拾. 有三种格局能够看清值类型和引用类型?

简短的话,继承自System.ValueType的是值类型,反之是引用类型。

私家表明:

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

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

值类型在功用域甘休后放走。

引用类型由GC垃圾回收期回收。那些答案可能太不难了,更详实的答案在后边的小说会提起。

1当您创建了S1和S2后,就会在栈中开辟七个空中

金沙注册送58 16

1贰. 假如结构体中定义引用类型,对象在内部存储器中是什么存款和储蓄的?例如上面结构体中的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个叫S1,内部存款和储蓄器地址是一千XX


  参考资料:

Value type and Reference type
Explained:

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

书籍:CLR via C#

书本:你必须精通的.NET

   二个叫S二,内部存款和储蓄器地址是3000XX

 

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

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

   是存在堆中开辟的上空内

引用类型的指标存款和储蓄在堆中,并且会分配1个内部存款和储蓄器地址。该内部存款和储蓄器地址会储存到栈空间,栈空间名叫变量名。

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

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

三您栈中的S一,S二空间存的是堆中  的内部存款和储蓄器地址XX0001,他们是同贰个东西

肆就算您再  S壹=”李四”

                    S2=“李四”

 
 它们也只是把S壹,S2里面包车型大巴内部存款和储蓄器地址指向堆中开辟的一个叫”李肆”的半空中的内部存款和储蓄器地址。

   原来堆中存的”张叁”不会有任何改动。

五当你清理内部存款和储蓄器的时候,这二个”张三”因为内存地址没有被引述过,就会被清理掉(垃圾回收)

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

金沙注册送58 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();

 

金沙注册送58 ,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数组里
//数组就算干掉了,不过依然留了二个空””
//后边加上,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:\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):比较八个字符串,能够忽略大小写
伍)、Split():分割字符串,重回字符串类型的数组。
六)、Substring():截取字符串。在截取的时候包涵要截取的要命位置。
7)、IndexOf():判断某些字符串在字符串中第二次面世的职责,假使未有回到-1、值类型和引用类型在内部存款和储蓄器上囤积的地点分裂等。
捌)、LastIndexOf():判断有个别字符串在字符串中最后一回面世的地点,如若未有一样重临-一
九)、StartsWith():判断以….开头 bool类型判断
10)、EndsWith():判断以…结束 bool类型判断
1一)、Replace():将字符串中有些字符串替换来三个新的字符串
1二)、Contains():判断某些字符串是还是不是带有钦点的字符串 bool类型判断
一三)、Trim():去掉字符串中左右的空格
1四)、TrimEnd():去掉字符串中最后的空格
一5)、TrimStart():去掉字符串中前面包车型大巴空格
16)、string.IsNullOrEmpty():判断3个字符串是不是为空或然为null
一七)、string.Join():将数组遵照内定的字符串连接,再次来到一个字符串。

6.复习
字符串供给精通的亮点
一)字符串不可变,每新建三个字符串都会在内部存款和储蓄器中开发壹块新的上空
二)字符串的法子

StringBuilder和String的区别
String在进展览演出算时(如赋值、拼接等)会发出2个新的实例,而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部分类中,写壹些重复的积极分子,我们得以将那几个重新的成员,
独立的卷入到二个类中,作为那些类的父类。

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

子类继承了父类,那么子类从父类那里继承过来了什么样?
率先,子类继承了父类的属性和措施,不过子类并不曾继承父类的村办字段。能看到也不能够用
李叁个有钱亲朋好友挂了,收益人是李,但是并没有给他银行密码。他持续过来了却用持续。
题材:子类有未有继承父类的构造函数?
答:子类并未继续父类的构造函数,可是。子类会默许的调用父类无参数的构造函数,
创建父类对象,让子类能够应用父类中的成员。
就此,假诺在父类中重复写了二个有参数的构造函数之后,那么些无参数的就被干掉了,
子类就调用不到了,所以子类会报错。

进行完父类无参构造函数,再去实践子类的
执行父类的构造函数,就也就是成立三个父类的对象
因为从没父类的靶子,子类不能够用父类的习性
创设子类对象的时候,也顺手创造了他父类的对象,那样才能用到父类的性质和艺术,成员
子类包括了友好的属性和父类对象(构造函数),内部的父类又富含了他的性质和措施

持续构造函数的经过可以进入子类的属性

父类暗中同意调用无参的而不是有参的
化解办法:
一)、在父类中另行写二个无参数的构造函数。
二)、在子类中展现的调用父类的构造函数,使用首要字:base()

玖.三番7遍的特色
一、继承的单根性:一个子类只好有一个父类。
二、继承的传递性:曾外祖父-阿爹-外孙子-外甥

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

1壹.object是全部类的基类。
借使未有让一个类继承于别的3个类,那么那个类就无冕于object

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

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

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

相关文章

网站地图xml地图