编程语言里 string a=\\和string b=null的区别是:string a = “”用空字符串创建了一个新的字符串实例,其内容为空字符串。string b = null将这个变量设置为Null Reference,它不引用任何对象。
一、编程语言里 string a=\\和string b=null的区别
string a = “”用空字符串创建了一个新的字符串实例,其内容为空字符串。
string b = null将这个变量设置为Null Reference,它不引用任何对象。
a引用了一个确实存在的字符串,只是它的内容是空的,你可以调用String类型上的所有方法。而b现在没有引用任何字符串,你可以理解b现在是一个空指针,你通过b无法调用任何方法,因为它没有引用一个确切存在的对象。
生动形象版:你家门口有两个收件箱,一个里面塞了一张白纸,另一个里面什么都没有。就算是白纸,你也可以拿起来看看是什么东西,你可以骂两句,也可以拿回去写几笔,但是里面什么都没有的话,你就什么都不能做了。
扩展阅读话多版:
有以下C#代码:
static void Main(string[] args)
{
string a = “”;
string b = null;
string c = string.Empty;
}
生成后使用ILDASM查看IL:
.entrypoint
// 代码大小 16 (0x10)
.maxstack 1
.locals init ([0] string a,
[1] string b,
[2] string c)
IL_0000: nop
IL_0001: ldstr “”
IL_0006: stloc.0
IL_0007: ldnull
IL_0008: stloc.1
IL_0009: ldsfld string [mscorlib]System.String::Empty
IL_000e: stloc.2
IL_000f: ret
} // end of method Program::Main
简单来说就是,通过ldstr将””给a,对b使用ldnull,对c使用ldsfld
ldstr的作用是:
Pushes a new object reference to a string literal stored in the metadata.
将指向保存在元数据中的字符串字面量的一个新的对象引用推入栈中。
此时这里的字面量就是一个空字符串。那么我们的a就引用的是这个空字符串。
ldnull的作用是:
Pushes a null reference (type O) onto the evaluation stack.
将空引用推入栈中。
微软的文档中提到它”用于在被填充数据前初始化位置或是在其被弃用时使用“。我们此时无法调用任何方法,就相当于只是占了个坑,并没有引用可用的字符串,而且本身null是独立于类型的,它代表不了任何类型,自然也不能代表一个空字符串。
ldsfld的作用是:
Pushes the value of a static field onto the evaluation stack.
将静态字段的值推入栈中。
在这里就是把String.Empty的值给了c。
实际上String.Empty就是代表了空字符串,也就是””,因此a和c两者的初始化可以说是等价的。并且StackOverflow上的这个回答也印证了这一点。
C#中的string是一个关键字,它等价于System.String。
String还有一个方法叫做IsNullOrEmpty,它在字符串变量引用的值为””或者null的时候都返回true,可以很好的的检验一个字符串类型变量到底有没有内容(当然如果只有有一堆空格和其他的不可见字符就不能只用这个方法了)。
延伸阅读:
二、字节(Byte)是什么
字节(Byte)是存储数据的基本单位,并且是硬件所能访问的最小单位。前面说过,CPU 只能直接处理内存数据,不能直接处理硬盘数据。硬盘数据必须先调入内存条中才可以运行。内存中存储数据的最小单位是“位(Bit)”。字节是存储数据的基本单位,位是存储数据的最小单位,不要混淆了。
内存里面存放的全是二进制代码。内存里面有很多“小格子”,每个“格子”中只能存放一个 0 或 1。一个“小格子”就是一位,所以“位”要么是 0,要么是 1,不可能有比位更小的单位。那么字节和位是什么关系呢?8 个“小格子”就是一字节,即一字节等于 8 位。
以上就是关于编程语言里 string a=\\ 和 string b=null 有什么区别的内容希望对大家有帮助。