Gon*_*ing 45 .net c# string null
我很惊讶地看到一个字符串初始化为null然后在生产环境中附加了一些内容的示例.它只是闻到了错误.
我确信它会抛出一个null对象异常但这个大大减少的例子也有效:
string sample = null;
sample += "test";
// sample equals "test"
Run Code Online (Sandbox Code Playgroud)
*注意我发现的原始代码将字符串属性设置为null并在其他地方附加到它,因此涉及编译器在编译时优化掉null的答案是无关紧要的.
有人可以解释为什么这没有错误吗?
根据Leppie的回答,我使用Reflector来查看string.Concat中的内容.现在很明显为什么要进行转换(根本没有魔法):
public static string Concat(string str0, string str1)
{
if (IsNullOrEmpty(str0))
{
if (IsNullOrEmpty(str1))
{
return Empty;
}
return str1;
}
if (IsNullOrEmpty(str1))
{
return str0;
}
int length = str0.Length;
string dest = FastAllocateString(length + str1.Length);
FillStringChecked(dest, 0, str0);
FillStringChecked(dest, length, str1);
return dest;
}
Run Code Online (Sandbox Code Playgroud)
**注意:我正在研究的具体实现(在Microsoft的.Net库中)不会像C#标准和大多数答案所建议的那样转换为空字符串,而是使用一些测试来简化该过程.最终的结果就像它一样,但你去了:)
lep*_*pie 47
+
字符串的运算符只是简写,在串联之前string.Concat
简单地将null
参数转换为空字符串.
更新:
string.Concat的通用版本:
public static string Concat(params string[] values)
{
int num = 0;
if (values == null)
{
throw new ArgumentNullException("values");
}
string[] array = new string[values.Length];
for (int i = 0; i < values.Length; i++)
{
string text = values[i];
array[i] = ((text == null) ? string.Empty : text);
num += array[i].Length;
if (num < 0)
{
throw new OutOfMemoryException();
}
}
return string.ConcatArray(array, num);
}
Run Code Online (Sandbox Code Playgroud)
相关引文应为ECMA- 334§14.7.4:
字符串连接:
Run Code Online (Sandbox Code Playgroud)string operator +(string x, string y); string operator +(string x, object y); string operator +(object x, string y);
+
当一个或两个操作数是类型时,二元运算符执行字符串连接string
.如果字符串连接的操作数是null
,则替换空字符串.否则,通过调用ToString
从类型继承的虚方法,将任何非字符串操作数转换为其字符串表示形式object
.如果ToString
返回null
,则替换空字符串.
归档时间: |
|
查看次数: |
12996 次 |
最近记录: |