Это потому, что вы не заполняете массив. В методе вы заменяете значение (ссылка на массив), хранящееся локальной переменной Number
с совершенно новым массивом. Очевидно, такое изменение не может оставаться вне этого метода.
Вы можете использовать Array.Copy
или передать Number
в ref
:
Array.Copy(Input.ToCharArray(), Number, 3);
или
public static void SetNumber(string Input, ref char[] Number)
{
Number = Input.ToCharArray();
}
, а затем вызвать его следующим образом:
Util.SetNumber(Input, ref Number);
другой (вероятно, лучше) вариант здесь было бы использовать out
вместо ref
как out
не требует инициализации переменной, которую вы передаете как параметр, поэтому вам не нужно делать char [] Number = new char[3];
и можете просто использовать char [] Number;
и передать ее без дальнейшей инициализации. При этом, когда вы используете out
, у вас есть, чтобы присвоить ему значение в методе, поэтому в зависимости от того, насколько сложным он будет, что может быть или не быть выполнимо.
Here's a nice writeup on parameter passing in C#Jon Skeet (Возможно, вы видели один или два ответа от него на этом сайте).
Незначительное примечание стороны: Может быть, это преднамеренное решение, но ваши имена переменных не соответствуют правилам кода C#, в которых утверждается, что поля, параметры для методов и локальные переменные должны использовать имена camelCase
. PascalCase
зарезервирован для типов, методов и свойств.
Логично, но не C# массивы передаются по ссылке по умолчанию? Как я помню, это унаследовано от C++ –
Это ссылка, которая передается по значению. Вы можете изменить значение, которое вам нравится, но оно не будет сохраняться вне метода.Обратите внимание, что в C++ у вас будет такая же проблема, если вы просто передадите символ 'char *' - изменение этого указателя ничего не изменит вне этого метода. – Joey
Не стесняйтесь обращаться к http://pobox.com/~skeet/parameters.html, если вы думаете, что это поможет :) –