c#.net 中委托事件的超级简单示例? [关闭]

2024-05-11

我需要一个非常简单的例子来了解自己对这些事件的了解。我觉得很难理解互联网或书籍上提供的示例。


这是公开事件的类的简单实现。

public class ChangeNotifier
{
    // Local data
    private int num; 

    // Ctor to assign data
    public ChangeNotifier(int number) { this.num = number; } 

     // The event that can be subscribed to
    public event EventHandler NumberChanged;

    public int Number
    {
        get { return this.num; }
        set
        {
            // If the value has changed...
            if (this.num != value) 
            {
                // Assign the new value to private storage
                this.num = value;

                // And raise the event
                if (this.NumberChanged != null)
                    this.NumberChanged(this, EventArgs.Empty);
            }
        }
    }
}

这个类可以像下面这样使用:

public void SomeMethod()
{
    ChangeNotifier notifier = new ChangeNotifier(10);

    // Subscribe to the event and output the number when it fires.
    notifier.NumberChanged += (s, e) => Console.Writeline(notifier.Number.ToString());

    notifier.Number = 10; // Does nothing, this is the same value
    notifier.Number = 20; // Outputs "20" because the event is raised and the lambda runs.
}

关于控制流,执行流程为SomeMethod()。我们创建一个新的ChangeNotifier从而调用它的构造函数。这指定了值10给私人num member.

然后我们使用以下方式订阅该事件+=句法。该运算符在右侧获取一个委托(在我们的例子中,该委托是一个 lambda)并将其添加到事件的委托集合中。此操作不会执行我们在中编写的任何代码ChangeNotifier。它可以通过定制add and remove如果您愿意,可以使用事件的方法,但很少需要这样做。

然后我们执行一些简单的操作Number财产。首先我们分配10,它运行set方法上的Number财产与value = 10。但是num会员的价值已经是10,因此初始条件评估为 false 并且什么也没有发生。

然后我们做同样的事情20。这次值不同了,所以我们将新值赋给num并触发该事件。首先我们验证该事件不为空。如果没有任何内容订阅它,则它为空。如果它不为空(即,如果某事is订阅它),我们使用标准方法/委托语法触发它。我们只需使用事件的参数来调用该事件。这将调用所有已订阅该事件的方法,包括将执行以下操作的 lambdaConsole.WriteLine().


Henrik 已成功地挑剔了如果一个线程可以进入则存在的潜在竞争条件。Number的设置器,而另一个线程正在取消订阅侦听器。对于还不了解事件如何工作的人来说,我不认为这是常见情况,但如果您担心这种可能性,请修改以下行:

if (this.NumberChanged != null)
    this.NumberChanged(this, EventArgs.Empty);

是这样的:

var tmp = this.NumberChanged;
if (tmp != null)
    tmp(this, EventArgs.Empty);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c#.net 中委托事件的超级简单示例? [关闭] 的相关文章

  • 如何在 C++ 中的嵌套词法作用域可访问的作用域中声明静态信息?

    我想声明范围的标识符 该标识符将用于自动填充最内部范围内任何日志记录语句的字段 它们通常会 但并非总是如此 例如 lambda 使用 引入的块 匹配封闭块的 名称 用法看起来像这样 namespace app LOG CONTEXT app
  • 查找周边上的点来表示边界/形状

    我有一个简单的二维网格 其格式为myGrid x y 我正在尝试找到一种方法来找到所选网格周围的周长 这样我就有了所选网格的形状 这是我的意思的一个例子 这里的想法是找到所有相关的 角点 也就是图像周边的红点 放入一个列表中 这样我就可以从
  • 在 std::forward 中它如何接受右值?

    看看斯科特 迈耶的有效的现代 C 第200 201页 建议的简化实施std forward可能是 在其他地方看到了正确的实现 template
  • C# 从整数反序列化枚举

    是否可以从 C 中的 int 反序列化枚举 例如如果我有以下课程 class Employee public string Name get set public int EmployeeTypeID get set 我可以轻松地从 XML
  • C# 委托实例化与仅传递方法引用 [重复]

    这个问题在这里已经有答案了 我有一个简单的问题 与仅传递函数引用相比 实例化 C 委托有什么优势 我的意思是 Why do Thread t new Thread new ThreadStart SomeObject SomeMethod
  • 如何使用 Regsvr32 注册 .NET COM DLL?

    我有一个使用 COM DLL 的 VB6 应用程序 该DLL是用C 编写的 在 C 项目属性中 我检查了 Register for COM interop 选项 VB6 应用程序在我的开发机器上运行良好 C 代码完全遵循以下格式 CodeP
  • 使用 boost::asio 是否有一种可移植的方法来查找空闲端口号

    我目前正在尝试找出一种方法来查找空闲端口号以建立连接 最好使用 boost asio 然后 该端口号将用于侦听 只有这样我才能打开套接字 大致来说 有没有办法做到 tcp resolver query query localhost por
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • 如何使用“std::array”作为“template class”形式的模板参数?

    请考虑以下事项tree class template
  • 可以轻易移动,但不可轻易复制

    是否可以创建类类型 即 普通移动构造 但不是普通复制构造 但仍然可复制构造 普通复制构造 但不是普通移动构造 但仍然可移动构造 可以简单地复制分配 但不能简单地移动分配 但仍然可以移动分配 可以简单地移动分配 但不能简单地复制分配 但仍然可
  • 驱蚊程序?

    不 我认真的 最近 我读到 当电脑的压电蜂鸣器以一定频率振动时 声音可以驱赶蚊子 真的吗 如何以编程方式访问 PC 蜂鸣器 而不是扬声器 最好使用 C 我不知道有没有蚊子 但我的头疼得要命 啊啊 using System Runtime I
  • 在浏览器中测试wcf服务

    我无法在浏览器中调用基本的 wcf web 方法 即使使用
  • 向量和常量

    考虑一下这个 void f vector
  • OpenCV:处理每一帧

    我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获 在所有示例中 我发现来自相机的帧是使用抓取功能进行处理并等待一段时间 我想处理序列中的每一帧 我想定义自己的回调函数 每次当一个新帧准备好处理时都会执行该函数 例如直播对于 Win
  • 在 4.x 内核上的 64 位内存中查找系统调用表

    我正在尝试编写一个简单的内核模块来查找 Linux 中的 sys call table 但遇到了一些麻烦 我在这里找到了 32 位 Linux 的基本指南 https memset wordpress com 2011 03 18 sysc
  • ASP.NET Core中间件如何进行DI?

    我正在尝试将依赖项注入到我的中间件构造函数中 如下所示 public class CreateCompanyMiddleware private readonly RequestDelegate next private readonly
  • C++ 从文件中读取字符串

    我试图将字符串直接存储到一个文件中 以便稍后在 C 中读取 基本上 对于整个范围 我试图将带有字符串变量的对象数组存储在文件中 并且这些字符串变量将通过类似 object 的内容读取 0 字符串 然而 每次我尝试读取字符串变量时 系统都会给
  • 警告从 lambda 返回捕获的引用

    我尝试使用 lambda 有条件地将引用绑定到两个变量之一 int foo bar int choice gt int if true some condition return foo else return bar 这会在 clang
  • Xamarin Forms:System.Reflection.TargetInitationException:调用目标已引发异常

    我正在为这个问题苦苦挣扎 我只是创建了一个简单的跨平台页面 这里是 XAML 代码
  • 将整个单词与特殊字符匹配的正则表达式不起作用? [复制]

    这个问题在这里已经有答案了 我正在经历这个问题C Regex Match 整个单词 https stackoverflow com q 1209049 443568 它说要匹配整个单词使用 b模式 b 这对于匹配没有任何特殊字符的整个单词效

随机推荐

  • 使用 Jaxb 和 JDK 9 的小程序中的非法反射访问[重复]

    这个问题在这里已经有答案了 我有一个 Java 小程序 它提供了一个 GUI 来调用 Web 服务 它使用 Jaxb 解析 XML 数据并将其解组为对象 它可以在 Java 1 5 到 1 8 上正确运行 对于 Java 9 情况就不那么严
  • 将 mmap 内核启动参数保留的内存映射到用户空间

    正如中所讨论的this https stackoverflow com q 1911473 143897问题 我在启动时使用内核启动参数保留一个内存块memmap 8G 64G 我写了一个字符驱动程序 http pete akeo ie 2
  • 如何检测来自 QNX 中 ncurses 的屏幕调整大小事件?

    我无法配置为接收有关使用 ncurses QNX Momentics 更改终端大小的事件 我使用Putyy作为终端 通过COM端口传输数据 我的问题是如何实现使用远程终端时接收屏幕变化事件 FILE fcons fopen dev ser1
  • Rails 4 和thoughtbot/clearance - 将字段添加到用户模型

    我是一个相对新手 所以非常感谢任何帮助 我正在使用 Rails 4 2 并使用 Clearance gem 进行身份验证 我希望有人可以描述覆盖控制器以在注册表单上包含自定义属性的最佳实践 我读过很多不同的建议 其中许多来自不使用 Stro
  • R tm 包创建 N 个最常见术语的矩阵

    我有一个termDocumentMatrix使用创建的tmR 中的包 我正在尝试创建一个包含 50 个最常出现的术语的矩阵 数据框 当我尝试转换为矩阵时 出现此错误 gt ap m lt as matrix mydata dtm Error
  • 获取pandas数据框列中值的长度

    我试图获取下面提到的数据框中每个 zipCd 值的长度 当我运行下面的代码时 每条记录都得到 958 我期待得到更像 4 的东西 有人看出问题是什么吗 Code zipDfCopy zipCd str len Data print zipD
  • 来自连接到远程机器的相机的 Opencv 流

    我正在用 python 开发一个 wx 应用程序 用于流式传输和显示来自两个不同网络摄像头的视频 这工作正常 但现在我需要在不同的场景中执行此操作 其中两个摄像头连接在通过网络连接的 Windows 上运行的单独计算机中 我的应用程序将在机
  • 在 aws-cdk 上的 aws-rds 上,使数据库可公开访问的设置在哪里?

    使用 AWS RDS 控制台和 CLI API 都有一个开关可以使数据库可公开访问 但我找不到使用提供的构造使用新的 aws cdk 来实现此目的的方法 Cloud Formation 类 例如 CfnDBInstance 中有一个布尔值
  • Android 中的 SSL 会话重用问题(J2SE 工作正常)

    我一直在 iOS Java 桌面和 Android 上尝试 SSL 会话重用 iOS 似乎尝试重用 SSL 会话 但并非总是如此 只要您在创建 SSLEngine 时传递主机名 端口 Java 似乎总是会重用会话 当我使用 Android
  • 找不到 NGINX brew 安装命令

    I do brew install nginx and get gt Downloading http nginx org download nginx 1 2 2 tar gz Already downloaded Library Cac
  • Pandas 将列添加到非引用数据框中

    这件事让我心潮澎湃好几个小时了 也许我遗漏了一些神秘的 陷阱 但它一定是非常违反直觉的 Trial unq 是一个两列数据帧 Trial unq2 是一个相同的副本 for 循环遍历 unique in 中的所有字符串 如果 unique
  • CollectionBase 与泛型

    我正在将应用程序从 NET 1 1 迁移到 NET 2 0 我应该删除 CollectionBase 的所有使用吗 如果是这样 最好的迁移策略是什么 是的 最好看的类是 System Collections Generic 我通常使用列表
  • 如何记录 Doxygen 中不存在的变量?

    例如 我在配置文件中定义了 theme 全局变量 Doxygen 不处理该变量 但我想记录下来 我尝试这样做 var theme brief Active theme 但没有成功 您可以创建一个 doxygen 特定文件来记录变量 例如 配
  • 锁定时 AVAudioPlayer 在 iPhone 5 中不播放音频

    使用 AVAudioPlayer 我尝试在 iphone 播放器播放时播放声音 当设备锁定时也是如此 问题是 在 iPhone 4s ios 7 中 效果很好 但在带有 6 和 7 ios 的 iPhone 5 上没有任何反应 In the
  • 哪种 SQL 模式能够更快地避免插入重复行?

    我知道有两种不重复插入的方法 第一个是使用WHERE NOT EXISTS clause INSERT INTO table name col1 col2 col3 SELECT s s s WHERE NOT EXISTS SELECT
  • 由于超时,应用程序无法在模拟器上启动

    从过去 1 小时开始 我无法启动我的应用程序Eclipse Helios和我的控制台Eclipse给出以下错误 2011 11 21 10 37 00 PagingScrollerExample Failed to install Pagi
  • 以编程方式创建表

    我正在开发 devexreport 我想以编程方式创建一个表 我使用这些代码 但有一个小问题 DevExpress XtraReports UI XRTable tbl new XRTable DevExpress XtraReports
  • Windows 8 Metro 应用程序的依赖注入框架

    我似乎找不到 Windows 8 Metro 应用程序的依赖注入框架 win8 Metro应用程序有框架吗 Ninject 尚不支持 win8 Metro 那么有人有建议吗 城堡 春天 你可以尝试Unity 3 0 for NET4 5 预
  • 升级到 Visual Studio 16.3.0 后,dotnet ef 命令不再起作用

    这种情况首先发生在家里 所以我想这可能是我家里的台式电脑的问题 但现在我回到工作岗位 我尝试升级并得到了同样的结果 升级前截图 升级 Visual Studio 后的屏幕截图 我得到的错误是 无法执行 因为找不到指定的命令或文件 造成这种情
  • c#.net 中委托事件的超级简单示例? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个非常简单的例子来了解自己对这些事件的了解 我觉得很难理解互联网或书籍上提供的示例 这是公开事