Перейти к содержимому

Как сделать глобальную переменную в c windows forms

  • автор:

Инструкции объявления

Оператор объявления объявляет новую локальную переменную, локальную константу или локальную эталонную переменную. Чтобы объявить локальную переменную, укажите его тип и укажите его имя. Можно объявить несколько переменных одного типа в одной инструкции, как показано в следующем примере:

string greeting; int a, b, c; List xs; 

В инструкции объявления можно также инициализировать переменную с его начальным значением:

string greeting = "Hello"; int a = 3, b = 2, c = a + b; List xs = new(); 

В предыдущих примерах явно указывается тип переменной. Можно также разрешить компилятору определить тип переменной из его выражения инициализации. Для этого используйте var ключевое слово вместо имени типа. Дополнительные сведения см. в разделе неявно типизированных локальных переменных .

Чтобы объявить локальную константу, используйте const ключевое слово, как показано в следующем примере:

const string Greeting = "Hello"; const double MinLimit = -10.0, MaxLimit = -MinLimit; 

При объявлении локальной константы необходимо также инициализировать ее.

Сведения о локальных ссылочных переменных см. в разделе «Эталонные переменные «.

Неявно типизированные локальные переменные

При объявлении локальной переменной можно разрешить компилятору определить тип переменной из выражения инициализации. Для этого используйте var ключевое слово вместо имени типа:

var greeting = "Hello"; Console.WriteLine(greeting.GetType()); // output: System.String var a = 32; Console.WriteLine(a.GetType()); // output: System.Int32 var xs = new List(); Console.WriteLine(xs.GetType()); // output: System.Collections.Generic.List`1[System.Double] 

Как показано в предыдущем примере, неявно типизированные локальные переменные строго типизированы.

Обычно используется выражение var вызова конструктора. Использование var позволяет вам не повторять имя типа при объявлении переменной и создании экземпляра объекта, как показано в следующем примере:

var xs = new List(); 

Вы можете использовать целевое типизированное new выражение в качестве альтернативы:

List xs = new(); List? ys = new(); 

При работе с анонимными типами необходимо использовать неявно типизированные локальные переменные. В следующем примере показано выражение запроса, которое использует анонимный тип для хранения имени клиента и номера телефона:

var fromPhoenix = from cust in customers where cust.City == "Phoenix" select new < cust.Name, cust.Phone >; foreach (var customer in fromPhoenix) < Console.WriteLine($"Name=, Phone="); > 

Дополнительные сведения о неявно типизированных локальных переменных см. в разделе неявно типизированные локальные переменные.

При сопоставлении шаблонов в шаблоне var используется ключевое слово var .

Ссылочные переменные

При объявлении локальной переменной и добавлении ref ключевое слово перед типом переменной объявляется эталонная переменная или локальная ref :

ref int alias = ref variable; 

Ссылочная переменная — это переменная, которая ссылается на другую переменную, которая называется ссылочной. То есть ссылочная переменная является псевдонимом его ссылки. При назначении значения ссылочной переменной это значение назначается референту. При чтении значения ссылочной переменной возвращается значение ссылки. В следующем примере продемонстрировано такое поведение.

int a = 1; ref int alias = ref a; Console.WriteLine($"(a, alias) is (, )"); // output: (a, alias) is (1, 1) a = 2; Console.WriteLine($"(a, alias) is (, )"); // output: (a, alias) is (2, 2) alias = 3; Console.WriteLine($"(a, alias) is (, )"); // output: (a, alias) is (3, 3) 

ref Используйте оператор = ref назначения для изменения ссылочной переменной, как показано в следующем примере:

void Display(int[] s) => Console.WriteLine(string.Join(" ", s)); int[] xs = [0, 0, 0]; Display(xs); ref int element = ref xs[0]; element = 1; Display(xs); element = ref xs[^1]; element = 3; Display(xs); // Output: // 0 0 0 // 1 0 0 // 1 0 3 

В предыдущем примере element ссылочная переменная инициализируется как псевдоним первого элемента массива. Затем он ref переназначился, чтобы ссылаться на последний элемент массива.

Можно определить локальную ref readonly переменную. Нельзя назначить значение переменной ref readonly . Однако можно ref переназначить такую эталонную переменную, как показано в следующем примере:

int[] xs = [1, 2, 3]; ref readonly int element = ref xs[0]; // element = 100; error CS0131: The left-hand side of an assignment must be a variable, property or indexer Console.WriteLine(element); // output: 1 element = ref xs[^1]; Console.WriteLine(element); // output: 3 

Вы можете назначить ссылку в эталонную переменную, как показано в следующем примере:

using System; public class NumberStore < private readonly int[] numbers = [1, 30, 7, 1557, 381, 63, 1027, 2550, 511, 1023]; public ref int GetReferenceToMax() < ref int max = ref numbers[0]; for (int i = 1; i < numbers.Length; i++) < if (numbers[i] >max) < max = ref numbers[i]; >> return ref max; > public override string ToString() => string.Join(" ", numbers); > public static class ReferenceReturnExample < public static void Run() < var store = new NumberStore(); Console.WriteLine($"Original sequence: "); ref int max = ref store.GetReferenceToMax(); max = 0; Console.WriteLine($"Updated sequence: "); // Output: // Original sequence: 1 30 7 1557 381 63 1027 2550 511 1023 // Updated sequence: 1 30 7 1557 381 63 1027 0 511 1023 > > 

В предыдущем примере GetReferenceToMax метод является методом возвращается по ссылке . Он не возвращает максимальное значение, но возвращаемое ссылкой, которое является псевдонимом элемента массива, который содержит максимальное значение. Метод Run назначает ссылку возвращаемой переменной max . Затем, назначив max его, он обновляет внутреннее хранилище экземпляра store . Можно также определить ref readonly метод. Вызывающие методы ref readonly не могут назначить значение возвращаемой ссылке.

Переменная итерации инструкции foreach может быть эталонной переменной. Дополнительные сведения см. в foreach разделе инструкций инструкции инструкций итерации.

В критически важных сценариях использование ссылочных переменных и возвратов может повысить производительность, избегая потенциально дорогостоящих операций копирования.

Сведения о ref полях см ref . в разделе полей статьи ref типов структур.

область d ref

Контекстная ключевое слово scoped ограничивает время существования значения. Модификатор scoped ограничивает время существования ref-safe-to-escape или safe-to-escape соответственно текущим методом. Фактически добавление модификатора утверждает, scoped что код не будет расширять время существования переменной.

Можно применить scoped к параметру или локальной переменной. Модификатор scoped может применяться к параметрам и локальным параметрам, если тип является типом ref struct . scoped В противном случае модификатор может применяться только к локальным ссылочным переменным. Это включает локальные переменные, объявленные модификатором ref и параметрами, объявленными с in ref помощью модификаторов или out модификаторов.

Модификатор scoped неявно this добавляется в методы, объявленные в struct параметрах out , параметрах и ref параметрах, когда тип является ref struct .

Спецификация языка C#

Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:

  • Инструкции объявления
  • Ссылочные переменные и возвращается

Дополнительные сведения об scoped модификаторе см. в заметке по улучшению структуры низкого уровня.

См. также

  • справочник по C#
  • Инициализаторы объектов и коллекций
  • Ключевое слово ref
  • Сокращение выделения памяти с помощью новых функций C#
  • Параметры var (правила стиля IDE0007 и IDE0008)

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Как сделать глобальную переменную в WinForms

Можно ли сделать, чтобы я мог использовать массив arr по всему проекту. Массив arr я не могу использовать в private void button2_Click(object sender, EventArgs e).

private void button1_Click(object sender, EventArgs e) < double[] arr = new double[(int)numericUpDown1.Value]; Random rnd = new Random(); dataGridView1.RowCount = 1; dataGridView1.ColumnCount = (int)numericUpDown1.Value; for (int i = 0; i < (int)numericUpDown1.Value; i++) < arr[i] = rnd.NextDouble() * 78.4 - 27.8; arr[i] = Math.Round(arr[i], 1); dataGridView1[i, 0].Value = arr[i]; dataGridView1.Columns[i].HeaderText = i.ToString(); >var MaxValue = arr.Max(); var MinValue = arr.Min(); var IndexMin = Array.IndexOf(arr, MinValue); var IndexMax = Array.IndexOf(arr, MaxValue); var min = Math.Min(IndexMin, IndexMax); var max = Math.Max(IndexMin, IndexMax); Int64 IndexProduct = 1; for (var i = min + 1; i < max; i++) < IndexProduct *= i; >> private void button2_Click(object sender, EventArgs e) < < double sum = 0; Array.Sort(arr); for (int i = 0; i < arr.Length; i++) dataGridViewArray[i, 0].Value = arr[i]; for (int i = 0; i < arr.Length; i++) if (arr[i] >0) sum += arr[i]; textBoxSumma.Text = sum.ToString(); > > 

Отслеживать
задан 14 апр 2021 в 11:03
201 2 2 серебряных знака 11 11 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

double[] arr; private void button1_Click(object sender, EventArgs e) < arr = new double[(int)numericUpDown1.Value]; . private void button2_Click(object sender, EventArgs e) < if (arr == null) return; . 

Отслеживать
ответ дан 14 апр 2021 в 11:11
user176262 user176262

public static class Globals < public static double[] arr; >public partial class Form1 : Form < //. private void button1_Click(object sender, EventArgs e) < Globals.arr = new double[(int)numericUpDown1.Value]; //. >> 

Отслеживать
ответ дан 14 апр 2021 в 14:06
Blackmeser Blackmeser
2,033 1 1 золотой знак 10 10 серебряных знаков 13 13 бронзовых знаков

Глобальные переменные - зло. Не нужно начинающим давать способ использовать их. Тем более, автору достаточно поля класса (формы).

14 апр 2021 в 16:21

@AlexanderPetrov а смысл? Глобальных переменных в C# нет, только статические классы, которые подходят для данной цели. А если ему надо будет передавать данные между формами? До освоения наследования классов делегаты/события учить? Action<>'ами и Func<>"ами пугать? Мне в своём время про статические классы никто не сказал, такой говнокод шляпал. что в итоге родительская и дочерняя формы знали друг о друге всё, и спокойно манипулировали полями друг-друга.

Как сделать "глобальную" переменную в C# windows forms ?

чтобы из нескольких форм можно было обращаться к ней. Как же меня за@б л этот СИ ШАРП И ЭТИ ФОРМЫ Е****** КАК ЖЕ У МЕНЯ БОМБИТ КАК ЭТО СДЕЛАТЬ КАК ЭТО СДЕЛАТЬ?!

ВОТ ЧТО НАШЁЛ
public static string user_str;

НО Я ВСТАВЛЮ ЕЁ КУДА УГОДНО И ПИШЕТ ОШИБКИ ВЫ З*Б ЛИ СО СВОИМ СИ ХАРПОМ ГОРИТЕ СНИМ ПЛАМЕНЕМ

Лучший ответ
Глобальная переменная или поле на уровне класса объявляется на уровне класса (не внутри метода).

public string username;

public string username

К такой переменной ты можешь обращаться через объект.

SomeClass o = new SomeClass(); // Это новый экземпляр класса, а не какой-то уже созданный
o.username = "Миха Бобровский";

Если ты хочешь обращаться к переменной через класс, а не экземпляр класса, тогда переменная или поле должны быть static, как указано в твоем примере. Тогда:

SomeClass.username = "Миха Бобровский";

Michael BobrovskyГуру (4515) 1 год назад
ебaный с# чтоб я в жизни еще раз еще раз. залез в microsoft visual studio с этим си харпом.

Максим Искусственный Интеллект (193194) Michael Bobrovsky, а ты как хотел? Программирование и языки учить надо. Само работать не будет.

Michael BobrovskyГуру (4515) 1 год назад

Максим Искусственный Интеллект (193194) Michael Bobrovsky, что ага? С первого раза получалось всё? Нет, ты сначала прочитал, а потом учился. А тут ты хочешь сразу делать, ничего не разобрав.

Как создать глобальную переменную или глобальный класс управляемого типа (CLR)?

Hi!
Нужна помощь: Как создать(проинициализировать) глобальную переменную или глобальный класс управляемого типа (CLR).
В Visual c++ 2008 создал проект «Приложение Windows Forms” (CLR); В проекте два окна Form1 и Form2 и файл с C++ классом, необходимо из Form1 послать данные в переменную класса data_SQL->dSet а затем получить эти данные в Form2.

(adata.h)
#pragma once
using namespace System::Data;
public ref class data_SQL public:
DataSet ^dSet;
DataTable ^dt;
data_SQL(void);
virtual ~data_SQL(void);>;

(adata.cpp)
#include "StdAfx.h"
#include "adata.h"
data_SQL::data_SQL(void)<>
data_SQL::~data_SQL(void)<>

при объявлении data_SQL ^myVAR = gcnew data_SQL;
компилятор дает ошибку:

error C3145: ffff: глобальная или статическая переменная не может быть управляемого типа "data_SQL ^"
1> может не объявлять глобальную или статичную переменную или элемент собственного типа, который относится к объекту в куче сборщика мусора

Третий день не могу найти решение, может кто знает буду очень признателен.

4 ответа

26 ноября 2009 года
4.5K / / 09.08.2005

У вас архитектурная ошибка.
Взгляните на следующий подход к построению приложения. В нем создается специальный класс (MyApplication), который осуществляет глобальную логику приложения - создает формы, организует их взаимодействие. Запомните - формы не должны ничего знать друг о друге и не могут взаимодействовать друг с другом напрямую - и все у вас будет получаться, и код будет просто сопровождать и модифицировать, не только вам, но и тем программистам, которым он достанется в наследство.
Код на C# ибо меньше мусорных закорючек:

public class MyApplication <

protected MyApplication() // можно выполнить какую-либо инициализацию
// внутренних структур, прочитать конфиги и прочее.
>

private Form1 form1 = null; // главная форма

private Form2 form2 = null; // дополнительная форма

public void Run() <
// основной метод, создает главную форму
Application.Run(form1 = new Form1(this));
>

public void ShowForm2() if(null == form2) form2 = new Form2(this);
>
form2.Show();
>

public void DoSomeAction(int x, string s) // не нужно позвоять формам взаимодействовать друг
// с другом напрямую
if(null == form2)
return;
form2.DoSomeAction(x, s);
>

// точка входа в приложение
static void Main(string[] args) Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

MyApplication app = new MyApplication();
app.Run();
>

public class Form1 : Form

public Form1() InitializeComponent();
>

public Form1(MyApplication app) : this() this.app = app;
>

private readonly MyApplication app;

private void Button1_Click(object sender, EventArgs e) app.ShowForm2();
>

private void Button2_Click(object sender, EventArgs e) app.DoSomeAction(10, "Hi!");
>

public class Form2 : Form

public Form2() InitializeComponent();
>

public Form2(MyApplication app) : this() this.app = app;
>

private readonly MyApplication app;

public void DoSomeAction(int x, string s) MessageBox.Show(s + " : " + x.ToString());
>

27 ноября 2009 года
5 / / 26.11.2009

У вас архитектурная ошибка.
Взгляните на следующий подход к построению приложения. В нем создается специальный класс (MyApplication), который осуществляет глобальную логику приложения - создает формы, организует их взаимодействие. Запомните - формы не должны ничего знать друг о друге и не могут взаимодействовать друг с другом напрямую - и все у вас будет получаться, и код будет просто сопровождать и модифицировать, не только вам, но и тем программистам, которым он достанется в наследство.
Код на C# ибо меньше мусорных закорючек:

public class MyApplication <

protected MyApplication() // можно выполнить какую-либо инициализацию
// внутренних структур, прочитать конфиги и прочее.
>

private Form1 form1 = null; // главная форма

private Form2 form2 = null; // дополнительная форма

public void Run() <
// основной метод, создает главную форму
Application.Run(form1 = new Form1(this));
>

public void ShowForm2() if(null == form2) form2 = new Form2(this);
>
form2.Show();
>

public void DoSomeAction(int x, string s) // не нужно позвоять формам взаимодействовать друг
// с другом напрямую
if(null == form2)
return;
form2.DoSomeAction(x, s);
>

// точка входа в приложение
static void Main(string[] args) Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

MyApplication app = new MyApplication();
app.Run();
>

public class Form1 : Form

public Form1() InitializeComponent();
>

public Form1(MyApplication app) : this() this.app = app;
>

private readonly MyApplication app;

private void Button1_Click(object sender, EventArgs e) app.ShowForm2();
>

private void Button2_Click(object sender, EventArgs e) app.DoSomeAction(10, "Hi!");
>

public class Form2 : Form

public Form2() InitializeComponent();
>

public Form2(MyApplication app) : this() this.app = app;
>

private readonly MyApplication app;

public void DoSomeAction(int x, string s) MessageBox.Show(s + " : " + x.ToString());
>

Огромнейшее спасибо за ваш ответ. Дело в том, что я недавно преступил к изучению Visual C++ а о C# имею еще меньше представления, в связи с этим хочу вас попросить если возможно создать ваш ответ(проект) в IDE Visual C++ и затем отправить мне исходники на email: [email]selling_ic@ukr.net[/email]. Заранее благодарен, последняя надежда на вас а то весь интернет перерыл и все возможные хелпы перечитал.

27 ноября 2009 года
4.5K / / 09.08.2005

в связи с этим хочу вас попросить если возможно создать ваш ответ(проект) в IDE Visual C++ и затем отправить мне исходники на email

Если вам не ясен код на C#, то и на MC++ он будет вам непонятен.

28 ноября 2009 года
5 / / 26.11.2009
Если вам не ясен код на C#, то и на MC++ он будет вам непонятен.

Я не знаю C# и мне сложно интерпретировать выше описанное в С++(насколько я знаю это два разных языка, хотя чем-то и схожи между собой). И к сожалению, наверное вы не поняли мой вопрос изначально, в котором я описал, что две формы и недолжны взаимодействовать между собой! Формы ничего не знают друг о друге они должны знать один глобальный класс или переменную управляемого типа (к примеру DataTable ^myTable) к которому они и обращаются (обновляют, изменяют) независимо друг от друга.
Формы недолжны перегружать этот класс или переменную т.е. в какой-то момент работая в форме1 я послал данные в мой класс или переменную а затем работая уже в форме2 при необходимости я мог прочитать эти данные. При определении extern или static DataTable ^myTable компилятор дает ошибку:

error C3145: myTable: глобальная или статическая переменная не может быть управляемого типа " System:: Data:: DataTable ^ "
1> может не объявлять глобальную или статичную переменную или элемент собственного типа, который относится к объекту в куче сборщика мусора

Вот такая вот кухня которая уже длиться несколько дней и я никак не могу найти какого либо решения. Если вдруг у вас есть возможность помочь в решении данной проблемы на Visual C++, буду очень вам признателен.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *