C#中的char和string的使用简介
char 字符
char代表一个Unicode字符,它是System.Char的别名
char someChar = 'a';//定义了一个字符
char newLine= '\n';//这是一个换行符
System.Char定义了一组静态方法:
- ToUpper 将指定的字符转换为等效的大写形式
- ToLower 将指定的字符转换为等效的小写形式
- IsWhiteSpace 判断指定的字符是否为空白字符
- ……
例子:
Console.WriteLine(char.ToUpper('c'));//输出的是一个大写的C
Console.WriteLine(char.ToLower('c'));//输出的是还是它自己
Console.WriteLine(char.ToUpper('C'));//输出的是还是它自己
Console.WriteLine(char.ToLower('C'));//输出的是一个小写的c
Console.WriteLine(char.IsWhiteSpace('c'));//输出为False
Console.WriteLine(char.IsWhiteSpace('\t'));//输出为True
Console.WriteLine(char.IsWhiteSpace(' '));//输出为True
可以通过char或者System.Char来调用
例子:
Console.WriteLine(char.ToUpper('c'));//输出的是一个大写的C
Console.WriteLine(System.Char.ToUpper('c'));//输出的是一个大写的C
现在这边会有一个问题,可能会引起一个bug,就是ToUpper,ToLower会遵循用户的地区设置,例如,char.ToUpper('i') == 'I',这句话在土耳其地区设置里就会返回False。
culture-invariant版本的方法
总会应用英语的Culture
- ToUpperInvariant
- ToLowerInvariant
例子:
//使用固定区域性的大小写规则,不依赖于区域性的设置
Console.WriteLine(char.ToUpperInvariant('i'));//输出的是大写的I
Console.WriteLine(char.ToUpper('i', CultureInfo.InvariantCulture));
char是16bit的,足够代表基本多语言平面的任何Unicode字符,如果超出这个范围,那么必须使用surrogate pairs。
string 字符串
- string是System.String的别名
- string是不可变的
- string是字符的序列
如何构建string
例子:
string s1 = "Hello";
string s2 = "First Line\r\nSecond Line";
string s3 = @"\\server\fileshare\helloworld.cs";
- 创建重复字符的字符串,例子
Console.WriteLine(new string('*', ));//输出的结果就是**********
使用string的构造函数创建一个重复指定次数的字符的字符串
- 可以从char数组构建字符串,例子
char[] ca = "Hello".ToCharArray();
string s = new string(ca);
ToCharArray的作用正好相反
- string的构造函数也被重载用来接收各种(不安全的)指针类型,目的是从像char*这样的类型创建字符串。
Null 和 空string
- 空string的长度是0
通过literal或string.Empty静态字段来创建
相等性比较的例子:
string empty = "";
Console.WriteLine(empty == ""); // True
Console.WriteLine(empty == string.Empty); // True
Console.WriteLine(empty.Length == ); // True
- string可以为null,因为是引用类型
string nullString = null;
Console.WriteLine(nullString == null); // True
Console.WriteLine(nullString == ""); // False
Console.WriteLine(nullString.Length == ); // NullReferenceException
静态的string.IsNullOrEmpty通常用来判断字符串是否为空或者null
访问string里的字符
- 通过索引器
string str = "abcd";
char letter = str[]; // letter = 'b'
- string实现了IEnumerable<char>接口,所以可以foreach里面的插入元素
// 分别依次输出字符1 、2 、3
foreach (var item in "")
{
Console.WriteLine(item);
}
在string里进行搜索
最简单的方法包括:StartsWith,EndsWith和Contains。返回的是true或者false。
Console.WriteLine("HelloWorld.cs".EndsWith(".cs")); // 返回结果为True
Console.WriteLine("HelloWorld.cs".Contains("World")); // 返回结果为True
Console.WriteLine("HelloWorld.cs".EndsWith(".CS")); // 返回结果为False
Console.WriteLine("HelloWorld.cs".Contains("world")); // 返回结果为False
StartsWith,EndsWith的重载方法允许你指定一个StringComparison枚举或一个CultureInfo对象,以便控制大小写和区域文化的敏感性,默认使用当前本地化的区域设置(locale),并且区分大小写。
Console.WriteLine("HelloWorld.cs".StartsWith("hello", StringComparison.InvariantCultureIgnoreCase)); // 返回结果为True
Contains没有提供类似的重载方法,但是你可以使用IndexOf方法,它会返回给定字符/子字符串在被搜索字符串里的首个位置。
同时,IndexOf提供了重载方法,它可以接收一个起始位置参数(开始搜索的索引值),以及一个StringComparison枚举
Console.WriteLine("abcde".IndexOf("cd")); // 结果为2
Console.WriteLine("abcde abcde".IndexOf("CD", , StringComparison.CurrentCultureIgnoreCase)); // 结果为8
LastIndexOf,它和IndexOf类似,但是它是反向搜索
IndexOfAny,它会返回一组字符里任意一个元素的第一个匹配的位置。
Console.WriteLine("abc,de f".IndexOfAny(new char[] { ' ', ',' })); // 结果为3
Console.WriteLine("sdgp5jesu5fa9afe0".IndexOfAny("".ToCharArray())); // 结果为4
LastIndexOfAny,功能类似,方向相反
操纵/控制 string
因为string是不可变的,所以所有操纵string的方法返回的都是一个新的string,原来的string是原封不动的。
Substring,会抽取字符串的一部分出来。
string left3 = "".Substring(, ); // 结果就是123
string mid3 = "".Substring(, ); // 结果为234
//如果忽略长度,那么就从起始位置一直到字符串的最后
string end3 = "".Substring(); // 结果为345
Insert、Remove,在指定的位置插入、移除字符串。
string s1 = "helloworld".Insert(, ","); // 结果为hello,world
string s2 = s1.Remove(, ); // 结果为helloworld
PadLeft、PadRight,会使用指定的字符(没有指定就是空格)填充string,以达到指定的长度(如果string原本长度就长于指定的长度,那么它就不变)。
Console.WriteLine("".PadLeft(, '*')); // 输出结果就是*****12345
Console.WriteLine("".PadLeft()); // 输出结果就是 12345
TrimStart,TrimEnd从开始或结尾移除指定的字符(默认是空白符:空格,tab,换行以及Unicode里相应的变种)。
Trim,会把开始和结尾的空白字符都移除。
Console.WriteLine(" abc \r\n ".Trim().Length); // 结果为3
Replace,替换所有指定的字符/字符串,(非重叠的)。
Console.WriteLine("hello world".Replace(" ", " | ")); // 结果为hello | world
Console.WriteLine("hello world".Replace(" ", "")); // 结果为helloworld
ToUpper,ToLower,返回string的大/小写等等效形式。默认情况下也遵循用户当前的语言设定,与上面的char的方法一样,不再赘述。
拆分、合并字符串
Split方法可以拆分字符串。
- 默认使用空格作为分隔符
- 重载方法可以接收param字符数组,或string作为分隔符
- 可选接收StringSplitOptions枚举作为参数,有个选项可以移除空的字符串
string[] words = "my name is bob".Split();
//打印结果依次输出my name is bob四个单词
foreach (var item in words)
{
Console.WriteLine(item);
}
string[] split1 = "123-abc".Split('-');
//打印结果依次输出123和abc两个字符串
foreach (var item in split1)
{
Console.WriteLine(item);
}
string[] split2 = "123-abc-".Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
//打印结果依次输出123和abc两个字符串,最后一个空项会被移除
foreach (var item in split2)
{
Console.WriteLine(item);
}
Join(静态)方法功能与Split相反,用于合并成一个字符串,它需要一个分隔符和字符串数组。
string[] words = "my name is bob".Split();
Console.WriteLine(string.Join(",", words)); // 输出结果为一个字符串my,name,is,bob
Concat(静态)方法,和Join类似,但是只接收params string数组作为参数,无需分隔符。和+的效果一样,起始编译器就是把它翻译成+。
string str1 = string.Concat("hello", "world"); // 结果为helloworld
string str2 = "hello" + "world"; // 结果为helloworld
String.Format 和 复合格式的string
Format(静态)方法,提供了一个方便的方式来构建嵌入变量的字符串,嵌入的变量/值可以是任何类型,Format会调用它们的ToString方法。
含有嵌入变量的string就叫做复合格式string(composite format string)。
当你调用String.Format的时候,你就得传入一个复合格式string,后边跟着它里面嵌入的这些变量。
string composite = "ab{0}cd{1}e";
Console.WriteLine(string.Format(composite, "", )); // 结果为ab123cd456e
大括号里的每个数字都叫做格式化项(format item),数值对应参数(argument)的位置,并且后边可以跟着:
- 一个逗号,和一个要应用的最小宽度(通常用来对齐列,负数表示左对齐,正数表示右对齐)
- 一个冒号,和一个格式化字符串(format string)
string composite = "Name={0, -20} Credit Limit={1,15:C}";
Console.WriteLine(string.Format(composite, "Bob", ));
Console.WriteLine(string.Format(composite, "Elizatech", ));
结果如下:
从C#6开始,你可以使用字符串插值的方式(interpolated string literals)。
int value = ;
Console.WriteLine($"abc{value}"); //结果为abc32
C#中的char和string的使用简介的更多相关文章
- 探究 C# 中的 char 、 string(一)
目录 探究 C# 中的 char . string(一) 1. System.Char 字符 2. 字符处理 3. 全球化 4. System.String 字符串 4.1 字符串搜索 4.2 字符串 ...
- C++ 中int,char,string,CString类型转换
1. c++中string到int的转换 1) 在C标准库里面,使用atoi: #include <cstdlib> #include <string> std::stri ...
- C++ 中 int,char*,string,CString之间相互转换-整理
<多字符集下> #include <string> //使用C++标准库的string类时, 定义时 std::string str; using namespace std; ...
- c#中 uint--byte[]--char[]--string相互转换汇总
原文:c#中 uint--byte[]--char[]--string相互转换汇总 在在做一些互操作的时候往往需要一些类型的相互转换,比如用c#访问win32api的时候往往需要向api中传入DWOR ...
- Java中char和String 的深入理解 - 字符编码
开篇 https://blog.csdn.net/weixin_37703598/article/details/80679376 我们并不是在写代码,我们只是将自己的思想通过代码表达出来! 1 将思 ...
- Java中char和String的相互转换
转自:http://blog.csdn.net/yaokai_assultmaster/article/details/52082763 Java中char是一个基本类型,而String是一个引用类型 ...
- JAVA中char和String/值类型和引用类型的区别
import java.util.*; class test { public static void main(String[] args) { char a[] = {'b', 'a', 'c'} ...
- c++ 中 char 与 string 之间的相互转换问题
第一部分: 将 char * 或者 char [] 转换为 string 可以直接赋值,转换. 第二部分: 将 string 转换为 char * 或者 cha ...
- C# 中的 bool、char 和 string 类型
上一篇(地址:https://www.vinanysoft.com/c-sharp-basics/data-types/fundamental-numeric-types/)只介绍了基本数值类型,本篇 ...
随机推荐
- java小项目——抽奖系统
来了来了!这不又到考试周了吗!愁人,又得复习,复习,复习!这段时间每天都在复习线代和高数!(说是复习,说实话其实是在预习,啊哈哈哈哈哈),得有一段时间都没有学到新的知识了,代码感觉都生疏了,惆怅.博客 ...
- 定时任务Cron
Linux系统中的定时任务cron,一个很实际很有效很简单的一个工作,在日常的生产环境中,会被广泛使用的一个组件.通过设置时间.执行的脚本等内容,能够让系统自动的执行相关任务,很是方便. cron定时 ...
- 搞定ReentrantReadWriteLock 几道小小数学题就够了
| 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ...
- 写给.NET开发者的Python教程(一):引言
距离上一篇博文已过去8个月了,这段时间发生了很多事情导致没能持续更新博客.这段时间除了工作繁忙,业余时间都投入到AI技术的学习中,后面一段时间将会给大家分享我作为一个.NET开发人员在深度学习领域学习 ...
- SQL语句中where 1=1的意义
我们在看别人项目的时候,很多时候看到这样的SQL语句: select * from user where 1=1 其中这个where1=1是有特殊意义的,包含以下两种情境:动态SQL拼接和查询表结构. ...
- 【草稿】自定义ASP.NET MVC Html辅助方法
https://www.cnblogs.com/myshell/archive/2010/05/09/1731269.html 在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其 ...
- .Net: C#中的委托(Delegate)和事件(Event)
委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 是太容易了,而没有过去的人每次 ...
- 逻辑式编程语言极简实现(使用C#) - 2. 一道逻辑题:谁是凶手
本系列前面的文章: 逻辑式编程语言极简实现(使用C#) - 1. 逻辑式编程语言介绍 这是一道Prolog经典的练习题,中文翻译版来自阮一峰的文章<Prolog 语言入门教程>. 问题 B ...
- 探讨NET Core数据进行3DES加密或解密弱密钥问题
前言 之前写过一篇<探讨.NET Core数据进行3DES加密和解密问题>,最近看到有人提出弱密钥问题,换个强密钥不就完了吗,猜测可能是与第三方对接导致很无奈不能更换密钥,所以产生本文解决 ...
- Python Java 快速配置环境变量(Path)
Python Java 快速配置环境变量(Path) 最近系统被重置,清空了C盘中的program等文件夹以及初始化了环境变量. 通常环境下,在windows环境中我们都会打开"环境变量&q ...