使用闭包来跟踪变量:好主意还是肮脏的伎俩?

2023-12-14

好的,我需要能够跟踪值类型对象,这些对象是另一个对象上的属性,如果这些属性不实现 IObservable 接口或类似接口,这是无法完成的。然后我想到了闭包和 Jon Skeet 的著名例子,以及如何多次打印 9(或 10),而不是按升序排列的数字。所以我想为什么不这样做:

Class MyClass
{
    ...
    Func<MyValueType> variable;
    ...
    public void DoSomethingThatGetsCalledOften()
    {
        MyValueType blah = variable(); //error checking too not shown for brevity
        //use it
    }
    ...
}
... in some other consuming code ...
MyClass myClass = new MyClass();
myClass.variable = () => myOtherObject.MyOtherProperty;
//then myClass will get the current value of the variable whenever it needs it

显然,这需要对闭包的工作原理有一定的了解,但我的问题是:这是一个好主意还是一个肮脏的黑客行为和对封闭系统的滥用?

Edit:由于有些人似乎误解了我想说的内容,这里有一个控制台程序来演示它:

using System;
using System.Linq;

namespace Test
{
    class Program
    {
        public static void Main()
        {
            float myFloat = 5;
            Func<float> test = () => myFloat;
            Console.WriteLine(test());
            myFloat = 10;
            Console.WriteLine(test());
            Console.Read();
        }

    }
}

这将打印出5 then 10.


您偶然发现了著名的公案:关闭是穷人的目标。您正在使用Action<T>替代 type 的属性获取器T。在更动态的语言中,这样的事情会(稍微)不那么肮脏,因为它可以通过注入用日志记录函数装饰的 getter 来实现,但在 C# 中,没有一种优雅的方法可以在对某人的属性进行猴子修补时他们并不期待它。

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

使用闭包来跟踪变量:好主意还是肮脏的伎俩? 的相关文章

  • 为什么 C 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • platformnotsupportedException :XSLCompiledTransform.Load(xslt) 未在 .net Core 2.1 目标框架中加载带有 的 xslt 文件

    我有一个 xml 文件 需要将其转换为 txt 为此我使用了 xslt 转换 我的 xslt 转换文件包含一些支持 javascript 函数 如果我在 net Framework 4 5 及更高版本中运行代码 我可以成功转换文件 但相同的
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • Guid.NewGuid().GetHashCode() 用于数据库

    这对于用作数据存储 SQL Server 的 ID 可靠吗 我会使用 guid 但我更喜欢数字值 A guid更有可能代表一个记录uniquely than a numeric value 随着 GUID 确保全球唯一性 GUID 可以跨数
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • ASP.NET Core 中间件与过滤器

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

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 任何人都可以清楚地告诉如何在不使用像 这样的预定义函数的情况下找到带有小数值或小数值的指数吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 例如 2 0 5 1 414 所以想要 我是 c 的新手 所以请解释简单的逻辑 如果不是复杂的逻辑也足够了 在数学中 从整数取幂到实数
  • 将键码转换为相关的显示字符

    在 C Windows Forms 项目中 我有一个不提供 KeyPressed 事件的控件 它是一个 COM 控件 ESRI 映射 它仅提供 KeyUp 和 KeyDown 事件 包含关键事件参数 http msdn microsoft
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work

随机推荐

  • 将科学记数法转换为十进制 pandas python

    可能这是一个老问题 我在下面发现了类似的问题 但我仍然可以在输出文件中看到科学记数法 抑制 pandas 中的科学记数法 熊猫读科学计数法并改变 Python Pandas 科学记数法不一致 我尝试合并set option and df a
  • 扩展 EntityType 以允许通过 AJAX 调用设置额外的选择

    我尝试创建 Symfony 自定义类型延伸核心 entity type 但我想用它选择2版本4 0 0 ajax 现在适用于 select html 元素 而不是像以前那样适用于隐藏的 input 此类型应创建一个空选择 而不是扩展 实体
  • 从 const 成员函数中将“this”返回为非常量

    我想在类上进行方法链接Point below include
  • Curl 无法验证 Verisign 颁发的通配符 SSL 证书

    我有一个脚本需要使用 cURL 安全连接到网站 foo bar com 该网站由 bar com 的通配符 SSL 证书覆盖 通配符证书由 Verisign 颁发 所有浏览器都信任它 没有任何问题 但是 我无法让 PHP cURL 连接 至
  • VS Code 仅显示 1 行可能的导入路径。如何将其转换回默认列表框?

    我想我在 vs code 中做了一些设置更改 这使得我的导入语句看起来像这样 默认 VS Code 导入预览显示 3 个或更多路径 我应该更改什么选项才能将其恢复为默认列表框视图 我的设置 json 上次 vscode 更新到 v1 51
  • UITableView 在设备旋转后纠正滚动位置

    我正在构建类似书籍阅读器的东西 当用户旋转手机时我想增加字体大小 我正在使用一个UITableView显示文本块 问题是 增加字体大小会增加表格视图中行的高度 如果我在纵向模式下阅读第 320 段 我会在横向模式下得到 280 或类似的内容
  • 使用 JQuery 动态加载列表项

    我想构造我的 JQuery 以一次淡入每个单独的项目 这是行为的一个例子 这是我迄今为止拥有的 JQuery li css display none delay 1000 fadeIn 800 这可能不是最好的解决方案 但它应该有效 li
  • Windows 窗体的大小是否包括其边框?

    当您设置窗口窗体的大小时 即 Form1 Size new System Drawing Size 700 500 这是否包括窗口在窗体周围放置的边框 因为我已经将 700x500 的图像 通过 pictureBoxes 添加到我的表单中
  • 如何通过 $http 将 angular-ui 的 typeahead 与服务器绑定以进行服务器端优化?

    预输入示例 http angular ui github io bootstrap typeahead 提到在这个自动完成中实现后端很容易 但没有提供示例 我特别感兴趣的是找出当前输入的字符串 以便我可以发送that到服务器并发回已经过滤的
  • NSDateFormatter 和日本日历

    当用户不使用公历作为 iPhone 的默认日历时 我在使用 NSDateFormatter 时遇到问题 NSString testString 2011 01 14 NSDateFormatter dateFormat NSDateForm
  • 在c#中将值参数传递给任务

    我在将 long 按值传递给任务时遇到问题 我有一个 ID 列表 我循环遍历每个 ID 分配给局部变量 然后作为参数传递给新任务 在循环并处理下一个 ID 之前 我不会等待任务完成 我保留了一系列任务 但这无关紧要 loop long ID
  • Scala 宏:定义顶级对象

    我看了type macros对于斯卡拉 但是当我想从示例创建对象时 我收到错误 Example scala 7 gt or lt expected type Test url String macro impl Example scala
  • 如何更改 git 子模块的远程存储库?

    我创建了一个 git 存储库 其中包含一个子模块 我可以告诉子模块本身更改其远程存储库路径 但我不确定如何告诉父存储库如何更改子模块的远程存储库路径 如果我有点运气不好并且必须手动执行操作 我不会感到惊讶 因为即使删除子模块也不容易 您应该
  • stringi 安装错误:配置:错误:C 编译器无法创建可执行文件

    我正在尝试安装stringi最近将 R 更新到最新版本后的软件包 但是 我遇到了这个错误 installing source package stringi package stringi successfully unpacked and
  • 将 HTML5 Canvas 转换为要上传的文件?

    标准 HTML 文件上传的工作原理如下
  • SQL Server 2005/2008 - 为什么没有架构名称的用户可以使用 sys.sysobjects 视图?

    我注意到 SQL Server Express 2008 中有一些奇怪的行为 并且我一直在尝试找出原因 创建新数据库时 无需指定架构标识符即可访问 sys sysobjects 视图 如下所示 SELECT FROM sysobjects
  • C while 循环 - 代码不起作用

    我一直在编写一个简单的程序来检查输入字母是否是元音 但我的代码不起作用 程序应该一一输入字符 直到输入 这将使程序退出 它检查输入字符是否为元音 并打印结果 如果输入不是字母 它还会报告错误 问题是 它在第 二步中打破了循环 提前感谢您的帮
  • 如何识别 WPF 网格上哪个单元格被单击?

    我有一个 3x3 矩阵网格 如果用户位于特定单元格上 单击后如何识别单元格坐标 请指教 谢谢 八打灵再也 假设您正在设计一个井字棋风格的游戏 并且所讨论的网格是标准的 WPF 网格 我想您最好在每个单独的单元格中放置一个控件 这样你就可以挂
  • Symfony2 - 启动 symfony2 命令的进程

    我的目标是在后台启动一些耗时的功能 以避免用户在呈现服务器响应之前等待 我有一个 Symfony 项目 我正在其中从控制器启动异步进程 此过程将启动 Symfony 命令来调用另一个控制器 问题是当我用以下命令调用流程时start proc
  • 使用闭包来跟踪变量:好主意还是肮脏的伎俩?

    好的 我需要能够跟踪值类型对象 这些对象是另一个对象上的属性 如果这些属性不实现 IObservable 接口或类似接口 这是无法完成的 然后我想到了闭包和 Jon Skeet 的著名例子 以及如何多次打印 9 或 10 而不是按升序排列的