惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Spread Privacy
Spread Privacy
T
The Exploit Database - CXSecurity.com
Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy & Cybersecurity Law Blog
L
LINUX DO - 热门话题
T
Threat Research - Cisco Blogs
T
Tenable Blog
TaoSecurity Blog
TaoSecurity Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
AI
AI
P
Proofpoint News Feed
A
About on SuperTechFans
P
Privacy International News Feed
月光博客
月光博客
雷峰网
雷峰网
S
Secure Thoughts
博客园 - 叶小钗
博客园 - 聂微东
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Project Zero
Project Zero
The Cloudflare Blog
SecWiki News
SecWiki News
The Hacker News
The Hacker News
V
Vulnerabilities – Threatpost
罗磊的独立博客
A
Arctic Wolf
阮一峰的网络日志
阮一峰的网络日志
Know Your Adversary
Know Your Adversary
酷 壳 – CoolShell
酷 壳 – CoolShell
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Troy Hunt's Blog
The Last Watchdog
The Last Watchdog
Schneier on Security
Schneier on Security
小众软件
小众软件
有赞技术团队
有赞技术团队
博客园 - 司徒正美
T
Tailwind CSS Blog
量子位
C
Cybersecurity and Infrastructure Security Agency CISA
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hugging Face - Blog
Hugging Face - Blog
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
Security @ Cisco Blogs
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
L
Lohrmann on Cybersecurity

博客园 - 白白

Avril lavigne - Girlfriend(mv) ASP.NET 2.0 - Enter Key - Default Submit Button - 白白 圣射手双修心得 圣射手技能 Event事件详解 用Javascript实现Agent(实现右键菜单)(2) - 白白 - 博客园 用Javascript实现Agent(网页精灵)(1) 利用vml制作统计图全攻略----饼图的制作(四) 利用vml制作统计图全攻略----饼图的制作 (三) 利用vml制作统计图全攻略----饼图的制作 (二) 利用vml制作统计图全攻略----饼图的制作(一) (Tip)教你通过windows的正版验证 GML、SVG、VML的比较 AJAX七宗罪(转) AJAX(转) HTML中字符实体集 ASCII码表 关于potentially dangerous Request.Cookies value的解决 C#来创建和读取XML文档
最佳实践:string对象(string.empty与""的区别到底是什么呢?)
白白 · 2006-01-02 · via 博客园 - 白白

基本说明

string是不可变得对象。

所以字符串连接操作并不更改当前字符串,只是创建并返回新的字符串,速度慢。

所以string有独特的Intern/IsInterned方法

对字符串运算前要检查字符串是否为null

null意味着字符串没有赋值,没有分配内存。

检查一个字符串是否为空字符串

使用Length来检查一个字符串是否为空。

计算Length时,只需要检查内部数组的长度,不需要字节比较。

字符串连接

频繁进行字符串连接操作时,使用StringBuilder类来改善性能,连接操作越频繁,差别越明显。

StringBuilder 具有多个构造函数,可以从字符串初始化对象并设置其容量和最大容量。(默认的最大容量约为 20 亿个字符)对象的容量可以根据需要调高,只要不超过最大容量即可。构造 StringBuilder 之后,就不能再调整其最大容量。

频繁进行字符串连接操作用时用StringBuilder速度快是指如下形式。

private void TestA()

{

    string test = "";

    for(int i=0; i < 100000; i++){test = test + "Test";}

}

private void TestB()

{

    StringBuilder sb = new StringBuilder();

    for(int i=0; i < 100000; i++){sb.Append("Test");}

}

TestB >> TestA

不是指如下形式

private void TestC()

{

    for(int i=0; i < 100000; i++){

        StringBuilder sb = new StringBuilder();

sb.Append("A");

sb.Append("B") ;

        sb.Append("C") ;

        }

}

private static void TestD()

{

    for(int i=0; i < 100000; i++)

    {

        string test;

test = "A" + "B" + "C";

    }

}

TestD > TestC

比较字符串

String.Equals方法来比较两个字符串

空字符串

String.Empty表示空字符串,不要用””String.Empty的定义为public static readonly string Empty编译时会转化成””,但是String.Empty是一个常数,””是一个字符串对象,对字符串对象进行运算总是很慢的。(说法值得考证)

Unicode表示字符串

\U + 字符串的unicode编码,比如\U0066b

Clone字符串

因为字符串是不可改变的,所以具有相同值的两个单独字符串并没有多大意义。所以,虽然 String 实现了 IClonable,但 String.Clone 只返回对相同字符串的引用,而不进行克隆。

使用静态方法 Copy可以创建字符串的副本

字符串转换

string实现了IConvertible,但是没有办法从外部访问IConvertible定义的Toxxx函数,(声明为private)但是需要用Convert 类中的 To... 方法将字符串转换为其他内置值类型

字符串比较

值比较

string是对象,但是string重载了==运算符,所以==运算符实际调用 String.Equals

如果您希望使用 C# 比较引用,可以将两个字符串引用都强制转换为 Objectreturn (Object)s1 == (Object)s2;

或者使用 Object.ReferenceEquals

Intern/IsInterned

因为string是不可变得对象,.NET 运行时在应用程序域中保留了一个字符串常值池。当它将一个程序集加载到应用程序域中时,将该程序集的字符串常值与应用程序域的字符串常值池合并,从而避免了字符串常值的重复。(这样所有字符串常值只有一个副本,就可以对字符串常值进行引用比较,而且因为引用只需比较地址即可,所以比值比较快得多。)

可以使用静态方法 Intern该方法将字符串添加到常值池中,还可以使用静态 IsInterned 方法检查字符串是否已经位于池中。

GetHashCode

String 中,Equals 被覆盖, GetHashCode 也被覆盖。