一、字符串
一.string.Empty
-
通过string定义一个字符串,或者通过String类来创建对象。
- 通过new String()
创建有一下几种构造函数(从元数据),以此顺序创建string; -
// // 摘要: // 将 System.String 类的新实例初始化为由 Unicode 字符数组指示的值。 // // 参数: // value: // Unicode 字符的数组。 [SecuritySafeCritical] public String(char[] value); // // 摘要: // 将 System.String 类的新实例初始化为由指向 8 位有符号整数数组的指针指示的值。 // // 参数: // value: // 一个指针,指向以 null 结尾的 8 位带符号整数数组。 // // 异常: // T:System.ArgumentNullException: // value 为 null。 // // T:System.ArgumentException: // 如果 value 是用 ANSI 编码的,则不能使用 value 初始化 System.String 的新实例。 // // T:System.ArgumentOutOfRangeException: // 要初始化的新字符串的长度过大,无法分配,该长度由 value 的 null 终止字符决定。 // // T:System.AccessViolationException: // value 指定的地址无效。 [CLSCompliant(false)] [SecurityCritical] public String(sbyte* value); // // 摘要: // 将 System.String 类的新实例初始化为由指向 Unicode 字符数组的指定指针指示的值。 // // 参数: // value: // 指向以 null 终止的 Unicode 字符数组的指针。 // // 异常: // T:System.ArgumentOutOfRangeException: // 当前进程并不是对所有编址字符都有读取权限。 // // T:System.ArgumentException: // value 指定了包含无效 Unicode 字符的数组,或者 value 指定了小于 64000 的地址。 [CLSCompliant(false)] [SecurityCritical] public String(char* value); // // 摘要: // 将 System.String 类的新实例初始化为由重复指定次数的指定 Unicode 字符指示的值。 // // 参数: // c: // 一个 Unicode 字符。 // // count: // c 出现的次数。 // // 异常: // T:System.ArgumentOutOfRangeException: // count 小于零。 [SecuritySafeCritical] public String(char c, int count); // // 摘要: // 将 System.String 类的新实例初始化为由 Unicode 字符数组、该数组内的起始字符位置和一个长度指示的值。 // // 参数: // value: // Unicode 字符的数组。 // // startIndex: // value 内的起始位置。 // // length: // 要使用的 value 内的字符数。 // // 异常: // T:System.ArgumentNullException: // value 为 null。 // // T:System.ArgumentOutOfRangeException: // startIndex 或 length 小于零。- 或 -startIndex 和 length 之和大于 value 中的元素数。 [SecuritySafeCritical] public String(char[] value, int startIndex, int length); // // 摘要: // 将 System.String 类的新实例初始化为由指向 8 位有符号整数数组的指定指针、该数组内的起始位置和一个长度指示的值。 // // 参数: // value: // 指向 8 位带符号整数数组的指针。 // // startIndex: // value 内的起始位置。 // // length: // 要使用的 value 内的字符数。 // // 异常: // T:System.ArgumentNullException: // value 为 null。 // // T:System.ArgumentOutOfRangeException: // startIndex 或 length 小于零。- 或 -由 value + startIndex 指定的地址相对于当前平台来说太大;即,地址计算溢出。- // 或 -要初始化的新字符串的长度太大,无法分配。 // // T:System.ArgumentException: // 由 value + startIndex 指定的地址小于 64K。- 或 -如果 value 是用 ANSI 编码的,则不能使用 value 初始化 System.String // 的新实例。 // // T:System.AccessViolationException: // value、startIndex 和 length 共同指定的地址无效。 [CLSCompliant(false)] [SecurityCritical] public String(sbyte* value, int startIndex, int length); // // 摘要: // 将 System.String 类的新实例初始化为由指向 Unicode 字符数组的指定指针、该数组内的起始字符位置和一个长度指示的值。 // // 参数: // value: // 指向 Unicode 字符数组的指针。 // // startIndex: // value 内的起始位置。 // // length: // 要使用的 value 内的字符数。 // // 异常: // T:System.ArgumentOutOfRangeException: // startIndex 或 length 小于零,value + startIndex 引起指针溢出,或者当前进程并不是对所有编址字符都有读取权限。 // // T:System.ArgumentException: // value 指定了包含无效 Unicode 字符的数组,或者 value + startIndex 指定了小于 64000 的地址。 [CLSCompliant(false)] [SecurityCritical] public String(char* value, int startIndex, int length); // // 摘要: // 将 System.String 类的新实例初始化为由指向 8 位有符号整数数组的指定指针、该数组内的起始位置、长度以及 System.Text.Encoding // 对象指示的值。 // // 参数: // value: // 指向 8 位带符号整数数组的指针。 // // startIndex: // value 内的起始位置。 // // length: // 要使用的 value 内的字符数。 // // enc: // 一个对象,用于指定如何对 value 所引用的数组进行编码。如果 enc 为 null,则假定以 ANSI 编码。 // // 异常: // T:System.ArgumentNullException: // value 为 null。 // // T:System.ArgumentOutOfRangeException: // startIndex 或 length 小于零。- 或 -由 value + startIndex 指定的地址相对于当前平台来说太大;即,地址计算溢出。- // 或 -要初始化的新字符串的长度太大,无法分配。 // // T:System.ArgumentException: // 由 value + startIndex 指定的地址小于 64K。- 或 -未能使用 value 初始化 System.String 的新实例,假定 value // 按照 enc 的指定进行编码。 // // T:System.AccessViolationException: // value、startIndex 和 length 共同指定的地址无效。 [CLSCompliant(false)] [SecurityCritical] public String(sbyte* value, int startIndex, int length, Encoding enc);
View Code
-
char []cstr = { 'a','b','c','d','e'}; char cstr1 = 'a'; sbyte se = 113; String a = new String(cstr); // String b = new String(&cstr1); String c = new String(&se); String d = new String('d',2); String e = new String(cstr,2,3); String f = new String(&se,0,1); Console.WriteLine((int)Convert.ToChar(f)+"n");//113 String g = new String(&se,0,1,Encoding.UTF8); Console.WriteLine("a:{0}nb:{1}nc:{2}nd:{3}ne:{4}nf:{5}ng:{6}",a,b,c,d,e,f,g);
View Code
- 通过new String()
-
string是C#基元类型(primitive),string简单来说就是编译器直接支持的数据类型。运算符(==
和 !=)是为了比较 string 对象的值, 而不是比较引用- string a = “1234”;
string b = "123"; b += "4"; Console.WriteLine(a == b);//比较值 Console.WriteLine((object)a == (object)b);//比较引用()
- string a = “1234”;
-
string连接操作 (+=)
- 缺点很明显, 操作频繁的话十分浪费内存空间的
- 使用StringBuilder类对象方法append代替+=, 性能还有所提升
- null,” “和string.Empty的区别
- null表示不引用任何变量的空引用的值,null是引用变量的默认值,
值类型变量无法使用 - ””表示分配一个内存为空的存储空间。
- string.Empty表示空字符串,并且不分配内存空间。
- null表示不引用任何变量的空引用的值,null是引用变量的默认值,
- 判断字符串为空 的俩种方法
- x.length==0 // 无法判断为null的字符串
- string.IsNullOrEmpty(x)
string.Empty就相当于 “” ,一般用于字符串的初始化 ,
比如: string a; Console.WriteLine(a);//这里会报错,因为没有初始化a
而下面不会报错: string a=string.Empty; Console.WriteLine(a);
或者用于比较: if(a==””) if(a==string.Empty) 上面两句是一样的效果。
二.String.IsNullOrEmpty 方法
String.IsNullOrEmpty(value)
指示指定的字符串是 null 还是 Empty 字符串。 能同时测试 String 是否为
null 或其值是否为 Empty 等价于 result = (value) == null || (value) ==
String.Empty;
参数 value :类型:System.String ,要测试的字符串。
返回值 类型:System.Boolean, 如果 value 参数为 null 或空字符串
(“”),则返回 true;否则返回 false。
三.Nullable可空类型
Nullable<Int32>,读作“可空的 Int32”,可以被赋值为 -2147483648 到
2147483647 之间的任意值,也可以被赋值为 null 值。
Nullable<bool> 可以被赋值为 true 或 false,或
null。在处理数据库和其他包含可能未赋值的元素的数据类型时,将 null
赋值给数值类型或布尔型的功能特别有用。
例如,数据库中的布尔型字段可以存储值 true 或
false,或者,该字段也可以未定义。
可空类型具有以下特性: ·可空类型表示可被赋值为 null
值的值类型变量。无法创建基于引用类型的可空类型。(引用类型已支持 null
值。)。
·语法 T? 是 System.Nullable<T> 的简写,此处的 T
为值类型。这两种形式可以互换。 ·
为可空类型赋值与为一般值类型赋值的方法相同,如 int? x = 10; 或 double? d
= 4.108;。
·如果基础类型的值为 null,请使用 System.Nullable.GetValueOrDefault
属性返回该基础类型所赋的值或默认值,
例如 int j = x.GetValueOrDefault(); ·请使用 HasValue 和 Value
只读属性测试是否为空和检索值,例如 if(x.HasValue) j = x.Value;
如果此变量包含值,则 HasValue 属性返回
True;或者,如果此变量的值为空,则返回 False。 如果已赋值,则 Value
属性返回该值,否则将引发 System.InvalidOperationException。
可空类型变量的默认值将 HasValue 设置为 false。未定义 Value。 ·使用 ??
运算符分配默认值,当前值为空的可空类型被赋值给非空类型时将应用该默认值,
如 int? x = null; int y = x ?? -1;。
·不允许使用嵌套的可空类型。将不编译下面一行:Nullable<Nullable<int>>
n;
程序代码
class NullableExample
{
static void Main()
{
int? num = null;