• CLR via C#


    .NET中Char表示为16为的Unicode值,Char提供两个public const字段MinValue('',写成'u0000'也是一样的)和MaxValue('uffff').

    Char.GetUnicodeCategory(char实例)来返回char所属的unicode类型,返回System.Globalization.UnicodeCategory枚举之一

    ''的category为Control,所有类别如下

     1 Console.WriteLine("All Categories:");
     2             Enum.GetNames(typeof(System.Globalization.UnicodeCategory)).ToList().ForEach(Console.WriteLine);
     3             /*
     4             All Categories:
     5                 UppercaseLetter
     6                 LowercaseLetter
     7                 TitlecaseLetter
     8                 ModifierLetter
     9                 OtherLetter
    10                 NonSpacingMark
    11                 SpacingCombiningMark
    12                 EnclosingMark
    13                 DecimalDigitNumber
    14                 LetterNumber
    15                 OtherNumber
    16                 SpaceSeparator
    17                 LineSeparator
    18                 ParagraphSeparator
    19                 Control
    20                 Format
    21                 Surrogate
    22                 PrivateUse
    23                 ConnectorPunctuation
    24                 DashPunctuation
    25                 OpenPunctuation
    26                 ClosePunctuation
    27                 InitialQuotePunctuation
    28                 FinalQuotePunctuation
    29                 OtherPunctuation
    30                 MathSymbol
    31                 CurrencySymbol
    32                 ModifierSymbol
    33                 OtherSymbol
    34                 OtherNotAssigned
    35              */
    View Code

    当然那个枚举里面木有中文啊,像下面汉字直接显示为Other Letter

    char提供一系列静态方法,IsControl IsLetter IsNumber等等,内部都是调用GetUnicodeCategory来的,由于我们不能修改.NET程序集,我们可以给char结构加上扩展方法IsChineseCharacter。目前常见的中文匹配范围为4E00-9FA5,可以为Char写个扩展方法来判断

     1 /// <summary>
     2         /// 是否是中文字符
     3         /// </summary>
     4         /// <param name="this"></param>
     5         /// <returns></returns>
     6         public static bool IsChineseCharacter(this char @this)
     7         {
     8             var low = 'u4E00';
     9             var high = 'u9FA5';
    10             return @this.Between(low,high);
    11         }
    12 
    13         //betwen如下
    14         /// <summary>
    15     /// 当前值,介于两参数之间
    16     /// </summary>
    17     /// <typeparam name="T">值类型</typeparam>
    18     /// <param name="current">当前值</param>
    19     /// <param name="low">低档值</param>
    20     /// <param name="high">高档值</param>
    21     /// <returns>介于两者之间</returns>
    22     public static bool Between<T>(this T current,T low,T high)
    23         where T : IComparable<T>
    24     {
    25         //compare方法,
    26         //小于 <0
    27         //等于 =0
    28         //大于 >0
    29         return current.CompareTo(low) * current.CompareTo(high) <= 0;
    30     }
    View Code

    Char的大小写转换.Invariant是固定的,不变的,ToUpperInvariant以一种忽略文化的方式转换大小写,ToUpper ToLower会从System.Threading.Thread.CurrentThread.CurrentCulture获取文化地区相关的信息

    转换

    1.强制类型转换:编译器会生成IL指令来执行转换,效率最高,还可以指定checkd和unchecked,例如可以unchecked((char)(65535+65)),大写的A

    2.System.Convert类,一堆静态方法,总是以checked方式来转换

    3.IConvertible接口,效率最差,在值类型上调用接口方法要求装箱,强制转换成IConvertible接口来调用,IConvertible接口是显示实现的

     字符串

    1.构造

    string s="Hello World!";

    string snew=new String("Hello World!");//这种方法是不允许的

    在IL指令中,newobj用于new Object,对于string有特殊的指令ldstr,编译时string会被嵌入到程序集元数据,从元数据中load

    对于string s="strpart1 "+" "+"strpart2";这样的所有字符串都是[直接量],编译时会将他们连成一个字符串嵌入元数据.字符串是在托管堆上分配的

    2.字符串 是不可变的(immutable),对于字符串的任何改变都不会影响原来的字符串(PS:曾经初学的时候遇到坑,各种查错...),返回新构建的字符串,这种会造成很多的string垃圾

    字符串留用,内部hashtable,对于同一个string只存放一个,例如string s1="hello",s2="hello";s1=String.Intern(s1);s2=String.Intern(s2),这时候s1和s2的referenceEqual为true,也就是指向了同一对象...C#编译器都不用这个了,CLR via C#书上也就这么讲,如果编程工作因string太多影响程序效率可以再研究研究

    3.字符串比较

    又是方法 & 文化特性那些

    方法equals compare startwith endwith等,里面有一个StringComparison comparisonType参数

    StringComparison枚举:

    CurrentCulture InvariantCulture Oridinal以及他们的IgnoreCase版本

    Invariant:前面说过,不变的,固定的Culture,就是没有一种具体的语言文化

    Oridinal:顺序的,依次的,书上叫 序号比较,执行字符串比较最快

    Summary:InVariant在处理向用户展示的数据时不用,Equal默认用的是Oridinal,CompareTo默认依赖Culture,非Oridinal会将字符串展开(在其他语言里面的某些字母是几个字母合起来的,只能不明觉厉)来比较.

    CultureInfo

    CurrentCulture:控制货币,日期等等

    CurrentUICulture:控制UI界面的Culture

    CultureInfo引用了一个SystemGlobalization.CompareInfo,包含Compare方法

    查看String.CompareTo源码可以看见,调用的是CompareInfo.Compare

    4.StringBuilder

    两种情况下会在托管堆中分配新的对象

    1.构建的字符串超了StringBuilder的Capcity

    2.调用了ToString之后继续修改
     

  • 相关阅读:
    MyEclipse连接Oracle,出现ORA00604和ORA12705异常
    MyEclipse连接Oracle,出现ORA00604和ORA12705异常
    SSH Secure Shell Client 乱码问题
    android开发(20) 使用adb建立pc和android设备之间的连接。usb连接方式。
    android开发(22)使用正则表达式 。从一个字符串中找出数字,多次匹配。
    .net 中,使用c# 语言 ,执行exe程序。
    [转载]大数据存取的选择:行存储还是列存储?
    android开发(21)蜂鸣提示音和震动提示的实现。
    arcgis for android 学习 (8) 空间查询 点击某点,选中该点所在单位区域。
    android开发(24)使用SQLiteOpenHelper的onUpgrade实现数据库版本升级
  • 原文地址:https://www.cnblogs.com/magicdawn/p/3587150.html
Copyright © 2020-2023  润新知