C#扫盲之:String字符串的常用方法和冷知识
前言
字符串对于任何编程语言都是必须操作和了解的,因为在实际编程中,任何项目和工程都必须要处理字符串数据,文件路径、提示消息,文本的处理等等,而在使用过程中很多人都是没有系统的了解,大量使用string,其实string的大量使用会造成很大的性能消耗,这跟.NET平台对字符串的处理有很大的关系,而.NET对字符串的支持还是很丰富的。不管是面试亦或者是实际编程使用,总结一下知识很有必要。
1.使用字符串数据
String提供了大量很多工具类,包括返回字符串长度、查找当前字符串中的字符串、转换大小写等方法,下图是String部分重要定成员
| 属性/方法 | 描述 |
| Length | 获取当前 System.String 对象中的字符数 |
| Compare() | 比较两个指定的 System.String 对象,返回一个整数标识二者之间的大小 |
| Concat() | 连接字符串 |
| Contains() | 判断当前字符串是否包含指定的一组字符串 |
| Equals() | 判断字符串是否与指定的字符串相等 |
| Format() | 格式化字符串 |
| Insert() | 插入字符串 |
| PadLeft() PadRight() |
向左填充/向右填充 |
| Remove() | 从指定位置移除字符串 |
| Replace() | 替换指定支付为新对象 |
| Split() | 返回当前字符串由指定分割符分割的数组 |
| StartsWith() | 判断当前字符串是否由指定字符开始 |
| Substring() | 提取当前字符串的子字符串 |
| ToCharArray() | 转换成字符数组 |
|
ToLower() |
将当前字符串全部转换成小写/大写 |
| Trim() | 移除当前字符串头部和尾部所出现的自定字符,默认空格 |
以上就是几个比较重要的函数,有些是string类所有,有些是string对象所有
2.基本字符串操作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace StringTest
{
class Program
{
static void Main(string[] args)
{
string tmpStr = "you just come on,girl";
Printf(tmpStr.Length); //获取字符串长度
Printf(string.Compare("", ""));//比较 string str1 = "hehe";
string str2 = "haha";
Printf(str1 + str2);
Printf(string.Concat(str1, str2));//字符串拼接 Printf(tmpStr.Contains("just")); //包含关系
Printf("".Equals("123_")); //相等性
Printf(string.Format("{0} is great?but the {2} doesn't agree with{1}.", "xiaoMing", "xiaoHua", "her"));//格式化 tmpStr.Insert(, "insert"); //从字符3位置插入字符串"insert"
Printf(tmpStr); string intStr = "";
Printf(intStr.PadLeft(, '')); //设置字符串总长度未2,若原字符串长度不足则自动填'0'
Printf(intStr.PadLeft(, '')); //若字符串原长度超过2,则返回原字符串 string removeStr = "ha123hahhahhah12313";
removeStr.Remove(, ); //移除(从第3个字符串开始移除5个字符)
Printf(removeStr); string replaceStr = "xioaming";
replaceStr.Replace('o', 'M'); //替换(将源字符串中o替换成M) string splitStr = "xiaoming,xiaohua,xiaocao_xiaomao";
string[] splitArry = splitStr.Split(',', '_');//指定分割字符,分割源字符串返回字符串数组
foreach (string tmpstring in splitArry)
{
Console.Write(tmpstring + "");
}
string startStr = "heihieie";
bool isStartCondition = startStr.StartsWith("he", StringComparison.OrdinalIgnoreCase);//判断是否以字符串是否以“he”开始,并设置条件是按排序规则忽略大小写
bool isStart = startStr.StartsWith("he");
Printf(isStartCondition);
Printf(isStart); string subStr = "12341234xiangshouge";
Printf(subStr.Substring(, )); //从第11个字符开始获取2个字符, char[] charArry = subStr.ToCharArray();//转换成字符串
Printf(charArry.ToString()); string lowerStr = "xiaoming";
Printf(lowerStr.ToUpper()); //转换成大写
string uperStr="XIAOMINGHEHEDA";
Printf(uperStr.ToLower()); //转换成小写 string trimStr = " _123_heheda, ";
Printf(trimStr.Trim()); //去除字符串首尾空格,默认
Printf(trimStr.Trim(',')); Printf(trimStr.TrimStart(' ','_')); //去除字符串首部的空格和下划线
Printf(trimStr.TrimEnd(' ',',')); //去除字符串尾部,号 Console.ReadKey();
} /// <summary>
/// 打印函数
/// </summary>
static void Printf(object str)
{
Console.WriteLine(str.ToString());
}
static void Printf(int str)
{
Console.WriteLine(str.ToString());
}
}
}
输出:

3.转义字符
C#字符串字面量中可以包含各种转义字符,用来限制字符数据在输出流中的格式,转义字符为反斜杠\,常见转义字符
| 字符 | 作用 |
| \' | 在字符串中标识单引号 |
| \" | 在字符串中标识双引号 |
| \\ | 在字符串中标识\(常用于定义网络和文件路径) |
| \a | 触发一个系统警报(蜂鸣) |
| \n | 换行(windows平台上有效) |
| \r | 回车 |
| \t | 水平制表符 |
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace StringTest
{
class Program
{
static void Main(string[] args)
{
Printf("hahhehha \a");
Printf("C:\\heheda\bing");
Printf("1234\n\n\n");//添加三个空行
Printf("1231\t1231"); Console.ReadKey();
} /// <summary>
/// 打印函数
/// </summary>
static void Printf(object str)
{
Console.WriteLine(str.ToString());
}
static void Printf(int str)
{
Console.WriteLine(str.ToString());
}
}
}
输出:

4.字符串的恒定性及性能影响
在.NET中,一旦将初始值赋给字符串对象,字符数据就不会改变了,不仔细了解还很疑惑,其实所有对string类型的方法操作都是返回一个新的字符串对象,所以这也就是为什么不能大量使用string类型的原因,特别是在考虑性能的程序和项目中,更应该注意减少使用string类型。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace StringTest
{
class Program
{
static void Main(string[] args)
{
//设置初始字符串值
string s1 = "this is my stringtest";
Console.WriteLine("s1 is={0}", s1); //大写s1
string UperStr = s1.ToUpper();
Console.WriteLine("UperStr is={0}", UperStr); Console.WriteLine("s1 is={0}", s1);//s1是大写还是小写呢?此处s1还是原来的值
Console.WriteLine("s1内存地址是否与s1.touper之后的内存地址相等:{0}", string.ReferenceEquals(s1, s1.ToUpper())); Console.ReadKey();
}
}
}
输出:

可以看到两者的内存引用控件并不相同,产生了新字符串。
字符串恒定性对性能影响分析:
class Program
{
static void Main(string[] args)
{
//设置初始字符串值
string s1 = "this is my stringtest";
s1 = "my seconde string test"; Console.ReadKey();
}
}
使用ILDasm.exe查看编译后的CIL代码如下:

通过产看CIL代码可以看到程序多次使用ldstr操作码,它表示的是加载字符串,也就是在托管堆上申请空间并分配值,s1再被重新赋值时,旧的临时字符串"this is my stringtest“就会失效,s1指向了新的引用"my seconde string test",而1处支付串最终会被GC管理器回收。这种字符串在也就是说在程序中若存在多个不同的字符串,则会进行多次加载,大量的使用string类型将会变得低效,并导致代码膨胀,特别是进行字符串拼接的时候,这是因为编译器在编译写元数据时候回多次加载不同的字符串常量。
所以在大量处理文本数据的时候,建议使用StringBulder操作字符串,因为StringBulder对象直接在内存对象上对字符串对象进行修改,这样不会产生新的副本,使程序变得高效,StringBulder的详细讨论,本文暂时搁置。
由于本人才学识浅,描述难免纰漏,如有错误,欢迎指出。么么!
C#扫盲之:String字符串的常用方法和冷知识的更多相关文章
- Java中的String字符串及其常用方法
字符串(String) 文章目录 字符串(String) 直接定义字符串 常用方法 字符串长度 toLowerCase() & toUpperCase()方法 trim()方法去除空格 判空 ...
- String字符串的常用方法
1.substr():可在字符串中抽取从 start 下标开始的指定数目的字符. stringObject.substr(start,length) start:必需.要抽取的子串的起始下标.必须是数 ...
- java中String字符串
一.定义String字符串 String字符串和char字符不同,char使用单引号,只能表示一个字符,字符串就是一段文本.String是个类.这个类使用final修饰,所以这个类是不可以继承扩充和修 ...
- Java String类的常用方法
String(byte[ ] bytes):通过byte数组构造字符串对象. String(char[ ] value):通过char数组构造字符串对象. String(Sting original) ...
- Java String字符串/==和equals区别,str。toCharAt(),getBytes,indexOf过滤存在字符,trim()/String与StringBuffer多线程安全/StringBuilder单线程—— 14.0
课程概要 String 字符串 String字符串常用方法 StringBuffer StringBuilder String字符串: 1.实例化String对象 直接赋值 String str=& ...
- Java基础(30):String对象的常用方法与实例(String类)
Java 中 String 类的常用方法 Ⅰ String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等,下面我们就来领略它的强大之 ...
- 03-Java String字符串详解
1.Java字符串String A.实例化String字符串:直接赋值(更合理一些,使用较多).使用关键字new. B.String内容的比较 // TODO Auto-generated metho ...
- Javascript中String、Array常用方法介绍
string和array作为javascript内置对象,其中许多方法无论是在开发过程中,还是在面试的时候都有机会被面试官问到,这里对经常用到的方法做一个介绍,这些方法都有过很多的实际应用场景,所以对 ...
- C#中静态方法的运用和字符串的常用方法(seventh day)
又来到了今天的总结时间,由于昨天在云和学院学的知识没有弄懂,今天老师又专门给我们非常详细地讲了一遍,在这里非常谢谢老师.O(∩_∩)O 话不多说,下面就开始为大家总结一下静态方法的运用和字符串的常用方 ...
随机推荐
- Com和DCOM
COM,DCOM原理及应用 1.DCOM COM的进程透明特性表现在组件对象和客户程序即可以拥有各自的进程空间,也可以共享同一个进程空间,COM负责把客户的调用正确传到组件对象中,并保证参数传递的正确 ...
- ASP.NET MVC3学习心得-----表单和HTML辅助方法
5.1表单的使用 5.1.1 action和method的特性 表单是包含输入元素的容器,包含按钮.复选框.文本框等元素,表单的这些输入元素使得用户能够向页面中输入信息,并把输入信息提交给服务器.A ...
- 基于WebForm+EasyUI的业务管理系统形成之旅 -- 首页Portal界面拖拽(Ⅵ)
上篇<基于WebForm+EasyUI的业务管理系统形成之旅 -- 构建Web界面>,主要介绍系统界面布局.导出数据等. 本篇将介绍首页Portal界面拖拽. 一.首页Portal界面拖拽 ...
- [Tommas] UNION 和 UNION ALL 的区别
UNION指令的目的是将两个 SQL 语句的结果合并起来.从这个角度来看,UNION跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料.UNION的一个限制是两个 SQL 语句所产生的 ...
- Velocity介绍
Velocity是一个基于Java的模版引擎,它是一个简单并且功能强大的开发工具,你可以非常容易地创建和呈现出.在这个介绍当中,我们希望可以给出一个使用基本Velocity的概述. 使用Velocit ...
- 文件操作总结:关于文本和二进制流(typeText&typeBinary)
本人能力.精力有限,所言所感都基于自身的实践和有限的阅读.查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧. 总结: CFile,其自身是不提供缓冲区的(?但CFile又有一个Flush,这一点目 ...
- Codeforces Round #343 (Div. 2) B. Far Relative’s Problem
题意:n个人,在规定时间范围内,找到最多有多少对男女能一起出面. 思路:ans=max(2*min(一天中有多少个人能出面)) #include<iostream> #include< ...
- Windows Azure -Azure 网站、云服务和虚拟机的对比
Azure 网站.云服务和虚拟机对比 概述 Azure提供了几种方法来承载网站: Azure网站.云服务和虚拟机.本文帮助您了解选项和为您的Web应用程序做出正确选择. Azure网站是大多数web应 ...
- VS2012 C#调用C++ dll
VS2012 C#调用C++ dll 调试方法:[dll工程和调用dll的exe工程在同一个解决方案中]dll工程,属性-配置属性-调试-把 命令 为 调用该dll的exe工程的bin\Debug\* ...
- POJ3641-Pseudoprime numbers(快速幂取模)
题目大意 判断一个数是否是伪素数 题解 赤果果的快速幂取模.... 代码: #include<iostream> #include<cmath> using namespace ...