• <NET CLR via c# 第4版>笔记 第14章 字符,字符串和文本处理


    14.1 字符

    三种数值类型与 Char 实例的相互转换:

            static void Main()
            {
                Char c;
                Int32 n;
    
                //方法一: 通过C#转型(强制类型转换)实现数字与字符的相互转换
                //效率最高
                c = (char)65;
                Console.WriteLine(c);   //显示"A"
    
                n = (int)c;
                Console.WriteLine(n);   //显示"65"
    
                c = unchecked((char)(65536 + 65));
                Console.WriteLine(c);   //显示"A"
    
                //方法二: 使用Convert实现数字与字符的相互转换
                c = Convert.ToChar(65);
                Console.WriteLine(c);   //显示"A"
    
                n = Convert.ToInt32(c);
                Console.WriteLine(n);   //显示"65"
    
                //演示Convert的范围检查
                try
                {
                    c = Convert.ToChar(70000);  //对16位来说过大
                    Console.WriteLine(c);       //不执行
                }
                catch (OverflowException)
                {
                    Console.WriteLine("Can't convert 70000 to a Char.");
                }
    
                //方法三: 使用IConvertible实现数字与字符的相互转换
                //效率最差.因为在值类型上调用接口方法要求对实例进行装箱--Char 和所有数值类型都是值类型.
                c = ((IConvertible)65).ToChar(null);
                Console.WriteLine(c);   //显示"A"
    
                n = ((IConvertible)c).ToInt32(null);
                Console.WriteLine(n);   //显示"65"
            }
    

    14.2 System.String类型

    14.2.1 构造字符串

    14.2.2 字符串是不可变的

    14.2.3 比较字符串

    • 出于编程的目的而比较字符串时,应该总是使用 StringComparison.Ordinal 或者 StringComparison.OrdinalIgnoreCase . 忽略语言文化是字符串比较最快的方式.
    • 如果要以语言文化正确的方式来比较字符串(通常为了向用户显示),就应该使用 StringComparison.CurrentCulture 或者 CurrentCultureIgnoreCase .
    • 要在序号比较(传递 StringComparison.Ordinal 执行的就是序号比较,不考虑语言文化信息,只比较字符串中的每个Char的Unicode码位)前更改字符串中字符的大小写,应该使用 String 的 ToUpperInvariantToLowerInvariant 方法(String类没有提供ToUpperOrdinal和ToLowerOrdinal方法).强烈建议用ToUpperInvariant方法对字符串进行正规化,因为Microsoft对执行大写比较的代码进行了优化.ToUpper和ToLower方法对语言文化敏感,速度较慢.
    • 避免使用不带 StringComparison 参数的其它重载方法,以及避免使用==和!=操作符,因为这样无法从方法名看出默认比较方式,不利于代码的阅读和维护.

    14.2.4 字符串留用

            public static string Intern(string str);
            public static string IsInterned(string str);
    
    • Intern 获取一个String,如果内部哈希表中存在,则返回该字符串的引用;如果不存在,就创建字符串的副本,并添加到内部哈希表中,返回对该副本的引用.
    • IsInterned 和 Intern 类似,只是当内部哈希表中不存在时,不会创建,而是返回 null
    • 了解就好,经测试,c#默认都是留用的.

    14.2.5 字符串池

    14.2.6 检查字符串中的字符和文本元素

    14.2.7 其他字符串操作

    14.3 高效率构造字符串

    14.3.1 构造 StringBuilder 对象

    • StringBuilder 维护的字符数组长度默认为16,追加字符时,超出会倍增
    • 数组动态扩容会损害性能,最好给一个合适的初始值. (这个类似于List的实现)

    14.3.2 StringBuilder 的成员

    14.4 获取对象的字符串表示:ToString

    14.4.1 指定具体的格式和语言文化

    • "C" 表示货币格式
    • "D" 表示十进制格式
    • "E" 表示科学记数法(指数)格式
    • "G" 表示常规格式
    • "N" 表示数字格式
    • "P" 表示百分比格式
    • "X" 表示十六进制格式
                var n = 123456;
                Console.WriteLine(n.ToString("C"));
                Console.WriteLine(n.ToString("D"));
                Console.WriteLine(n.ToString("E"));
                Console.WriteLine(n.ToString("G"));
                Console.WriteLine(n.ToString("N"));
                Console.WriteLine(n.ToString("P"));
                Console.WriteLine(n.ToString("X"));
                // 以下为输出
                // ¥123,456.00
                // 123456
                // 1.234560E+005
                // 123456
                // 123,456.00
                // 12,345,600.00%
                // 1E240
    
    • 使用特定语言文化格式化:
                decimal price = 123.54M;
                string s = price.ToString("C", new CultureInfo("en-US"));
                Console.WriteLine(s);   //输出:  $123.54
    

    14.4.2 将多个对象格式化成一个字符串

                string s = string.Format("订单 {0} 的商品数量为 {1:N0} 个,金额为 {2:C}",
                    "11", 1234, 10000);
                Console.WriteLine(s);
                //中文环境下输出:  订单 11 的商品数量为 1,234 个,金额为 ¥10,000.00
    

    14.4.3 提供定制格式化器

    14.5 解析字符串来获取对象: Parse

    • 如果频繁调用 Parse, 而且 Parse 频繁抛出异常,应用程序的性能会显著下降. 可考虑 TryParse

    14.6 编码: 字符和字节的相互转换

                //准备编码的字符串
                string s = "Hi there.";
    
                //获取从Encoding派生的一个对象.
                //它知道怎样使用UTF8来进行编码/解码
                Encoding encodingUTF8 = Encoding.UTF8;
    
                //将字符串编码成字节数组
                Byte[] encodedBytes = encodingUTF8.GetBytes(s);
    
                //显示编好码的字节值
                Console.WriteLine("Encoded bytes: " +
                    BitConverter.ToString(encodedBytes));
    
                //将字节数组解码回字符串
                String decodedString = encodingUTF8.GetString(encodedBytes);
    
                //显示解码的字符串
                Console.WriteLine("Decoded String: " + decodedString);
    
                //上述代码输出如下:
                // Encoded bytes: 48-69-20-74-68-65-72-65-2E
                // Decoded String: Hi there.
    
    • **避免使用 Encoding.Default **,不同服务器有可能不同. (可在"控制面板" --> "区域和语言" --> "非 Unicode 程序中所使用的当前语言" 中设置)

    14.6.1 字符和字节流的编码和解码

    14.6.2 Base-64字符串编码和解码

                //获取一组10个随机生成的字节
                byte[] bytes = new byte[10];
                new Random().NextBytes(bytes);
    
                //显示字节
                Console.WriteLine(BitConverter.ToString(bytes));
    
                //将字节解码成 Base-64 字节串,并显示字符串
                string s = Convert.ToBase64String(bytes);
                Console.WriteLine(s);
    
                //将Base-64字符串编码回字节,并显示字节
                bytes = Convert.FromBase64String(s);
                Console.WriteLine(BitConverter.ToString(bytes));
                
                //范例输出,因为是随机数,所以结果会不同
                // 35-17-02-B7-F2-AF-EC-2A-E7-5D
                // NRcCt/Kv7CrnXQ==
                // 35-17-02-B7-F2-AF-EC-2A-E7-5D
    

    14.7 安全字符串

    返回目录

  • 相关阅读:
    UIProgressView的详细使用
    Android拍照上传代码样例
    UILabel的详细使用及特殊效果
    TextView属性android:ellipsize实现跑马灯效果
    Android中WebView实现Javascript调用Java类方法
    有效获取状态栏(StatusBar)高度
    详解iPhone Tableview分批显示数据
    TextView显示插入的图片
    ObjectiveC语法快速参考
    UISegmentedControl的详细使用
  • 原文地址:https://www.cnblogs.com/harry-wang/p/7239805.html
Copyright © 2020-2023  润新知