Вот подробности, описывающие, что здесь происходит:
Класс string
в .net представляет собой массив char
, начинающийся с указателя на первый char
в массиве и заканчивающийся наспециальный «терминал» char \0
.Когда вы конвертируете 00
в байт, вы получаете 0
.но 0
просто равно символу терминала \0
byte b = (byte)`\0`;\\the value of b will be 0
Так что Console.Write
будет игнорировать все символы после первого \0
!.Так будет смотреть не только консоль, но и компоненты управления.например, textBox.Text
, если вы примените к нему строку, имеющую символ \0
, он не будет отображать никаких символов после \0
«включая сам \0
».
Edit:
Из того, что я знаю, System.Diagnostics.Debug.Writeline делает что-то похожее на это:
System.Diagnostics.Debug.Write(input)
System.Diagnostics.Debug.Write("\n")
Iдогадывается, что Debug.WriteLine
не реализованы таким образом, иначе мы не заметим такого поведения.возможно, он объединяет строку с новой строкой, например input + "\n"
.
Я могу диагностировать Console.WriteLine
с помощью программы Resharper
.код:
[SecuritySafeCritical]
public virtual void WriteLine(string value)
{
if (value == null)
{
this.WriteLine();
}
else
{
int length = value.Length;
int num2 = this.CoreNewLine.Length;
char[] destination = new char[length + num2];
value.CopyTo(0, destination, 0, length);
switch (num2)
{
case 2:
destination[length] = this.CoreNewLine[0];
destination[length + 1] = this.CoreNewLine[1];
break;
case 1:
destination[length] = this.CoreNewLine[0];
break;
default:
Buffer.InternalBlockCopy(this.CoreNewLine, 0, destination, length * 2, num2 * 2);
break;
}
this.Write(destination, 0, length + num2);
}
}
Таким образом, он объединяет строковое значение с новой строкой.так что это вызовет тот же эффект.