2013-06-03 4 views
0

Почему мой код Значение массива всегда содержит «0»?Значение массива Всегда «0»

 static void Main(string[] args) 
     { 
      string Input = Console.ReadLine(); 
      char[] Number = new char[3]; 
      Util.SetNumber(Input,Number); 
      foreach (char digit in Number) 
      { 
       Console.WriteLine(digit); 
      } 
      Console.ReadKey();    
     } 

Это Класс:

class Util 
    { 
     public static void SetNumber(string Input,char[] Number) 
     {    
      Number = Input.ToCharArray();     
     } 

    } 

Но если "Еогеасп" часть я положил его в Util.cs, это записать значения ..

Спасибо тебе,

ответ

7

Это потому, что вы не заполняете массив. В методе вы заменяете значение (ссылка на массив), хранящееся локальной переменной 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 зарезервирован для типов, методов и свойств.

+0

Логично, но не C# массивы передаются по ссылке по умолчанию? Как я помню, это унаследовано от C++ –

+1

Это ссылка, которая передается по значению. Вы можете изменить значение, которое вам нравится, но оно не будет сохраняться вне метода.Обратите внимание, что в C++ у вас будет такая же проблема, если вы просто передадите символ 'char *' - изменение этого указателя ничего не изменит вне этого метода. – Joey

+1

Не стесняйтесь обращаться к http://pobox.com/~skeet/parameters.html, если вы думаете, что это поможет :) –

3

Лучше реализация будет (я думаю)

class Util 
{ 
    public static char[] SetNumber(string Input) 
    { 
     return Input.ToCharArray(); 
    } 

} 

и

string Input = Console.ReadLine(); 
    char[] Number = Util.SetNumber(Input); 

    foreach (char digit in Number) 
    { 
     Console.WriteLine(digit); 
    } 
    Console.ReadKey(); 

также в исходном коде назначение char[] Number = new char[3]; можно удалить, так как вы создаете новый в своем Util классе

+0

Действительно, функции для этой цели работают намного лучше. Хотя в этом случае можно, вероятно, просто отказаться от этого метода и напрямую использовать «ToCharArray». Также имя метода не совпадает с тем, что он делает сейчас. – Joey

+0

@ Вы правы. о имени метода, но это было оригинальным. – Mzf

+0

Спасибо за решение Mzf, он работает. – user2168717

0

Вы можете избавиться от класса Util в целом

string input = Console.ReadLine(); 

foreach (var digit in input.ToCharArray()) 
{ 
     Console.WriteLine(digit);  
} 

Console.ReadKey(); 
+0

Это не отвечает на вопрос. –

+0

Мои пристрастия, я думаю, я просто добавлял к тому, что говорили другие люди –

Смежные вопросы