• CLR via c#读书笔记九:字符、字符串和文本处理


    1、在.NET Framework中,字符总是表示成16位unicode代码值(关于unicode、utf8等可以到http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html中查看)。

    2、在字符编码术语中,码位或编码位置,即英文的code point或code position,是组成码空间(或代码页)的数值。例如,ASCII码包含128个码位。

    3、System.String代表一个不可变的(immutable)顺序字符集。String类型直接派生自Object,所以是引用类型。因此,String对象(它的字符数组)总是存在于堆上,永远不会跑到线程栈。

    4、编译器允许在源代码中直接使用字面值(literal)字符串。编译器将这些字符串放到模块的元数据中,并在运行时加载和引用它们。

    5、所有字符串都要字面值,所以C#编译器能在编译时连接它们,最终只将一个字符串(即"Hi there.")放到模块的元数据中。对非字面值字符串使用+操作符,连接则在运行时进行。运行时连接不要使用+操作符,因为这样会在堆上创建多个字符串对象,而是需要垃圾回收的,对性能有影响。应该使用System.Text.StringBuilder类型。

    String s="Hi"+" "+"there.";//在编译时编译连接它们,最终只将一个字符串放到模块的元数据中。
    
    String s="Hi"+a+b+"there."//在运行时连接,会在堆上创建多个字符串对象

    6、String对象最重要的一点就是不可变(immutable)。所以对字符串使用方法操作也是创建新的字符串。例如:

    if(s.ToUpperInvariant().Substring(10,21).EndWith("EXE")){
        ...
    }

    如果执行大量的字符冲操作,会在堆上创建大量String对象,造成更频繁的垃圾回收,从而影响应用程序性能。

    7、比较字符串强烈建议调用String类定义的方法之一:

    Boolean Equals(string value,StringComparison comparisonType)

    ....(Page285)

    8、强烈建议用ToUpperInvariant方法对字符串进行正规化,而不要使用ToLowerInvariant,因为Microsoft对执行大写比较的代码进行了优化。之所以不用ToUpper和ToLower方法,是因为它们对语言文化敏感。

    9、传递StringComparison.Ordinal执行胡就是序号比较,也就是不考虑语言文化信息,只比较字符串胡每个char的unicode码位。

    10、String的其他比较方法CompareTo(IComparable接口所要求的)、CompareOrdinal以及==和!=操作符也应避免使用。之所以要避免使用这些方法和操作符,是因为调用者不显式指出以什么方式执行字符串比较,而你无法从方法名看出默认比较方式。

  • 相关阅读:
    vscode 远程连接服务器
    linux通配符和正则表达式
    vscode常用快捷键
    个人博客
    百度搜索自动排除csdn
    Spring Boot配置文件中动态配置运行目录,jar包路径
    eclipse springMVC项目打包war
    微信h5支付报错 商家参数格式有误,请联系商家解决
    Object函数的内置方法 Object.entries
    Object函数的内置方法 Object.getOwnPropertySymbols
  • 原文地址:https://www.cnblogs.com/yuzhoumanwu/p/9607957.html
Copyright © 2020-2023  润新知