在表达式主体属性中调用新的 RelayCommand (ICommand) 是否安全

2024-01-01

通过表达式主体属性,我们可以创建一个RelayCommand如下

public RelayCommand Command => _command ?? (_command = new RelayCommand(CommandExecute));

然而这也是可能的

public RelayCommand Command => new RelayCommand(CommandExecute);

显然,这会在每次 Property 时创建一个新的 RelayCommandgetter叫做。尽管我看到一些评论说底层管道只创建一个命令......

有人对此有明确的答案吗?


有人对此有明确的答案吗?

该文档不承诺仅检索一次属性值。那么你must假设它可以多次检索它。

当然,实际上这种假设的行为可能永远不会发生。完全有道理的是,一旦检索到该属性,如果该属性从未发生过属性更改通知,则永远不会再次检索该属性,当然只读属性永远不会有属性更改通知。

所以你也许可以逃脱惩罚。但就我个人而言,我不会冒险。如果底层实现发生变化,或者您的假设由于任何原因是错误的,则同一命令的两个或多个实例将成为问题,至少如果该命令引发了CanExecuteChanged事件。我的意思是,我想如果CanExecute()状态永远不会改变,您可以拥有任意数量的对象副本,并且它们的工作方式完全相同。但如果它可以改变,那么您最终可能会在错误的命令对象上引发事件,而没有人在监听该事件。

这不仅仅是学术上的。 Microsoft 或您的代码有一天可能会使用的基于 XAML/MVVM 的 API 的其他一些实现者不仅可以选择放弃存储命令对象引用,而是指望能够始终从模型对象中检索它,而且从属性中检索命令对象是模型对象本身的常见做法。多次读取命令属性的情况是完全合理的并且值得担心。

更重要的是,我看不到背后的动机either选项。 “每次创建一个新的”对我来说显然是错误的,即使你可以逃脱它。延迟初始化似乎是过于复杂的代码,但没有任何好处。毕竟,在创建模型对象后,几乎总是会发生的下一件事是将属性绑定到 UI,因此此时将检索命令属性。延迟初始化最多会将底层字段的初始化延迟几毫秒(通常比这个时间短得多)。

如果你放弃惰性初始化,你可以使用自动属性:

public RelayCommand Command { get; } = new RelayCommand(CommandExecute);

没有明确的字段!好多了,恕我直言。

当然,请注意使用该语法CommandExecute()必须是一个static成员。大多数命令确实需要访问模型实例,因此上述命令不适用于这些命令。

惰性初始化模式流行的原因之一可能是它允许使用字段初始值设定项语法,这是通常的“不允许在字段初始值设定项中使用实例成员”规则的漏洞。

就我个人而言,对于使用当前实例的命令,我仍然会选择构造函数内初始化(这对于只读自动属性来说效果很好......您仍然不需要显式支持字段)。 Lazy-init 似乎还为时过早and在这种情况下错误优化。

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

在表达式主体属性中调用新的 RelayCommand (ICommand) 是否安全 的相关文章

  • 为什么使用abs()或fabs()而不是条件否定?

    在 C C 中 为什么要使用abs or fabs 不使用以下代码即可查找变量的绝对值 int absoluteValue value lt 0 value value 这与较低级别的指令较少有关吗 您提出的 有条件的abs 并不等于std
  • C++ 中的软(不是:弱)引用 - 这可能吗?有实施吗?

    在 C 中我正在使用boost shared ptr and boost weak ptr自动删除不再需要的对象 我知道这些与引用计数一起工作 在 Java 中 内存由垃圾收集器管理 它将内置对象引用视为strong WeakReferen
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐

  • 在 React 中更新 d3 元素?

    我正在尝试根据输入栏中的搜索输入更新此气泡图 现在 我将所有 d3 代码放入 Bubble js 中 然后在 app js 中 我有一个 searchinput 元素 它将过滤要显示的数据 然后在 Bubble 的状态中 我将其数据设置为等
  • UIPageViewController委托方法类似于scrollViewDidScroll:(UIScrollview*)scrollview

    我正在使用 UIPageViewController 来滑动一系列视图控制器 我希望父视图控制器的背景在滑动时根据视图之间滚动的位置在颜色之间平滑过渡 我希望 UIPageViewController 会有一个类似于带有位置的 scroll
  • 看起来像链接的按钮

    您好 我有一个要求 不允许我在页面上使用 javascript 我有一些asp LinkButtons但这些似乎使用了 javascript 所以我用按钮替换了它们
  • PHP 连接:关闭

    我有一个 PHP 应用程序 但遇到了一些问题 某些页面需要很长时间才能加载 几个小时后我发现了问题 但我不知道如何解决它 问题似乎出在标题上Connection keep alive 我使用了一个名为 Tamper Data 的 Firef
  • 如何在android中闪烁通知图标? [完毕]

    我搜索了很多东西 例如 如何在谷歌地图上显示闪烁的图标 https stackoverflow com questions 6729255 how to show icon blinking on google map 但根据这个我不知道如
  • Prolog 中 \+ 是什么意思?

    我在这里看到了一些使用它的答案 但我不知道它是什么意思或如何使用它 我也很难通过搜索引擎找到它 这是 无法证明 http en wikipedia org wiki Prolog Negation 操作员 如果其论证不可证明 则它成功 如果
  • 即使关闭 SSH 终端后,如何保持 Websocket 服务器运行?

    因此 我将 Ratchet 与 PHP 结合使用 并且目前已将一个成功的 websocket 示例上传到我的服务器 它在我进入 SSH 后起作用 然后只需手动运行 php bin chat server php 我想知道的是 在商业情况下
  • 更改 VSCode 用户设置位置

    我想将我的用户设置文件置于版本控制之下 最好是一个单独的文件夹 但我找不到告诉 VSCode 我的设置文件所在位置的选项 有没有办法更改 Visual Studio Code 查找的位置settings json file Update 由
  • 在多台 Mac 上开发 iPhone 应用程序

    这可能非常愚蠢 但我可以使用多台具有不同开发配置文件的 Mac 来制作应用程序吗 如果我带着我朋友的 Macbook 去旅行 而他也是一名开发人员并拥有自己的开发配置文件 我可以使用我自己的开发人员配置文件来处理我的应用程序而不干扰他的应用
  • 在 JavaScript 中初始化对象的空属性的正确方法是什么

    我有一个具有属性的对象 其中 1 个属性prop2只会在稍后初始化并在准备好时添加到该对象 我想将其显示为对象的属性 纯粹是为了人类可读性 这样当我稍后查看代码时 我就会知道它存在并且将 可以使用 所以我的问题是什么 是什么正确的方法初始化
  • 如何查看/更新数据库版本?有类似“fallbackToDestructiveMigration”之类的东西吗?

    修改后sq通过重命名其中一个表并添加另一个表来更改我的文件 我没有找到任何地方来指定数据库架构或版本已更改 并且我不想迁移 只需重新创建数据库 有关的文档官方网站 https cashapp github io sqldelight mul
  • 阻止访问 php.ini 文件

    我们在 Web 树的根目录中有一个自定义的 php ini 和 htaccess 文件 默认情况下 htaccess无法访问 但php ini可以访问 例如 http example com php ini 阻止访问 php ini 文件的
  • 在 Qt Creator 中进入 Qt 源代码(在 Ubuntu Linux 中)

    我在 Ubuntu 中使用 Qt Creator 它是从存储库安装的 但就像现在一样 调试时无法进入 Qt 源代码 我怎样才能启用它 由于Qt Creator使用gdb 因此需要配置gdb 首先要做的是安装 Qt 调试符号 apt get
  • 服务器时区值“CDT”无法识别或代表多个时区

    当尝试连接到我网站上的 mySQL 时 我收到此消息java sql SQLException 服务器时区值 CDT 无法识别或 代表多个时区 您必须配置服务器或 JDBC 驱动程序 通过 serverTimezone 配置属性 使用更多
  • MPMoviePlayerViewController 定制

    我正在使用 MPMoviePlayerViewController 播放器控件设置为 MPMovieControlStyleFullscreen 我对 MPMovieControlStyleFullscreen 中的一些按钮有问题 前进 后
  • 如何将原点置于 imshow() 图的中心

    作为模拟通过孔径的衍射的长程序的一部分 我正在摆弄尝试得到我的结果plt imshow 使其原点位于绘图的中心 即我希望更改轴 相关代码部分是 n 40 lam 0 0006 k 2 np pi lam z float input Type
  • 使用 PHP MySQL PDO 通过 OTP/2FA 登录

    它工作正常 除了 如果我在 otp 字段中输入一个数字 即使它与数据库中的数字不匹配 它也会转到 home php 您能告诉我代码有什么问题或丢失吗 谢谢你 if empty POST authenticate POST otp try o
  • 图像文件副本,正在被另一个进程使用

    我正在尝试创建一个用户 perfil 编辑窗口 在此窗口中有一个图像控件当我选择一个图像文件时 它将显示在这个图像控件中 并将该文件复制到我的图像文件夹中 第一次没问题 但第二次 它显示错误 该进程无法访问文件 C 1 jpg 因为它正在被
  • Qt 4.8.2 与 GCC 4.7.0.1 不断崩溃

    我已经下载了 Qt 4 8 2 库 Qt Creator 2 5 2 并使用 w32api 版本 3 13 和 GCC g 版本 4 7 0 1 手动安装了 MingW 我的操作系统是 Windows 7 Ultimate x64 我可以在
  • 在表达式主体属性中调用新的 RelayCommand (ICommand) 是否安全

    通过表达式主体属性 我们可以创建一个RelayCommand如下 public RelayCommand Command gt command command new RelayCommand CommandExecute 然而这也是可能的