Массив не существует в текущем контексте
только начал изучать C# и столкнулся с такой проблемой. Пытаюсь объединить два массива в один, но к сожалению, в методе MethodUnion он их не видит. Почитал про - "область видимости", но чего-то до конца, так видимо и не понял.
internal class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Input number");
MethodNumbers();
Console.WriteLine("____");
Console.WriteLine("____");
ContinuationCheck();
Console.WriteLine("____");
Console.WriteLine("Input Name");
MethodName();
Console.WriteLine("____");
Console.ReadKey();
}
public async static void MethodNumbers()
{
long[] arrayNumber = new long[3];
string patch = "D:/text.txt";
char plas = '+';
for (int i = 0; i < arrayNumber.Length; i++)
{
string number = Console.ReadLine();
number = number.Trim(plas);
long.TryParse(number, out long truNumber);
if (number.Length==11)
{
arrayNumber[i] = truNumber;
Console.WriteLine(arrayNumber[i]);
using (StreamWriter writer = new StreamWriter(patch, true))
{
await writer.WriteAsync(number);
}
}
else
{
Console.WriteLine("No right number");
break;
}
}
}
public static void ContinuationCheck()
{
Console.WriteLine("Do you want to continue?");
string yes = Console.ReadLine();
if (yes=="yes")
{
MethodNumbers();
}
else if (yes=="no")
{
Console.WriteLine("NT!");
}
else
{
Console.WriteLine("Error");
ContinuationCheck();
}
}
public static void MethodName()
{
string[] arrayName = new string[3];
// this.arrayName=arrayName;
for (int i = 0; i < arrayName.Length; i++)
{
string name = Console.ReadLine();
arrayName[i] = name;
Console.WriteLine(name);
}
}
public static void MethodUnion()
{
var arrayUnion=new object[3];
for (int i = 0; i < arrayName.Length; i++)
{
var arrayUnion = arrayNumber.Take(i).Concat(arrayName.Take(i));
}
}
}
//исправление ошибок
введите сюда код
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello");
User user = new User(number, name);
Console.WriteLine(user.Number);
Console.ReadLine();
}
}
public class User
{
public string number;
public string name;
public string Name
{
get
{
return name;
}
}
public string Number
{
get
{
return number;
}
}
public User() { }
public User(string Name, string number)
{
number = Number;
number = Console.ReadLine();
Console.WriteLine(Number);
}
}
Что-то трудновато идут свойства и конструкторы
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello");
User user = new User();
User userr = new User(user.Name, user.Number);
Console.WriteLine("_______________");
Console.ReadLine();
}
}
public class User
{
public string number;
public string name;
public string Name
{
get
{
return name;
}
}
public string Number
{
get
{
return number;
}
}
public User() { }
public User(string Name, string Number)
{
name = Name;
number = Number;
Console.WriteLine("Name");
name = Console.ReadLine();
Console.WriteLine("Number");
number = Console.ReadLine();
Console.WriteLine(name);
Console.WriteLine(number);
Console.WriteLine("!!!!!!!!!!!!");
}
}
Ответы (2 шт):
Ответ на комментарий автора: "Смысл программы - кто-то вводит номер телефона, затем имя и это все записывается в новый массив, дальше по идеи это все будет записываться в txt файл. Я думал, что так как они в одном классе то проблем с видимость не будет. PS задачка взята из головы, просто тренируюсь писать код."
Давайте тогда проанализируем поставленную задачу: нам нужно получить от пользователя данные и как-то их сохранить.
Первое, что нужно сделать, создать класс User или Person, в котором нужно описать необходимые свойства (https://metanit.com/sharp/tutorial/3.4.php). Очевидные свойства:
string PhoneNumber { get; }
string Name { get; }
Далее, в этом классе создать конструктор (https://metanit.com/sharp/tutorial/3.35.php). Например,
public Person (string PhoneNumber, string Name) { ... (код напишите внутри сами) }
Так же, если хотите запариться, можете добавить валидацию номера телефона (https://stackoverflow.com/questions/29970244/how-to-validate-a-country-specific-phone-number)
Очевидно, что эти данные нужно где-то хранить. Но почему именно массив? Вы можете чётко сказать, сколько конкретно пользователей будет пытаться вводить свои данные? Думаю, тут лучше подойдёт List (https://metanit.com/sharp/tutorial/4.5.php). Таким образом, вам нужно будет создать List, в который с помощью метода Add() вы будете добавлять пользователей.
Итак, теперь мы сохранили наших пользователей в программе, но в задаче вы указали, что нам их нужно сохранить в текстовый файл. Конечно, я бы тут поспорил с вами, что лучше хранить такое в базе данных, но раз уж текстовый файл, то ладно.
Наиболее простой способ - сериализовать данные в JSON и вставить полученную строку в текстовый файл (https://metanit.com/sharp/tutorial/6.5.php https://metanit.com/sharp/tutorial/5.4.php).
Таким образом, мы сохраним данные в нашем файле. Для считывания этих данных нужно прочитать ту JSON строку из файла и десериализовать её (выше была ссылка на статью об этом)
Помните, что не стоит писать абсолютно всё в статике. Это крайне плохая реализация. Постарайтесь воспользоваться передачей переменных с помощью параметров в методы (https://metanit.com/sharp/tutorial/2.9.php) и там уже их использовать.
Так же, постарайтесь забыть о многопоточности и асинхронности. Не думаю, что действительно это может потребоваться. В данной задаче нет "тяжёлых процессов", которые-бы замедляли программу настолько сильно.
UPD:
public class User
{
public string Name { get; private set; } //Свойства пишутся с БОЛЬШОЙ буквы
public string Number { get; private set; }
public User(string name, string number)
{
Name = name;
Number = number;
// В конструкторе НЕ ДОЛЖНО быть сложной логики. Он должен максимально быстро отрабатывать. Все ваши Console.WriteLine и прочее - то, что здесь совершенно не должно быть
}
}
public class Program
{
static void Main()
{
string name = Console.ReadLine();
string number = Console.ReadLine();
var user = new User(name, number);
Console.WriteLine(user.Name);
Console.ReadKey();
}
}
Чтобы понять суть ошибки, надо разобраться с тем, а что же такое "контекст". В C# это по сути текущий блок кода, выделенный фигурнми скобками { }. При этом контексты не видят содержимое друг друга, исключение составляет контекст, вложенный в другой контекст, он видит содержимое старшего контекста.
Вот пример
{
контекст 1
{
контекст 2
}
}
{
контекст 3
}
К этом примере только контекст 2 видит содержимое контекста 1, больше никаких взаимоотношений между контекстами нет, контекст 3 полностью изолирован.
Для обмена данными между контекстами есть множество способов:
- Публичные статические члены в публичном контексте
- Ссылка на экземпляр объекта
- Аргументы и возвращаемые значения методов
Контексты - неотъемлемая часть языка, они позволяют разделить вам код на блоки, использовать переменные с одинаковыми именами в разных контекстах и т.д.
К примеру, есть у вас метод Main с какой-то переменной. И есть второй метод, которому надо этой переменной воспользоваться.
static void Main(string[] args)
{
int x = 42;
Print();
}
static void Print()
{
Console.WriteLine(x); // здесь ошибка, что "x не существует в данном контексте"
}
Есть 2 основных решения:
- Вынести
xв старший контекст, то есть сделать полем класса
static int x;
static void Main(string[] args)
{
x = 42;
Print();
}
static void Print()
{
Console.WriteLine(x); // работает
}
- Передать данные через аргумент вызываемого метода
static void Main(string[] args)
{
int x = 42;
Print(x);
}
static void Print(int x)
{
Console.WriteLine(x); // и это тоже работает
}