下午好。我正在阅读 Paul Deitel 的 The Complete Guide to C#, 2006。与代表一起到达部分。读完这一章后,有那么一刻我以为我理解了这个主题,因为我能够实现一个简单的代码,最多可以数到 10:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace consoledemo
{
public delegate void TopMessage(string message); //объявление делегата. Делегат - это тип данных по ссылке.
class Program
{
static void Main(string[] args)
{
TopMessage method = Show; // Тут объявлена ссылка на метод с совпадающей сигнатурой (Show)
ShowMessage(10, method); //method передаётся сюда вторым параметром
}
static void ShowMessage(int second, TopMessage method)//TopMessage передаёт ссылку на метод совпадающей сигнатурой. method является переменной, в которой хранится ссылка
{
for (int i = 0; i < second; i++)
{
Thread.Sleep(1000);
method(string.Format("How long before closing the console: " + i)); //method транслирует свои сообщения в другой метод
}
}
static void Show (string message) // данный метод имеет сигнатуру точно такую же, как объявлено в делегате (TopMessage)
{
Console.WriteLine(message);
}
}
}
但由于 Deitel 在他的书中演示了控制台中的大部分示例,因此我决定稍微复杂化我的任务。我正在添加一个按钮和一个标签。通过按下按钮,一条消息应该已经广播到How long before closing the console:标签,之后标签应该变得不可见。如果标签消失的问题完全可以解决,那么显示消息的实现对我来说就是一个问题。如果Main我在方法中添加:label1.Text = method.ToString();那么我会得到一个窗口冻结 10 秒(因为我没有将这个案例带到一个单独的线程),完成后,标签将显示文本Win32Demo.TopMessage。我能做的最多就是包括 class MessageBox.Show。
我如何获得Show将其消息转换为属性的方法Button1.text,Label1.text等等。
谢谢你的回复,爱人。
Label1 显示不正确的文本,因为其 Text 属性设置为对作为方法委托的对象调用 ToString 方法的结果。但实际上委托执行的结果应该放在text变量中:
label1.Text = method();为此,您需要更改委托本身和相应方法的实现。
为了在等待一秒钟时不冻结 UI,您应该使用Timer组件而不是 ThreadSleep 方法。