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

Как сделать ссылку на объект в c

  • автор:

C# Как сделать ссылку на объект [дубликат]

@aepot Там заголовок вопроса такой, сам ответ разжовывает разные мелочи по доступу к переменным, включая ту, что у автора в вопросе (цитата: Вопрос: А сможем ли мы получить доступ MyField из других классов, методов и др.? )

19 ноя 2020 в 12:22
Еще автору на заметку
19 ноя 2020 в 12:27

2 ответа 2

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

Вам нужно объявить переменную SoC не в конструктора, а в классе, тогда она будет доступна:

namespace Killer < public partial class Form1 : Form < private Process[] SoC; public Form1() < InitializeComponent(); SoC = Process.GetProcessesByName("XR_3DA.exe"); >private void kill_Click(object sender, EventArgs e) < foreach (Process SoC1 in SoC) < SoC1.CloseMainWindow(); >> > > 

Отслеживать
ответ дан 19 ноя 2020 в 12:12
Exploding Kitten Exploding Kitten
5,462 2 2 золотых знака 18 18 серебряных знаков 24 24 бронзовых знака

public partial class Form1 : Form < private Process[] SoC; public Form1() < InitializeComponent(); SoC = Process.GetProcessesByName("XR_3DA.exe"); >private void kill_Click(object sender, EventArgs e) < foreach (Process SoC1 in SoC) < SoC1.CloseMainWindow(); >> > 

Дополнительно, крайне не рекомендуется вставлять свой код в конструктор формы. Рекомендую использовать обработчик события Form.Load для этого.

Исправленный код будет выглядеть так:

public partial class Form1 : Form < private Process[] SoC; public Form1() < InitializeComponent(); this.Load += Form1_Load; // вместо этой строчки можете назначить обработчик в дизайнере, а строчку убрать >private void Form1_Load(object sender, EventArgs e) < SoC = Process.GetProcessesByName("XR_3DA.exe"); >private void kill_Click(object sender, EventArgs e) < foreach (Process SoC1 in SoC) < SoC1.CloseMainWindow(); >> > 

Как создать ссылку на объект с#?

Здравствуйте, скорее всего мой вопрос покажется вам глупым, я начал изучить си шарп относительно недавно. Я пишу приложение на WF. Я сделал поток, в котором мне надо получать значение тракбара. Но визуал студио говорит, что для нестатического поля, метода или свойства «Form1.trackBar1» требуется ссылка на объект. Как сделать эту ссылку? Вот код

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace Password_Generator_by_And < public partial class Form1 : Form < public Form1() < InitializeComponent(); Thread myThread = new Thread(scr); myThread.Start(); >static void scr() < while(true) < int a = trackBar1.Value; >> private void trackBar1_Scroll(object sender, EventArgs e) < >> >
  • Вопрос задан более года назад
  • 414 просмотров

4 комментария

Простой 4 комментария

freeExec

Ну и потом у вас будут проблемы, что изменять UI-элементы можно только в потоке UI где они были созданы.

firedragon

Владимир Коротенко @firedragon
freeExec, что мешает узнать где вызвано
https://learn.microsoft.com/en-us/dotnet/desktop/w.

freeExec

Владимир Коротенко, ничего не мешает, но это очередная засада для новичков. И потом, прогресбары часто не ставят из самой процедуры расчёта, а по таймеру считывают значение прогресса и обновляют UI.

Как сделать ссылку на объект в c

Кроме параметров метода, которые с помощью модификатора ref позволяют передавать значение по ссылке, C# также позволяет с помощью ключевого слова ref возвращать ссылку из метода и определять переменную, которая будет хранить ссылку.

Переменная-ссылка

Для определения локальной переменной-ссылки (ref local) перед ее типом ставится ключевое слово ref :

int x = 5; ref int xRef = ref x;

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

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

ref int xRef; // ошибка

Получив ссылку, мы можем манипулировать значением по этой ссылке. Например:

int x = 5; ref int xRef = ref x; Console.WriteLine(x); // 5 xRef = 125; Console.WriteLine(x); // 125 x = 625; Console.WriteLine(xRef); // 625

Ссылка как результат функции

Для возвращения из функции ссылки в сигнатуре функции перед возвращаемым типом, а также после оператора return следует указать ключевое слово ref :

int[] numbers = < 1, 2, 3, 4, 5, 6, 7 >; ref int numberRef = ref Find(4, numbers); // ищем число 4 в массиве numberRef = 9; // заменяем 4 на 9 Console.WriteLine(numbers[3]); // 9 ref int Find(int number, int[] numbers) < for (int i = 0; i < numbers.Length; i++) < if (numbers[i] == number) < return ref numbers[i]; // возвращаем ссылку на адрес, а не само значение >> throw new IndexOutOfRangeException("число не найдено"); >

В методе Find ищем число в массиве, но вместо самого значения числа возвращаем ссылку на него в памяти. Для этого в сигнатуре метода в качестве типа результата функции указывается не просто int , а ref int .

Кроме того, в самом методе после слова return также ставится ref :

return ref numbers[i];

Тем самым мы получаем не просто значение, а ссылку на объект в памяти.

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

ref int numberRef = ref Find(7, numbers);

В итоге переменная numberRef будет содержать ссылку на объект int, и через данную переменную в последствиии мы можем изменить объект по этой ссылке.

Другой пример — возвращение ссылки на максимальное число из двух:

int a = 5; int b = 8; ref int pointer = ref Max(ref a, ref b); pointer = 34; // меняем значением максимального числа Console.WriteLine($"a: b: "); // a: 5 b: 34 ref int Max(ref int n1, ref int n2) < if (n1 >n2) return ref n1; else return ref n2; >

Стоит обратить внимание, что параметры метода в этом случае определены с ключевым словом ref.

При определении метода, который возвращает ссылку, следует учитывать, что такой метод естественно не может иметь тип void. Кроме того, такой метод не может возвращать:

  • Значение null
  • Константу
  • Значение перечисления enum
  • Свойство класса или структуры
  • Поле для чтения (которое имеет модификатор read-only)

Практическое руководство. Создание связи с объектом или веб-страницей с помощью элемента управления LinkLabel в Windows Forms

Элемент управления Windows Forms LinkLabel позволяет создавать ссылки веб-типа в форме. После щелчка ссылки можно изменить ее цвет, чтобы указать, что по ссылке был выполнен переход. Дополнительные сведения об изменении цвета см. в статье Практическое руководство. Изменение внешнего вида элемента управления LinkLabel в Windows Forms.

Создание ссылки на другую форму

Создание ссылки на другую форму с помощью элемента управления LinkLabel
  1. Присвойте свойству Text соответствующую надпись.
  2. Задайте свойство LinkArea, чтобы определить, какая часть надписи будет указана в виде ссылки. Способ указания зависит от свойств, связанных с внешним видом метки ссылки. Значение LinkArea представлено объектом LinkArea, содержащим два числа — начальная позиция символа и количество символов. Свойство LinkArea можно задать в окне свойств или в коде следующим образом:
' In this code example, the link area has been set to begin ' at the first character and extend for eight characters. ' You may need to modify this based on the text entered in Step 1. LinkLabel1.LinkArea = New LinkArea(0, 8) 
// In this code example, the link area has been set to begin // at the first character and extend for eight characters. // You may need to modify this based on the text entered in Step 1. linkLabel1.LinkArea = new LinkArea(0,8); 
// In this code example, the link area has been set to begin // at the first character and extend for eight characters. // You may need to modify this based on the text entered in Step 1. linkLabel1->LinkArea = LinkArea(0,8); 

Примечание. Экземпляр класса LinkLabelLinkClickedEventArgs содержит ссылку на элемент управления LinkLabel, который был нажат, поэтому выполнять приведение объекта sender не нужно.

Protected Sub LinkLabel1_LinkClicked(ByVal Sender As System.Object, _ ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) _ Handles LinkLabel1.LinkClicked ' Show another form. Dim f2 As New Form() f2.Show LinkLabel1.LinkVisited = True End Sub 
protected void linkLabel1_LinkClicked(object sender, System. Windows.Forms.LinkLabelLinkClickedEventArgs e) < // Show another form. Form f2 = new Form(); f2.Show(); linkLabel1.LinkVisited = true; >
private: void linkLabel1_LinkClicked(System::Object ^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs ^ e) < // Show another form. Form ^ f2 = new Form(); f2->Show(); linkLabel1->LinkVisited = true; > 

Связывание с веб-страницей

Элемент управления LinkLabel можно также использовать для отображения веб-страницы в браузере по умолчанию.

Запуск Internet Explorer и создание ссылки на веб-страницу с помощью элемента управления LinkLabel
  1. Присвойте свойству Text соответствующую надпись.
  2. Задайте свойство LinkArea, чтобы определить, какая часть надписи будет указана в виде ссылки.
  3. В обработчике событий LinkClicked в середине блока обработки исключений вызовите вторую процедуру, которая задает свойству LinkVisited значение true и использует метод Start для запуска браузера по умолчанию с URL-адресом. Чтобы использовать метод Start, необходимо добавить ссылку на пространство имен System.Diagnostics.

Важно! Если приведенный ниже код выполняется в среде с частичным доверием (например, на общем диске), при вызове метода VisitLink JIT-компилятор завершится сбоем. Инструкция System.Diagnostics.Process.Start вызывает запрос ссылки, который завершается сбоем. Перехватывая исключение при вызове метода VisitLink , приведенный ниже код гарантирует, что в случае сбоя JIT-компилятора ошибка будет обработана корректно.

Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) _ Handles LinkLabel1.LinkClicked Try VisitLink() Catch ex As Exception ' The error message MessageBox.Show("Unable to open link that was clicked.") End Try End Sub Sub VisitLink() ' Change the color of the link text by setting LinkVisited ' to True. LinkLabel1.LinkVisited = True ' Call the Process.Start method to open the default browser ' with a URL: System.Diagnostics.Process.Start("http://www.microsoft.com") End Sub 
private void linkLabel1_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) < try < VisitLink(); >catch (Exception ex ) < MessageBox.Show("Unable to open link that was clicked."); >> private void VisitLink() < // Change the color of the link text by setting LinkVisited // to true. linkLabel1.LinkVisited = true; //Call the Process.Start method to open the default browser //with a URL: System.Diagnostics.Process.Start("http://www.microsoft.com"); >
private: void linkLabel1_LinkClicked(System::Object ^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs ^ e) < try < VisitLink(); >catch (Exception ^ ex) < MessageBox::Show("Unable to open link that was clicked."); >> private: void VisitLink() < // Change the color of the link text by setting LinkVisited // to true. linkLabel1->LinkVisited = true; // Call the Process.Start method to open the default browser // with a URL: System::Diagnostics::Process::Start("http://www.microsoft.com"); > 

См. также

  • Process.Start
  • Общие сведения об элементе управления LinkLabel
  • Практическое руководство. Изменение внешнего вида элемента управления LinkLabel в Windows Forms
  • Элемент управления LinkLabel

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

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

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

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