iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#中的char与string详解
  • 740
分享到

C#中的char与string详解

2024-04-02 19:04:59 740人浏览 八月长安
摘要

1. System.Char 字符 char 是 System.Char 的别名。 System.Char 占两个字节,16个二进制位。 System.Char 用来表示、存储一个

1. System.Char 字符

char 是 System.Char 的别名。

System.Char 占两个字节,16个二进制位。

System.Char 用来表示、存储一个 Unicode 字符。

System.Char 的表示范围是 U+0000 到U+FFFF,char 默认值是 \0,即 U+0000

Unicode 的表示,通常以 U+____形式表示,即 U 和 一组16进制的数字组成。

char 有四种赋值方法

            char a = 'j';
            char b = '\u006A';
            char c = '\x006A';
            char d = (char) 106;
            Console.WriteLine($"{a} | {b} | {c} | {d}");

输出

j | j | j | j

\u 开头是 Unicode 转义序列(编码);使用 Unicode 转义序列,后面必须是4个十六进制的数字。

\u006A    有效
\u06A	  无效
\u6A	  无效

\x 开头是 十六进制转义序列,也是由4个十六进制数字组成。如果前面是N个0的话,则可以省略0。下面的示例都是表示同一个字符。

\x006A
\x06A
\x6A

char 可以隐式转为其他数值类型,整型有可以转为ushortintuintlong,和ulong,浮点型 可以转为 floatdouble,和decimal

char 可以显式转为 sbytebyteshort

其他类型无法隐式转为 char 类型,但是任何整型和浮点型都可以显式转为 char。

2. 字符处理

System.Char 中,具有很多就态方法,能够有助于识别、处理字符。

有一个非常重要的 UnicodeCateGory 枚举

  public enum UnicodeCategory
  {
    UppercaseLetter,
    LowercaseLetter,
    TitlecaseLetter,
    ModifierLetter,
    OtherLetter,
    NonSpacingMark,
    SpacinGCombiningMark,
    EnclosingMark,
    DecimalDigitNumber,
    LetterNumber,
    OtherNumber,
    SpaceSeparator,
    LineSeparator,
    ParagraphSeparator,
    Control,
    FORMat,
    Surrogate,
    PrivateUse,
    ConnectorPunctuation,
    DashPunctuation,
    OpenPunctuation,
    ClosePunctuation,
    InitialQuotePunctuation,
    FinalQuotePunctuation,
    OtherPunctuation,
    MathSymbol,
    CurrencySymbol,
    ModifierSymbol,
    OtherSymbol,
    OtherNotAssigned,
  }

System.Char 中, 有一个 GetUnicodeCategory() 静态方法,可以返回字符的类型,即上面的枚举值。

除了 GetUnicodeCategory() ,我们还可以通过具体的静态方法判断字符的类别。

下面列出静态方法的使用说明的枚举类别。

静态方法说明枚举表示
IsControl值小于0x20 的不可打印字符。例如 \r、\n、\t、\0等。
IsDigit0-9和其他字母表中的数字DecimalDigitNumber
IsLetterA-Z、a-z 和其他字母字符UppercaseLetter,
LowercaseLetter,
TitlecaseLetter,
ModifierLetter,
OtherLetter
IsLetterOrDigit字母和数字参考 IsLetter 和 IsDigit
IsLower小写字母LowercaseLetter
IsNumber数字、Unicode中的分数、罗马数字DecimalDigitNumber,
LetterNumber,
OtherNumber
IsPunctuation西方和其他字母表中的标点符号ConnectorPunctuation,
DashPunctuation,
InitialQuotePunctuation,
FinalQuotePunctuation,
OtherPunctuation
IsSeparator空格和所有的 Unicode 分隔符SpaceSeparator,
ParagraphSeparator
IsSurrogate0x10000到0x10FFF之间的Unicode值Surrogate
IsSymbol大部分可打印字符MathSymbol,
ModifierSymbol,
OtherSymbol
IsUpper大小字母UppercaseLetter
IsWhiteSpace所有的分隔符以及 \t、\n、\r、\v、\fSpaceSeparator,
ParagraphSeparator

示例

        char chA = 'A';
        char ch1 = '1';
        string str = "test string"; 

        Console.WriteLine(chA.CompareTo('B'));          //-----------  Output: "-1
														//(meaning 'A' is 1 less than 'B')
        Console.WriteLine(chA.Equals('A'));             //-----------  Output: "True"
        Console.WriteLine(Char.GetNumericValue(ch1));   //-----------  Output: "1"
        Console.WriteLine(Char.IsControl('\t'));        //-----------  Output: "True"
        Console.WriteLine(Char.IsDigit(ch1));           //-----------  Output: "True"
        Console.WriteLine(Char.IsLetter(','));          //-----------  Output: "False"
        Console.WriteLine(Char.IsLower('u'));           //-----------  Output: "True"
        Console.WriteLine(Char.IsNumber(ch1));          //-----------  Output: "True"
        Console.WriteLine(Char.IsPunctuation('.'));     //-----------  Output: "True"
        Console.WriteLine(Char.IsSeparator(str, 4));    //-----------  Output: "True"
        Console.WriteLine(Char.IsSymbol('+'));          //-----------  Output: "True"
        Console.WriteLine(Char.IsWhiteSpace(str, 4));   //-----------  Output: "True"
        Console.WriteLine(Char.Parse("S"));             //-----------  Output: "S"
        Console.WriteLine(Char.ToLower('M'));           //-----------  Output: "m"
        Console.WriteLine('x'.ToString());              //-----------  Output: "x"
        Console.WriteLine(Char.IsSurrogate('\U00010F00'));		// Output: "False"
        char test = '\xDFFF';
        Console.WriteLine(test);						//-----------	Output:'?'
        Console.WriteLine( Char.GetUnicodeCategory(test));//-----------	Output:"Surrogate"

如果想满足你的好奇心,可以点击 Http://www1.cs.columbia.edu/~lok/csharp/refdocs/System/types/Char.html

3. 全球化

C# 中 System.Char 有很丰富的方法去处理字符,例如常用的 ToUpperToLower 。

但是字符的处理,会受到用户语言环境的影响。

使用 System.Char 中的方法处理字符时,可以调用带有 Invariant 后缀的方法或使用 CultureInfo.InvariantCulture,以进行与语言环境无关的字符处理。

示例

            Console.WriteLine(Char.ToUpper('i',CultureInfo.InvariantCulture));
            Console.WriteLine(Char.ToUpperInvariant('i'));

对于字符和字符串处理,可能用到的重载参数和处理方式,请看下面的说明。

StringComparison

枚举枚举值说明
CurrentCulture0使用区分文化的排序规则和当前区域性来比较字符串
CurrentCultureIgnoreCase1使用对区域性敏感的排序规则,当前区域性来比较字符串,而忽略要比较的字符串的大小写
InvariantCulture2使用区分文化的排序规则和不变区域性比较字符串
InvariantCultureIgnoreCase3使用区分区域性的排序规则,不变区域性来比较字符串,而忽略要比较的字符串的大小写
Ordinal4使用序数(二进制)排序规则比较字符串
OrdinalIgnoreCase5使用序数(二进制)排序规则比较字符串,而忽略要比较的字符串的大小写

CultureInfo

枚举说明
CurrentCulture获取表示当前线程使用的区域性的 CultureInfo对象
CurrentUICulture获取或设置 CultureInfo对象,该对象表示资源管理器在运行时查找区域性特定资源时所用的当前用户接口区域性
InstalledUICulture获取表示操作系统中安装的区域性的 CultureInfo
InvariantCulture获取不依赖于区域性(固定)的 CultureInfo 对象
IsNeutralCulture获取一个值,该值指示当前 CultureInfo 是否表示非特定区域性

4. System.String 字符串

4.1 字符串搜索

字符串有多个搜索方法:StartsWith()EndsWith()Contains()IndexOf

StartsWith() 和 EndsWith() 可以使用 StringComparison 比较方式、CultureInfo 控制文化相关规则。

StartsWith() :字符串开头是否存在符合区配字符串

EndsWith(): 字符串结尾是否存在符合区配字符串

Contains(): 字符串任意位置是否存在区配字符串

IndexOf: 字符串或字符首次出现的索引位置,如果返回值为 -1 则表示无区配结果。

使用示例

            string a = "痴者工良(高级程序员劝退师)";
            Console.WriteLine(a.StartsWith("高级"));
            Console.WriteLine(a.StartsWith("高级",StringComparison.CurrentCulture));
            Console.WriteLine(a.StartsWith("高级",true, CultureInfo.CurrentCulture));
            Console.WriteLine(a.StartsWith("痴者",StringComparison.CurrentCulture));
            Console.WriteLine(a.EndsWith("劝退师)",true, CultureInfo.CurrentCulture));
            Console.WriteLine(a.IndexOf("高级",StringComparison.CurrentCulture));

输出

False
False
False
True
True
5

除了 Contains(),其它三种方法都有多个重载方法,例如

重载说明
(String)是否与指定字符串区配
(String, StringComparison)以何种方式指定字符串区配
(String, Boolean, CultureInfo)控制大小写和文化规则指定字符串区配

这些与全球化和大小写区配的规则,在后面章节中会说到。

4.2 字符串提取、插入、删除、替换

4.2.1 提取

SubString() 方法可以在提取字符串指定索开始的N个长度或余下的所有的字符。

            string a = "痴者工良(高级程序员劝退师)";
            string a = "痴者工良(高级程序员劝退师)";
            Console.WriteLine(a.Substring(startIndex: 1, length: 3));
            // 者工良
            Console.WriteLine(a.Substring(startIndex: 5));
            // 高级程序员劝退师)

4.2.2 插入、删除、替换

Insert() :指定索引位置后插入字符或字符串

Remove() :指定索引位置后插入字符或字符串

PadLeft() :在字符串左侧将使用某个字符串扩展到N个字符长度

PadRight():在字符串右侧将使用某个字符串扩展到N个字符长度

TrimStart() :从字符串左侧开始删除某个字符,碰到不符合条件的字符即停止。

TrimEnd() :从字符串右侧开始删除某个字符,碰到不符合条件的字符即停止。

Replace():将字符串中的N连续个字符组替换为新的M个字符组。

示例

            string a = "痴者工良(高级程序员劝退师)"; // length = 14

            Console.WriteLine("\n  -  Remove Insert   - \n");

            Console.WriteLine(a.Insert(startIndex: 4, value: "我是"));
            Console.WriteLine(a.Remove(startIndex: 5));
            Console.WriteLine(a.Remove(startIndex: 5, count: 3));

            Console.WriteLine("\n  -  PadLeft PadRight  -  \n");

            Console.WriteLine(a.PadLeft(totalWidth: 20, paddingChar: '*'));
            Console.WriteLine(a.PadRight(totalWidth: 20, paddingChar: '#'));
            Console.WriteLine(a.PadLeft(totalWidth: 20, paddingChar: '\u0023'));
            Console.WriteLine(a.PadRight(totalWidth: 20, paddingChar: '\u002a'));
            Console.WriteLine(a.PadLeft(totalWidth: 18, paddingChar: '.'));
            Console.WriteLine(a.PadRight(totalWidth: 18, paddingChar: '.'));

            Console.WriteLine("\n  -  Trim  -  \n");

            Console.WriteLine("|Hello | World|".Trim('|'));
            Console.WriteLine("|||Hello | World|||".Trim('|'));
            Console.WriteLine("|Hello | World!|".TrimStart('|'));
            Console.WriteLine("|||Hello | World!|||".TrimStart('|'));
            Console.WriteLine("|Hello | World!|".TrimEnd('|'));
            Console.WriteLine("|||Hello | World!|||".TrimEnd('|'));
            Console.WriteLine("||||||||||||||||||||||||".TrimEnd('|'));
            

            Console.WriteLine("*#&abc ABC&#*".TrimStart(new char[] {'*', '#', '&'}));
            Console.WriteLine("*#&abc ABC&#*".TrimStart(new char[] {'#', '*', '&'}));

            Console.WriteLine("\n  -  Replace  -  \n");

            Console.WriteLine("abcdABCDabcdABCD".Replace(oldChar: 'a', newChar: 'A'));

输出

  -  Remove Insert   -

痴者工良我是(高级程序员劝退师)
痴者工良(
痴者工良(序员劝退师)

  -  PadLeft PadRight  -

******痴者工良(高级程序员劝退师)
痴者工良(高级程序员劝退师)######
######痴者工良(高级程序员劝退师)
痴者工良(高级程序员劝退师)******
....痴者工良(高级程序员劝退师)
痴者工良(高级程序员劝退师)....

  -  Trim  -

Hello | World
Hello | World
Hello | World!|
Hello | World!|||
|Hello | World!
|||Hello | World!

abc ABC&#*
abc ABC&#*

  -  Replace  -

AbcdABCDAbcdABCD

5. 字符串驻留池

以下为笔者个人总结,限于水平,如若有错,望各位加以批评指正。

字符串 驻留池是在域(Domain)级别完成的,而字符串驻留池可以在域中的所有程序集之间共享。

CLR 中维护着一个叫做驻留池(Intern Pool)的表。

这个表记录了所有在代码中使用字面量声明的字符串实例的引用。

拼接方式操作字面量时,新的字符串又会进入字符串驻留池。

只有使用使用字面量声明的字符串实例,实例才会对字符串驻留池字符串引用。

而无论是字段属性或者是方法内是声明的 string 变量、甚至是方法参数的默认值,都会进入字符串驻留池。

例如

        static string test = "一个测试";

        static void Main(string[] args)
        {
            string a = "a";

            Console.WriteLine("test:" + test.GetHashCode());
            
            TestOne(test);
            TestTwo(test);
            TestThree("一个测试");
        }

        public static void TestOne(string a)
        {
            Console.WriteLine("----TestOne-----");
            Console.WriteLine("a:" + a.GetHashCode());
            string b = a;
            Console.WriteLine("b:" + b.GetHashCode());
            Console.WriteLine("test - a :" + Object.ReferenceEquals(test, a));
        }

        public static void TestTwo(string a = "一个测试")
        {
            Console.WriteLine("----TestTwo-----");
            Console.WriteLine("a:" + a.GetHashCode());
            string b = a;
            Console.WriteLine("b:" + b.GetHashCode());
            Console.WriteLine("test - a :" + Object.ReferenceEquals(test, a));
        }

        public static void TestThree(string a)
        {
            Console.WriteLine("----TestThree-----");
            Console.WriteLine("a:" + a.GetHashCode());
            string b = a;
            Console.WriteLine("b:" + b.GetHashCode());
            Console.WriteLine("test - a :" + Object.ReferenceEquals(test, a));
        }

输出结果

test:-407145577
----TestOne-----
a:-407145577
b:-407145577
test - a :True
----TestTwo-----
a:-407145577
b:-407145577
test - a :True
----TestThree-----
a:-407145577
b:-407145577
test - a :True

可以通过静态方法 Object.ReferenceEquals(s1, s2); 或者 实例的 .GetHashCode() 来对比两个字符串是否为同一个引用。

可以使用不安全代码,直接修改内存中的字符串

参考 https://blog.benoitblanchon.fr/modify-intern-pool/

string a = "Test";

fixed (char* p = a)
{
    p[1] = '3';
}

Console.WriteLine(a);

使用 *Microsoft.Diagnostics.Runtime* 可以获取 CLR 的信息。

结果笔者查阅大量资料发现,.net 不提供 api 去查看字符串常量池里面的哈希表。

到此这篇关于C#中的char与string详解的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#中的char与string详解

本文链接: https://www.lsjlt.com/news/163203.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#中的char与string详解
    1. System.Char 字符 char 是 System.Char 的别名。 System.Char 占两个字节,16个二进制位。 System.Char 用来表示、存储一个 ...
    99+
    2022-11-13
  • CHAR与VARCHAR详解
    前言:  前面写过一篇介绍int类型的文章,一直想写一篇介绍字符串字段类型的文章,一直拖着也没思路要怎么下手。最近多关注了下这方面的文章,决定还是把拖了好久的文章了结了吧。本篇文章主要会介绍字符串类型cha...
    99+
    2022-10-18
  • char str[] 与 char *str的区别详细解析
    复制代码 代码如下:char* get_str(void)  {      char str[] = {"abcd"}; ...
    99+
    2022-11-15
    char_str
  • C#与C++ dll之间传递字符串string wchar_t* char* IntPtr问题
    目录C#与C++ dll之间传递字符串string wchar_t* char* IntPtrC#调用C++ DLL的步骤以及遇到的乱码等问题C++ DLL动态库Lib_LR.dll...
    99+
    2022-11-13
    C#传递字符串 C++ dll C++传递字符串
  • C++中将Char转换成String的4种方法
    目录使用string::string(size_type count, charT ch)构造函数将字符转换为字符串使用push_back()方法将字符转换为字符串在 C++ 中使用...
    99+
    2023-03-09
    C++ Char转换成String C++ Char转换String
  • C++中const char*、char const*、char * const三者的区别
    目录一、const char *ptr;二、char const *ptr;三、char * const ptr;C/C++ 中关于以下三种定义: const char *...
    99+
    2022-11-12
  • C++中将Char转换成String的方法有哪些
    这篇文章主要介绍了C++中将Char转换成String的方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中将Char转换成String的方法有哪些文章都会有所收获,下面我们一起来看看吧。使用str...
    99+
    2023-07-05
  • c语言string和char的区别是什么
    C语言中,`char`和`string`是两种不同的数据类型。- `char`是C语言中用来表示单个字符的数据类型,它占用一个字节的...
    99+
    2023-08-18
    c语言 string char
  • C#的String和StringBuilder详解
    1.什么时候用String?什么时候用StringBuilder? 字符串一旦创建就不可修改大小,每次使用System.String类中的方法之一时,都要在内存中创建一个新的...
    99+
    2022-11-12
  • 【C++】:string用法详解
    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux的基础知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结构专栏:数据结构 个  人  主...
    99+
    2023-10-20
    c++ string
  • 详解C语言结构体中的char数组如何赋值
    目录前景提示一.char数组类型的处理1.结构体初始化2.结构体内数据赋值(简单法)二.char数组指针类型的处理1.结构体初始化2.结构体内数据赋值3.结构体内输出数据三.全部代码...
    99+
    2022-11-13
  • C#字符串String及字符Char的相关方法
    一、字符串: 1、访问String中的字符: string本身可看作一个Char数组。 string s = "hello world"; for (int i = 0; i &l...
    99+
    2022-11-13
  • 详解数据库varchar与char有哪些区别
    目录一、CHAR和VARCHAR有哪些区别1、固定长度 & 可变长度2、存储方式3、存储容量 CHAR二、CHAR和VARCHAR在SQL中需要注意的点三、类似的二进制类型:VARBINARYCHAR和VARCH...
    99+
    2023-10-28
    varchar与char区别 数据库varchar与char区别 varchar与char mysql varchar与char区别
  • Java中String和Char的相互转换
    一、String类型转化为char类型二、char类型转化为String类型 一、String类型转化为char类型 用String.charAt()来让String类型转化为cha...
    99+
    2023-09-01
    java
  • 详解C++中string的用法和例子
    在C++中,string是一个表示字符串的标准库类。它提供了许多成员函数和操作符,用于在字符串中执行各种操作。以下是一些常见的str...
    99+
    2023-08-16
    C++
  • C++ 系统String类详解
    目录一、C++系统String类1.定义及初始化2.类型大小3.常用运算1.赋值2.加法3.关系4.常见的成员函数1.下标操作2.求串大小3.返回c串(c语言中的字符串也叫c串)4....
    99+
    2022-11-12
  • C#字符串String及字符Char的方法怎么用
    这篇文章主要介绍了C#字符串String及字符Char的方法怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#字符串String及字符Char的方法怎么用文章都会有所收获,下面我们一起来看看吧。一、字符串...
    99+
    2023-06-30
  • c#中String类型的存储原理详解
    在我们正式了解c#中的String类型前,先来判断一下下面代码的结果吧~ String str1 = "123"; String str2 = str1; str2 = "321";...
    99+
    2022-11-13
  • JAVA中string转char的方法是什么
    在Java中,可以使用charAt()方法将String类型转换为char类型。该方法返回指定索引位置的字符。下面是一个示例:```...
    99+
    2023-08-16
    JAVA
  • C语言详解用char实现大小写字母的转换
    目录一、例题二、例题三、总结一、例题 将多个字母进行小写转换成大写 代码: #include <stdio.h> int main (void) { char a,b,...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作