zoukankan      html  css  js  c++  java
  • C# 字符串string

    一、引言

    在 C# 中,字符串是System.String类的一个引用类型。但与其他引用类型不同的是,C#将字符串视为一个基本类型,它可以申请为一个常量,也可以直接给它赋值。

    string关键字是System.String类的别名。


    二、函数

     初始化:

      一般最常用的是下面两种,当然最常用的是第一种:

    • string str = "111";
    • char[] chs = { 'z','x','s'};      string str = new string(chs);

     属性:

    名称

    描述

    Length

    字符串长度

     方法:

    名称

    描述

    Insert

    插入

    String Insert(int startIndex, String value);

    在字符串的index位置,插入value字符串

    Concat

    连接(无分隔符)

    static String Concat(String str0, String str1);

    static String Concat(params String[] values);

    static String Concat(params object[] args);

    Join

    连接(带分隔符)

    static String Join(String separator, params String[] value);

    返回一个以separator为间隔符,将value连接起来的字符串

    static String Join(String separator, String[] value, int startIndex, int count);

    返回一个从startIndex下标开始的,长度为count,以separator为间隔符,将value连接起来的字符串

    Split

    分割

    String[] Split(params char[] separator);

    将字符串按照char数组里面的字符分割

    String[] Split(String[] separator, StringSplitOptions options);

    将字符串按照string数组里面的字符串分割。

    参数:

    StringSplitOptions是个枚举,None = 0, 包含一个空字符串 。RemoveEmptyEntries = 1,不包括包含空字符串的数组元素

    Contains

    包含(是否)

     

    bool Contains(String value);

    判断字符串是否包含value

    EndsWith

    包含(末尾)

    bool EndsWith(String value);

    判断字符串末尾时候包含value

    bool EndsWith(String value, StringComparison comparisonType);

    StartsWith

    包含(头部)

    bool StartsWith(String value);

    判断字符串头部是否包含value

    IndexOf

    包含(返回下标)

    int IndexOf(String value);

    返回字符串包含value的第一个下标

    Replace

    替换

    String Replace(String oldValue, String newValue);

    将源字符串中的全部oldValue全部替换成NewValue

    Remove

    移除

    String Remove(int startIndex);

    将下标为index的数据移除

    Trim

    移除两侧的某些字符

    String Trim();

    移除字符串两侧所有空格

    String Trim(params char[] trimChars);

    移除字符串中与数组trimChars匹配的全部字符(两侧)

    String TrimEnd(params char[] trimChars);

    移除字符串中与数组trimChars匹配的全部字符(末尾)

    String TrimStart(params char[] trimChars);

    移除字符串中与数组trimChars匹配的全部字符(头部)

    ToLower

    转换为小写

    String ToLower();

    将字符串里面的字符全部换成小写

    ToUpper

    转换为大写

    String ToUpper();

    将字符串里面的字符全部换成大写

    Copy

    复制

    static String Copy(String str);

    返回一个与源字符串值相同的目标字符串

    Compare

    比较

    Static int Compare(String strA, String strB);

    比较strA和strB在字典序中的相对位置。

    A在B前,返回-1;A在B后,返回1;A=B,返回0;

    Static  int Compare(String strA, int indexA, String strB, int indexB, int length);

    Format

    格式转换

    static String Format(String format, object arg0);

    格式转换:如 string Result = string.Format("a={0}", 10);

    static String Format(String format, params object[] args);

    Substring

    子串

    String Substring(int startIndex, int length);

    返回源字符串中,以index开始,长度为length的字符串

    IsNullOrEmpty

    Null或者为空?

    static bool IsNullOrEmpty(String value);

    判断字符串是否为Null或者为空


    三、重点讲解

    字符串的不可变特性:(转)

      C#中字符串有一个重要的特性:不可变性,字符串一旦声明就不再可以改变。所以只能通过索引来读取指定位置的char,不能对指定位置的char进行修改。

      例如:string str="abc";  str[0]='x';  这时候,编译器会报错的。不允许这样。

      string可以看做是char的只读数组。如果要对char进行修改,那么就必须创建一个新的字符串,用s. ToCharArray()方法得到字符串的char数组,对数组进行修改后,调用new string(char[])这个构造函数来创建char数组的字符串。一旦字符串被创建,那么char数组的修改也不会造成字符串的变化。

    常见疑问:“谁说字符串不可变?string s1 = "abc";s1="123"s1这不是变了吗”

      要区分变量名变量指向的值的区别:程序中可以有很多字符串,然后由字符串变量指向他们,变量可以指向其他的字符串,但是字符串本身没有变化。字符串不可变性指的是内存中的字符串不可变,而不是变量不变。

     

    内存分配: 

    string s1 = "abc"; 这句代码执行完之后,在栈内存中开辟一块内存空间存储字符串变量s1,在堆内存中开辟一块内存空间来存储字符串对象“abc”,字符串变量s1指向字符串对象“abc”,如下图所示

    s1="123"; 这句代码执行完之后,在堆内存中再开辟一块内存空间来存储字符串对象“123”,字符串变量s1指向字符串对象“123”,如下图所示:

    此时可以看到,字符串变量s1已经指向了新的字符串对象“123”了,字符串对象“abc”已经没有任何的字符串变量指向它了,此时字符串对象“abc”就再也没有用了,当对象一定不再有用的时候GC(垃圾收集器)就可以将对象回收了,所以GC会在一个合适的时机来回收字符串对象“abc”,释放其占用的内存资源。判断一个对象是否一定不再有用的标准就是没有任何的变量指向它

    string s2 = s1;  这句代码执行完之后,在栈内存中开辟一块内存空间存储字符串变量s2,字符串变量s2也指向字符串对象“123”

    字符串拘留池机构 :(转)

      同一个程序中,如果将同一个字符串赋值给多个字符串,系统就会多次分配内存空间,这样不仅浪费内存,也会影响系统性能。

      为此,.Net提出了字符串拘留池机制。值相同的字符串共享同一个实例。字符串是不变的。不是所有字符串都在拘留池中,.Net会判断哪些该放。

        使用拘留池后,当CLR启动后,会在内部创建一个容器,该容器的键为字符串的内容,值则时字符串在托管堆上的引用。

      这样的话,每次需要分配一个新字符串对象时,在分配内存之前先会检测容器中是否包含了该字符串对象,存在则返回已经存在的字符串对象的引用,不存在的话才会新分配对象,把它添加到内部容器中,然后再返回该对象的引用。

      【如果用new分配一个字符串对象  || 动态输入的字符串,字符串拘留池机制不会起作用】

    object.ReferenceEquals方法判断两个变量是不是一个实例(同一个对象)

     string.IsInterned(string  value) ;  判断value 是否存在在拘留池内。 存在?输出该字符串;  不存在?返回null;

    string.Intern(string value);  将value加入到拘留池中

    测试:

    string s1 = "zxs";
    string s2 = "zxs";
    string s3 = new string(s1.ToCharArray());
    char[] chs = { 'z', 'z', 'z' };
    string s4 = new string(chs);

    Console.WriteLine("s1 和 s2 是否为同一个对象:" + ReferenceEquals(s1, s2));
    Console.WriteLine("s1 和 s3 是否为同一个对象:" + ReferenceEquals(s1, s3));
    Console.WriteLine("s3是否在拘留池内:" + string.IsInterned(s3));
    Console.WriteLine("s4是否在拘留池内:" + string.IsInterned(s4));

    输出结果:

    s1 和 s2 是否为同一个对象:True
    s1 和 s3 是否为同一个对象:False
    s3是否在拘留池内:zxs
    s4是否在拘留池内:

  • 相关阅读:
    Linux中的文件压缩,打包和备份命令
    Codeforces Round #219 (Div. 2) E. Watching Fireworks is Fun
    [一位菜鸟的COCOS-2D编程之路]COCOS2D中得动作,特效和动画
    软件工程 之 需求分析
    IOS开发之UINavigationController详解
    C++——友元函数和友元类
    拷贝构造函数
    CMake高级用法
    ros-slam的链接
    imu滤波
  • 原文地址:https://www.cnblogs.com/01zxs/p/9451457.html
Copyright © 2011-2022 走看看