Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
 Аватар для rar
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 458

Область видимости переменной

15.04.2018, 10:46. Показов 3228. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
создаю форму

есть класс

C#
1
2
3
4
5
6
7
8
9
10
namespace WF_2
{
    class TS
    {
        public string name;
        public int age;
 
    }
            
}

и код формы


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
namespace WF_2
{
 
    public partial class Form1 : Form
    {
 
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
 
        {
 
        }
     
 
        private void button1_Click(object sender, EventArgs e)
        {
 
            TS x1 = new TS();
            x1.name = "Raph";
            x1.age = 23;
 
            MessageBox.Show(x1.name.ToString());           
                        
        }
        
    }
 
}
________________________________

Вопрос: как изменить код, чтобы :
C#
1
2
3
            TS x1 = new TS();
            x1.name = "Raph";
            x1.age = 23;
был виден за пределами
C#
1
private void button1_Click(object sender, EventArgs e)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.04.2018, 10:46
Ответы с готовыми решениями:

Область видимости переменной
Привет. Скажите пожалуйста, если я объявляю новую переменную, например, внутри цикла или условия, тогда эта переменная не видна при...

Область видимости переменной в одном классе
Создал класс в котором есть три метода: class My_class { public static void Method_1() { ...

Расширить область видимости переменной, объявленной в блоке if
string s1 = "1"; if (s1 == "1") { string info = "dll"; string newurl = @"C:\Program Files...

24
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
15.04.2018, 10:59
Лучший ответ Сообщение было отмечено rar как решение

Решение

Например, TS x1 сделать полем класса формы:
C#
1
2
3
4
public partial class Form1 : Form
{
  TS x1 = new TS();
...
А в обработчике события нажатия на кнопку убрать строчку:
C#
1
TS x1 = new TS();
1
 Аватар для rar
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 458
15.04.2018, 11:09  [ТС]
Ок я вынес вот код

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
namespace WF_2
{
 
    public partial class Form1 : Form
    {
        TS x1 = new TS();
 
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
 
        {
 
        }
     
 
        private void button1_Click(object sender, EventArgs e)
        {
 
           
            x1.name = "Raph";
            x1.age = 23;
 
            MessageBox.Show(x1.name.ToString());           
                        
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show(x1.age.ToString());
        }
    }
 
}

у меня этот кусок
C#
1
2
3
4
        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show(x1.age.ToString());
        }
выводит
C#
1
x1.age.ToString()=0
, а нужно чтобы было
C#
1
x1.age.ToString()=23
(который определен в
C#
1
private void button2_Click(object sender, EventArgs e)
)
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
15.04.2018, 11:15
Ну правильно, нужные значения вносятся только лишь после нажатия кнопки button1.
Тогда нужно вынести код:
C#
1
2
x1.name = "Raph";
x1.age = 23;
например так:

C#
1
2
3
4
5
6
public Form1()
{
      InitializeComponent();
      x1.name = "Raph";
      x1.age = 23;
}
1
 Аватар для rar
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 458
15.04.2018, 11:22  [ТС]
Да ! Точно! Спасибо ...

есть еще такой вопрос... делается так или нет в C# (присвоить переменные прямо в классе..) что то вроде:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace WF_2
{
 
    class TS
    {
        public string name;
        public int age;
 
      TS x1 = new TS();
      x1.name = "Raph";
      x1.age = 23;
    }
            
}
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
15.04.2018, 11:24
C#
1
2
3
4
5
class TS
{
    public string name = "Raph";
    public int age = 23;
}
Синтаксически так возможно, тогда инициализация происходит в конструкторе по умолчанию.
0
 Аватар для rar
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 458
15.04.2018, 11:30  [ТС]
то есть здесь это

C#
1
TS x1 = new TS();
вообще не применяется ?

Добавлено через 4 минуты
написал :

C#
1
2
3
4
5
class TS
{
    public string name = "Raph";
    public int age = 23;
}
но
C#
1
2
3
4
5
6
7
        private void button1_Click(object sender, EventArgs e)
        {           
 
 
            MessageBox.Show(name.ToString());           
                        
        }
его не видит
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
15.04.2018, 11:33
Если в классе нет конструктора, он создаётся автоматически, а инициализация полей, в данном случае name и age, в нём и происходит. Это аналогично следующему конструктору:
C#
1
2
3
4
5
 public TS()
 {
     name = "Raph";
     age = 23;
 }
Цитата Сообщение от rar Посмотреть сообщение
вообще не применяется
C#
1
TS x1 = new TS();
Это создание экземпляра класса. Без него никак. Только если статическим не делать.

Если условно, то
класс - чертёж автомобиля, его спецификация.
объект (экземпляр класса) - сам автомобиль.
0
 Аватар для rar
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 458
15.04.2018, 11:36  [ТС]
Цитата Сообщение от VladPVS Посмотреть сообщение
Это создание экземпляра класса. Без него никак.

то есть запись вида


C#
1
2
3
4
5
6
namespace WF_2
{
 
    public partial class Form1 : Form
    {
        TS x1 = new TS();

должна быть ВСЕГДА


если я создал класс вида
C#
1
2
3
4
5
class TS
{
      public string name;
        public int age;
}
или же вида
C#
1
2
3
4
5
class TS
{
    public string name = "Raph";
    public int age = 23;
}
Верно я понимаю?
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
15.04.2018, 11:53
Лучший ответ Сообщение было отмечено rar как решение

Решение

Да, но в первом случае поле name будет равно null, а age - нулю.

Объявлять ссылку на класс:
C#
1
TS x1;
и непосредственно создавать сам его экземпляр
C#
1
x1 = new TS();
вовсе не обязательно сразу, это можно сделать даже в разных участках программы.
Кроме того, бывают ситуации, когда и сама ссылка на экземпляр класса не используется, например, если нужно лишь однократно вызвать какой-то метод, например:
C#
1
new SomeClass().SomeMethod(someArgument);
Ну и в данном случае используется конструктор без параметров, а так вообще в него и параметры ещё передавать можно,
если name не всегда должно быть "Raph", а age - 23.
1
 Аватар для rar
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 458
15.04.2018, 14:11  [ТС]
Спасибо вам огромное ! буду разбирать все выше сказанное )

Все работает сейчас:

C#
1
2
3
4
5
6
7
8
9
10
11
12
namespace WF_2
{
 
    class TS
    {
     
        public string name = "splinter";
        public int age = 100;
 
    }
            
}

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace WF_2
{
 
public partial class Form1 : Form
    {
 
        TS x1;
 
        private void button1_Click(object sender, EventArgs e)
        {
            x1 = new TS();
 
            MessageBox.Show(x1.name.ToString());
 
        }

**************************************** **************************************** **




Добавлено через 2 часа 15 минут
как лучше далее решить такую задачу (по способу выше):

пример:
как корректно записать
в это

C#
1
2
3
4
5
6
7
8
9
10
11
12
namespace WF_2
{
 
    class TS
    {
     
        public string name = "splinter";
        public int age = 100;
 
    }
            
}
эти строки:

C#
1
2
3
4
5
6
7
 - x1 ( x1.name="Raph", x1.age=12 ) .
 
- x2 ( x2.name="Leo", x2.age=10 ) .
 
- x3 ( x3.name="Mike", x3.age=14 ) .
 
- x4 ( x4.name="Don", x4.age=15 ) .
Чтобы далее я мог в этом коде сделать так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace WF_2
{
 
public partial class Form1 : Form
    {
 
        TS x1;
 
        private void button1_Click(object sender, EventArgs e)
        {
            x2 = new TS();
 
           [B] MessageBox.Show(x2.name.ToString());[/B]
 
        }
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
15.04.2018, 14:18
Нужно значения полей name и age поменять?
Вполне можно так:
C#
1
2
x1.name = "Raph";
x1.age = 12;
0
 Аватар для rar
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 458
15.04.2018, 14:28  [ТС]
я изначально хочу прописать в class TS

- x1 ( x1.name="Raph", x1.age=12 ) .
- x2 ( x2.name="Leo", x2.age=10 ) .
- x3 ( x3.name="Mike", x3.age=14 ) .
- x4 ( x4.name="Don", x4.age=15 ) .

Затем к примеру в private void button1_Click(object sender, EventArgs e)

- когда начну вводить x1. (мне компилятор предложит на выбор name и age , если выбираю x1.name : MessageBox.Show(x1.name.ToString()) ) он мне выдаст "Raph"

- когда начну вводить x2. (мне компилятор предложит на выбор name и age , если выбираю x2.age : MessageBox.Show(x2.age.ToString()) ) он мне выдаст "10"

и т.д.
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
15.04.2018, 14:33
Что-то я не совсем пойму, значения согласовываются на этапе выполнения, а не компиляции, если это не константы, конечно.
x1, x2, x3, x4 - это всё экземпляры класса TS должны быть?
0
 Аватар для rar
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 458
15.04.2018, 14:45  [ТС]
Цитата Сообщение от VladPVS Посмотреть сообщение
x1, x2, x3, x4 - это всё экземпляры класса TS должны быть?
мне сложно сказать... мне важно решить задачу описанную выше , заранее присвоив значения переменным и потом вызывать их ... через "точку"
возможно, я неверно ставлю способ решения.

Добавлено через 6 минут
или лучше просто создавать классы...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace WF_2
{
 
    class TS 1
    {
     
        public string name = "Raph";
        public int age = 12;
 
    }
 
    class TS 2
    {
     
        public string name = "Leo";
        public int age = 10;
 
    }
            
}
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
15.04.2018, 14:49
Лучший ответ Сообщение было отмечено rar как решение

Решение

Можно воспользоваться следующим трюком:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    class TS
    {
        public TS(string name, int age)
        {
            Name = name;
            Age = age;
        }
 
        public string Name { get; private set; }
 
        public int Age { get; private set; }
 
        public static readonly TS Ralph = new TS("Ralph", 12);
 
        public static readonly TS Leo = new TS("Leo", 10);
 
        public static readonly TS Mike = new TS("Mike", 14);
 
        public static readonly TS Don = new TS("Don", 15);
    }
Использование класса:
C#
1
2
3
4
5
6
7
8
9
            TS x1 = TS.Ralph;
 
            TS x2 = TS.Don;
 
            TS x3 = TS.Mike;
 
            TS x4 = TS.Leo;
 
            TS xn = new TS("SomeName", 42);
1
 Аватар для rar
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 458
15.04.2018, 14:57  [ТС]
Круто...
Именно, то что нужно

Вы можете привести какую нибудь дельную ссылку где можно именно об этом "трюке" почитать подробнее?
Мне хотелось бы разобраться как работает ваш пример... (и если не сложно пропишите комментарии к этим действиям (строкам) в самом коде через //)
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
15.04.2018, 15:20
Даже не знаю точно где можно почитать, но у класса EventArgs поле Empty так реализовано, видимо, оттуда я это и позаимствовал. https://msdn.microsoft.com/ru-... .110).aspx

C#
1
public static readonly TS Ralph = new TS("Ralph", 12);
Это статическое поле только для чтения того же класса TS, где в статическом конструкторе создаётся экземпляр этого же класса и присваивается ссылке Ralph. Сразу может быть не совсем очевидным, но, в действительности, ничего сложного, нужно только разобраться, что такое статические поля, методы, конструкторы.
Ну а
C#
1
public string Name { get; private set; }
это просто свойство доступное для чтения как извне, так и внутри, а для записи только внутри класса, из соображений инкапсуляции сделано, так как препятствует возможному неправильному использованию полей класса, но, если нужно оставить возможность изменения значения, то нужно модификатор private убрать.
0
 Аватар для rar
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 458
16.04.2018, 11:19  [ТС]
вопрос про static

- почему мы используем его здесь?
C#
1
public static readonly TS Ralph = new TS("Ralph", 12);
- что изменится , если его не использовать?
C#
1
public readonly TS Ralph = new TS("Ralph", 12);
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
16.04.2018, 11:50
Тогда для получения ссылки на Ralph нужно будет сначала вызвать конструктор TS, в котором вызовется конструктор TS, в котором вызовется конструктор TS, в котором опять вызовется конструктор TS, и так пока не закончится стек.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.04.2018, 11:50
Помогаю со студенческими работами здесь

Область видимости
Form.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; ...

Область видимости
Дня два назад меня дёрнуло наконец понять что из себя представляет до - диез. Начал я с банальной вещи - квадратное уравнение. ...

Область видимости в классах
Всем привет, помогите разобраться Есть Класс public partial class Change_Menu : Form { DB_config DB_Object = new...

Область видимости и прочее
1. Когда я читал книги, там было написано, что если переменной не присвоена область видимости, то по дефолту применяется...

Область видимости объекта
Нужна теория об области видимости объекта


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru