(1)基本概念
String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。这里尝试举个不是很恰当的例子:
string S1 = "abc";
for(int I = 0 ; I < 10000 ; I ++) // for 模拟程序的多次调用
{
S1 + = "def";
S1 = "abc";
}
如果是这样的话,到这个 for 循环完毕后,如果内存中的对象没有被 GC 清理掉的话,内存中一共有 2 万多个了,惊人的数目,而如果这是一个很多人使用的系统,这样的数目就不算很多了,所以大家使用的时候一定要小心。
※
String.IsNullOrEmpty(mytext) 判断字符串是否为:null或者string.Empty。如果是如"\t"这样的字符就返回false了,为了达到判断过滤这些功能,就要使用Trim()和Length属性帮忙,判断是否长度为零,于是乎就产生了如下的方法。
String.IsNullOrWhiteSpace(mytext) 这个是判断所有空白字符,功能相当于string.IsNullOrEmpty和str.Trim().Length总和,他将字符串给Char.IsWhiteSpace为ture的任何字符都将是正确的。根据MSDN的说明,这个方法会比调用上述两个方法的性能更高而且简洁,所以在判断这个功能时,推荐使用。
using System;
public class Example
{
public static void Main()
{
string[] values = { null, String.Empty, "ABCDE",
new String(' ', 20), " \t ",
new String('\u2000', 10) };
foreach (string value in values)
Console.WriteLine(String.IsNullOrWhiteSpace(value));
}
}
// The example displays the following output:
// True
// True
// False
// True
// True
// True
(2)字符串类型
1)几种空类型的涵义
·null 没有指向,是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果 int i=null,的话,是不可以的。
·DBNULL DBNull在DotNet是单独的一个类型,该类只能存在唯一的实例,DBNULL.Value,DBNull唯一作用是可以表示数据库中的字符串,数字,或日期,为什么可以表示原因是DotNet储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。对于 DataRow ,它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。 要么就是 DBNull 。 所以 row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException。DBNull 实现了 IConvertible 。但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。
·System.String.Empty 指向一个空字符串,但不分配存储空间
·"" 指向一个空字符串,并且分配一个长度为空的存储空间
※关于String.Empty和Null的问题是这样的,这两个都是表示空字符串,其中有一个重点是string str1= String.Empty和 string str2=null 的区别,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,string str2=null,这样定义后,只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。在 C# 中,大多数情况下 "" 和 string.Empty 可以互换使用。
另:
int类型不能转化为null
string类型可以转化为null
引用类型可以转化为null
null
2)几种空类型的判断
string.IsNullOrEmpty 指示指定的字符串是否是null或System.String.Empty类型
string.IsNullOrWhiteSpace 指示指定的字符串是否是null、空还是仅由空白字符组成
※判定为空字符串的几种写法,按照性能从高到低的顺序是:s.Length == 0 优于 s == string.Empty 优于 s == ""
另:还有一种判断空类型的方法,typeof str == 'undefined'
(3)字符串操作
1)Guid码
Guid是全球唯一码的意思.很难重复的.但是没有绝对~System.Guid.NewGuid().ToString()就是实例化一个GUID并且转换为一个字符串. GUID 在数据库中的优点比自动增加(int)强.主要就是 数据迁移方便~但是在数据库中一般是 默认值(newid())对应的数据库类型是(针对sqlserver数据库)uniqueidentifier所以你的想法很好,绝对能行~
同时,相对于Random只能生成数字而言,Guid可生成字符串(ABCD-1234),Guid.NewGuid().ToString()可生成一串类似"12f5cdbd-2a6d-4ba6-a394-6961e4f5d5b5"36位的随机编码字符串,之所以这么长,是因为这样随即生成的字符串是不可能重复的.例如:
string RandomString = Convert.ToString(Guid.NewGuid());
================================================================================
可用于上传文件生成新的文件名
eg.:
string newfilename = Guid.NewGuid().ToString() +Path.GetExtension(filename);
Path.GetExtension(filename) 指定路径字符串的扩展名
1、Guid.NewGuid().ToString("N") 结果为:
38bddf48f43c48588e0d78761eaa1ce6
2、Guid.NewGuid().ToString("D") 结果为:
57d99d89-caab-482a-a0e9-a0a803eed3ba
3、Guid.NewGuid().ToString("B") 结果为:
{09f140d5-af72-44ba-a763-c861304b46f8}
4、Guid.NewGuid().ToString("P") 结果为:
(778406c2-efff-4262-ab03-70a77d09c2b5)
可见默认的为第2种效果
================================================================================
2)string补齐
DateTime.Now.Month.ToString().PadLeft(2, '0');
3)三元运算符?
(bool) ? (ValueIfTrue) : (ValueIfFalse);
例1:chkenable = this.chk_enable.Checked ? 1 : 0;
例2:a > b ? a=8 : b=9
(value != null) ? (value) : (string.Empty);
还可以更简单,变成:
value ?? string.Empty;
4)字符串的分隔
using System.Text.RegularExpressions;
string str="aaajsbbbjsccc";
string[] sArray1 = Regex.Split(str, "js", RegexOptions.IgnoreCase);
string[] sArray2 = str.Split('j');
5)字符串的连接
string str = string.Join(",", strs);
(4)String与string的区别
1)string是c#中的类,String是.net Framework的类(在c# IDE中不会显示蓝色)
2)string映射为.net Framework的String
3)如果用string,编译器会把它编译成String,所以如果直接用String就可以让编译器少做一点点工作。如果使用c#,建议使用string,比较符合规范
4)string始终代表 System.String(1.x) 或 ::System.String(2.0),String只有在前面有using System;的时候并且当前命名空间中没有名为String的类型(class、struct、delegate、enum)的时候才代表System.String
5)string是关键字,String不是,也就是说string不能作为类、结构、枚举、字段、变量、方法、属性的名称,而String可以。
(5)自定义
public class MyComparer : IComparer //也可以IComparer<T>
{
int System.Collections.IComparer.Compare(object x, object y)
{
if (x == null || y == null)
throw new ArgumentException("参数不能为空");
if (...)
return 1;
if (...)
return -1;
if (...)
return 0;
}
}
(6)一句话判断中文
str.charCodeAt(i) > 255 //中文
或
if (System.Text.Encoding.GetEncoding("gb2312").GetBytes("中").Length == 2)
GetBytes 的参数是一个长度的字符串。
(7)bool b = str.StartsWith("C", StringComparison.CurrentCultureIgnoreCase); //忽略大小写 true
bool b = txt_filename.Value.ToLower().EndsWith(".png");
(8)char == '\0 ' 空字符