在 C# 中使用委托

2024-02-09

在 C# 语言和 .NET 框架中,你能帮助我理解委托吗? 我试图检查一些代码,发现收到的结果出乎我的意料。这里是:

class Program
{
    public static int I = 0;

    static Func<string> del = new Func<string>(I.ToString);

    static void Main(string[] args)
    {
        I = 10;
        Console.WriteLine("{0}", del());
    }
}

答案是 0,而不是 10。为什么呢?


原因如下:

您声明委托的方式直接指向ToStringstatic int 实例的方法。它是在创建时捕获的。

正如弗林德伯格在下面的评论中指出的那样,每个委托都有一个目标和要在目标上执行的方法。

在这种情况下,要执行的方法显然是ToString方法。有趣的部分是执行该方法的实例:它是I在创建时,这意味着委托没有使用I获取要使用的实例,但它存储对实例本身的引用。

后来你改变了I到不同的值,基本上是为其分配一个新实例。这不会神奇地改变委托中捕获的实例,为什么要这样做呢?

为了获得您期望的结果,您需要将委托更改为:

static Func<string> del = new Func<string>(() => I.ToString());

像这样,委托指向一个执行的匿名方法ToString就目前的I在执行委托时。

在这种情况下,要执行的方法是在声明委托的类中创建的匿名方法。该实例为 null,因为它是静态方法。

看一下编译器为委托的第二个版本生成的代码:

private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0);
private static string cctor>b__0()
{
    return UserQuery.I.ToString();
}

正如你所看到的,这是一个正常的方法某物。在我们的例子中,它返回调用的结果ToString在当前实例上I.

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

在 C# 中使用委托 的相关文章

  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 将键码转换为相关的显示字符

    在 C Windows Forms 项目中 我有一个不提供 KeyPressed 事件的控件 它是一个 COM 控件 ESRI 映射 它仅提供 KeyUp 和 KeyDown 事件 包含关键事件参数 http msdn microsoft
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 如何将 ng-bootstrap 与 AngularJS 2 一起使用(使用 angular-cli v1b15)?

    我一直在尝试按照 ng bootstrap 官方网站上的文档在我的 Angular 2 项目中使用 ng bootstrap 我所做的如下 npm install email protected cdn cgi l email protec
  • 如何以编程方式读取 iPhone iOS 5 上的通话记录

    我发现了很多在 iOS 4 上读取通话记录的代码示例 但似乎 iOS 5 上没有启用此功能 读取通话记录 DB 那么解决方法是什么呢 有没有任何 第三方 方法或技巧可以读取 iOS 5 中的通话记录 看看SpyPhone https git
  • F# 中的线程安全正态随机数生成器

    需要一个从正态 高斯 分布返回样本的随机数生成器 我已将以下部分移植到 F John D Cook 的 C 生成器 http www codeproject com Articles 25172 Simple Random Number G
  • Visual Studio Code 语法突出显示不起作用

    我使用 Visual Studio Code VSC 作为我的 IDE 我的计算机刚刚更新到 Catalina 10 15 2 19C57 自更新以来 VSCode 不再突出显示语法错误 我的扩展似乎正在工作 并且它可以识别我的 minic
  • Android RadioButton 允许检查多个

    我有一个大约有 30 个单选按钮的单选组 我查看了堆栈溢出 发现了一些关于意外允许检查多个单选按钮的帖子 他们是不在无线电组中 或者其 ID 有问题 https stackoverflow com questions 8265034 and
  • 无法整理和解析 R 文件(Linux 上的 R)

    我的 R 安装完全出了问题 我似乎无法再在 CRAN 上安装许多标准包了 由于某种原因 无法处理 Rd 文件 举个例子 当我尝试时 R gt install packages pbkrtest dep TRUE clean TRUE 我明白
  • 使用 Nuxt 部署到 Heroku 时获取 API 路由 404

    我不知道这里发生了什么事 我的应用程序在开发中工作得很好 但是当我推送到 Heroku 时 每当我尝试使用 Postman 或使用 Axios 访问任何路由时 它都会抛出 404 错误 我在这里做错了什么 这是我的index js cons
  • 即使在某些设备上授予所有必需的权限后,调用 WifiManager.startLocalOnlyHotspot() 也会引发 SecurityException

    我正在开发一个文件共享应用程序 我需要通过调用 WifiManager startLocalOnlyHotspot 以编程方式打开设备的仅本地热点 根据此页面上的 android 文档 https developer android com
  • 在CSS中,当我滚动滚动条时,
  • 的背景颜色消失了
  • HTML 代码如下 div ol li class a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa li li class b bbbbbbbbbbbbbbbbbbbbb
  • 使用 PointToScreen 在 wpf 中查找控件的位置

    我正在尝试在主窗口内找到用户控件的相对坐标 我尝试使用 Control PointToScreen 方法 但没有成功 每次我这样做时 我都会收到一个异常 System InvalidOperationException 此视觉对象未连接到P
  • 使用 -rpath 和 $ORIGIN 链接时查找失败

    我正在尝试学习如何使用 rpathGCC 链接器 ld 中的选项 ORIGIN 我正在尝试我能想到的最简单的例子 见下文 我读到的所有链接似乎都说我做得正确 但是 当我运行可执行文件时 它无法找到共享对象 除非我从内部运行它 ORIGIN
  • 使用截然不同的需要了解的信息集对产品进行建模并将它们链接到订单项?

    我目前正在一个网站上工作 该网站销售各种类型的定制产品 我已经得到了通用的标准购物车模式 订单有许多 LineItems LineItems 有一个产品 但我遇到了一些症结 假设我们的一个产品是一个球 而我们的一个产品是一盒蜡笔 当人们创建
  • 返回类型与 Object.getClass() 不兼容

    该代码是在 eclipse 上导入 webservice 文件时生成的 但是 我在编译时看到了这个错误 返回类型与Object getClass 有什么想法可以解决这个问题吗 public java lang String getClass
  • Firestore 模拟器 REST API 身份验证

    我正在寻找 Firestore 模拟器 REST API 处理未经身份验证的请求的方式的预期行为的一些确认 因为我认为我可能发现了一些可能的不一致之处 我一直在使用 Postman 的个人项目来使用 Firestore Emulator R
  • 实体框架 6.1 更新记录的子集

    我有一个仅封装的视图模型some数据库模型属性 视图模型包含的这些属性是我想要更新的唯一属性 我希望其他财产能够保持其价值 在我的研究过程中我发现this https stackoverflow com a 15339512 2015959
  • mediaelement.js - 在第一个视频末尾播放另一个视频

    由克罗克 Video forEveryone 推荐 我希望能够在第一个视频结束后自动播放第二个视频 然后在第二个视频结束后显示静态图像 经过一段设定的时间后 循环回到第一个视频 Thanks function audio video med
  • 启动带有视频的 Youtube 应用程序

    我有一个带有 UIButton 的应用程序 我希望 当我单击 iPhone 启动 Youtube 应用程序的按钮时 我的视频可以直接开始播放 我尝试了以下代码 UIApplication sharedApplication openURL
  • 如何查找表中长列的长度

    我在名为 Files 的表中有一个名为 FileSize 的 LONG 列 为了实现这一目标 我做了以下工作 我编写了这个 PL SQL 脚本来查找大小 declare long var LONG 0 begin dbms output p
  • 有状态 Rsocket 应用程序

    在我的项目中 我想让多个客户端连接到一个服务 我正在使用 java Rsocket 实现 该服务应该为每个客户端维护一个状态 现在 我可以通过某种标识符来管理客户端 这个选项我已经实现了 但我不想使用字符串手动管理会话 所以另一个想法是通过
  • 在 C# 中使用委托

    在 C 语言和 NET 框架中 你能帮助我理解委托吗 我试图检查一些代码 发现收到的结果出乎我的意料 这里是 class Program public static int I 0 static Func