实现“LazyProperty”类 - 这是一个好主意吗?

2024-05-29

我经常发现自己编写的属性是惰性评估的。就像是:

if (backingField == null) 
  backingField = SomeOperation();
return backingField;

代码不多,但如果您有很多属性,它确实会重复很多次。

我正在考虑定义一个名为 LazyProperty 的类:

public class LazyProperty<T>
    {
    private readonly Func<T> getter;

    public LazyProperty(Func<T> getter)
    {
        this.getter = getter;
    }

    private bool loaded = false;
    private T propertyValue;

    public T Value
    {
        get
        {
            if (!loaded)
            {
                propertyValue = getter();
                loaded = true;
            }
            return propertyValue;
        }
    }

    public static implicit operator T(LazyProperty<T> rhs)
    {
        return rhs.Value;
    }
}

这将使我能够初始化这样的字段:

first = new LazyProperty<HeavyObject>(() => new HeavyObject { MyProperty = Value });

然后属性的主体可以简化为:

public HeavyObject First { get { return first; } }

这将被公司的大多数人使用,因为它将进入我们大多数产品共享的公共类库。

我无法决定这是否是一个好主意。我认为这些解决方案有一些优点,例如:

  • 更少的代码
  • 更漂亮的代码

不利的一面是,查看代码并准确确定发生了什么会更加困难 - 特别是如果开发人员不熟悉 LazyProperty 类。

你怎么认为 ?这是个好主意还是我应该放弃它? 另外,隐式运算符是一个好主意吗?或者如果您应该使用此类,您是否更愿意显式使用 Value 属性?

欢迎提出意见和建议:-)


只是过于迂腐:

您建议的避免重复代码的解决方案:

private LazyProperty<HeavyObject> first = 
  new LazyProperty<HeavyObject>(() => new HeavyObject { MyProperty = Value });
public HeavyObject First { 
  get { 
    return first; 
  } 
}

实际上比您不想重复的代码更多的字符:

private HeavyObject first;
public HeavyObject First { 
  get {
    if (first == null) first = new HeavyObject { MyProperty = Value };
    return first;
  }
}

除此之外,我认为隐式转换使代码非常难以理解。我不会猜到一个简单地首先返回的方法实际上最终会创建一个 HeavyObject。我至少会放弃隐式转换并从属性返回first.Value。

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

实现“LazyProperty”类 - 这是一个好主意吗? 的相关文章

  • clangd 中有“includePath”选项吗?

    我曾经使用 VSCodeC C https marketplace visualstudio com items itemName ms vscode cpptools扩大 这个扩展中有一个功能 在 json 文件中 称为 includeP
  • 提高mmap memcpy文件读取性能

    我有一个从文件中顺序读取数据的应用程序 有些是直接从指向的指针读取mmaped 文件和其他部分是memcpyed 从文件到另一个缓冲区 我注意到在进行大型操作时性能不佳memcpy我需要的所有内存 1MB 块 以及在执行大量较小操作时的更好
  • Google Directions api Web 服务 - 在地图上显示响应。是否可以?

    有没有办法使用来自调用的 Google 方向 Web 服务的响应 例如来自如下 C 代码 var url System String Format http maps googleapis com maps api directions x
  • Visual Studio - 更改类时自动刷新类视图

    我有 Java 背景 多年来一直在使用 Eclipse 使用 Visual Studio 2008 时我错过的一项功能是 当我更改类时 类视图不会自动刷新 在 Eclipse 中 它有一个 类 大纲 窗口 它代表当前类并显示方法 属性等 这
  • Qt:将事件发布到 QThread 的正确方法?

    在我的 Qt 应用程序中 我有一个主线程和一个工作线程 工作线程子类QThread并通过处理事件customEvent 这是主线程发送要由工作线程处理的事件的正确方法吗 QThread myWorkerThread QApplication
  • 在简单/未命名的 C# LINQ 组连接中排序内部密钥源

    我知道这个问题由于用词不同而读起来很奇怪 但这是使用的术语这个 MSDN 页面 http msdn microsoft com en us library bb311040 aspx从我正在学习 LINQ 组的地方开始 我将解释它们 我正在
  • 如何获取picturebox非公开成员的值?

    我需要从 picturebox 的非公共成员获取图像矩形的值 如何获得该值 提前致谢 这是使用反射获取值的方法 PropertyInfo pInfo pictureBox1 GetType GetProperty ImageRectangl
  • 使用 fork/execvp 和系统调用之间的区别

    使用 system 执行二进制文件与使用 fork execvp 组合执行二进制文件有什么区别 安全性 可移植性 性能方面是否存在差异 系统还使用了一个fork exec 组合 如果你这样做fork exec您自己可以与正在运行的进程并行执
  • ASP.NET身份更改密码

    我需要能够由管理员更改用户密码 因此 管理员不应输入用户的当前密码 他应该能够设置新密码 我查看了 ChangePasswordAsync 方法 但该方法需要输入旧密码 因此 此方法不适合此任务 因此我通过以下方式做到了 HttpPost
  • SFINAE 在返回类型中工作,但不作为模板参数[重复]

    这个问题在这里已经有答案了 我已经使用过 SFINAE 习语很多次了 而且我习惯了把我的std enable if lt gt 在模板参数中而不是在返回类型中 然而 我遇到了一些微不足道的情况 它不起作用 我不知道为什么 首先 这是我的主要
  • x64 DLL 导出函数名称

    我正在尝试将 32 位 dll 和应用程序 移植到 64 位 并且我成功地构建了它而没有错误 当尝试使用我的 64 位应用程序加载它时 我注意到导出的函数名称不同 这就是我导出函数的方式 ifdef cplusplus extern C e
  • 是否有合法的方法使用运算符 << 打印元组和对?

    我有一组模板 函数 允许我打印元组 对 假设元组 对中的每种类型都有operator lt lt 为其定义的 不幸的是 由于 17 4 3 1 添加我的内容是非法的operator lt lt 重载到std 有没有其他方法可以让 ADL 找
  • 如何更改 gdb 中的值

    所以我有这个家庭作业代码 我必须使用 gdb 进行调试 我发现了问题 但不知道如何使用gdb来改变它 define ARRAYSIZE 12 for i ARRAYSIZE 2 i gt 0 i for j i j lt ARRAYSIZE
  • 字符集中字符的顺序

    是否通过标准保证字符的顺序 例如 我可以算出字符集表中 1 符号后面跟着 2 符号吗 或者它是特定于平台的 1999 年的 C 标准对字符集是这样规定的 基本源字符集和基本执行字符集都应具有以下成员 拉丁字母表中的 26 个大写字母 拉丁字
  • 动态方法的实际例子?

    我想学习动态方法及其使用 C 的实际示例 动态方法和Reflection有什么关系吗 请帮我 我们正在使用动态方法来加速反射 这是我们的反射优化器的代码 只比直接调用慢10 比反射调用快2000倍 public class Reflecti
  • 在所有 DataTable 列中查找字符串

    我正在尝试找到一种快速方法来在所有数据表列中查找字符串 跟随不起作用 因为我想在所有列值中搜索 string str whatever foreach DataRow row in dataTable Rows foreach DataCo
  • 无法从 GetSystemTime() 获取毫秒

    我正在尝试打印秒和毫秒分辨率计时 我正在使用GetSystemTime 这是我的代码 GetSystemTime datetime RETAILMSG 1 T Time After Data Sent to USB d d r n date
  • 实施黑名单的最有效方法

    我开发了一个 Ip 过滤器 并猜测我如何使用任何类型的 esque 数据结构开发一个非常高效且快速的黑名单过滤器 我想做的很简单 每个传入 传出连接我都必须检查被阻止的 IP 列表 IP是分散的 内存使用应该是线性的 不依赖于阻止列表的数量
  • C# 中线程之间发送消息

    如何在线程之间发送和接收消息 例如 一种解决方案是共享并发队列 尽管它的名称 并发队列 http msdn microsoft com en us library dd267265 aspx 这将允许您将一个对象从一个线程入队 并让另一个线
  • 使用 解释 gprof 输出

    我试图在我的程序中找到性能问题 从而通过分析来检测代码 gprof 创建一个如下所示的平面配置文件 Flat profile Each sample counts as 0 01 seconds cumulative self self t

随机推荐

  • Git 与人工制品

    刚刚完成 NPM 和 Bower 的 Artifactory 设置 它非常容易使用 您只需更改存储库 URL 一切就正常了 查看有关如何让 Artifactory 与 github vcs 一起使用的文档 它看起来过于复杂 我想知道是否有人
  • Oauth 2:access_token 是用户的唯一密钥吗?

    一个用户之后与 Facebook 连接 https developers facebook com docs authentication Facebook 回应access token 我可以假设这个吗access token将始终保持不
  • 使用 ui-router 的 angular.js,如何仅重新加载一个视图?

    我有一个相当简单的待办事项应用程序 使用 angular js 我正在使用 ui router 库 我查看了 github 上的 ui router 示例 https github com angular ui ui router tree
  • 如何从嵌套字典中获取键?

    我在字典中的字典中有一个列表 FirmA ProductA Color1 Color2 Color3 我想构建第一公司字典级别的键列表 然后 我需要根据公司密钥访问第二级产品字典 最后 我需要根据字典级别 2 产品 中的产品密钥访问颜色列表
  • 如何查找所有mysql表之间的所有关系?

    如何找到MySQL所有表之间的所有关系 例如 如果我想知道大约有 100 个表的数据库中表的关系 有什么办法知道这个吗 从编程角度来说 更好的方法是从以下位置收集数据 INFORMATION SCHEMA KEY COLUMN USAGE表
  • 我应该将哪个 STL 容器用于 FIFO?

    哪种 STL 容器最适合我的需求 我基本上有一个 10 个元素宽的容器 我在其中不断地push back新元素的同时pop front计算最旧的元素 大约一百万次 我目前正在使用std deque对于这项任务 但想知道是否std list会
  • Node WebKit 和 YouTube:chrome 未定义

    我正在开发一个应用程序Android iOS Mac OS and Windows using PhoneGap and Node WebKit 该应用程序已嵌入youtube videos These youtube视频在我的中运行良好M
  • 使用 flex 将项目与底部对齐

    我正在尝试使用 flex 将父级内部的项目与父级底部对齐 但由于某种原因它不起作用 我究竟做错了什么 login border 1px solid red height 50px display flex login border radi
  • 使用公钥时出现 InvalidKeySpecException

    我正在拼命尝试在 Android 上使用非对称公钥 私钥加密技术来加密消息 我在 Windows 上 使用 puttygen 生成了公钥和私钥 我不确定它有什么区别 但我选择了 SSH 2 RSA 这是公钥 AAAAB3NzaC1yc2EA
  • 如何将多个 parquet 文件附加到 Pandas 中的一个数据帧

    我正在使用 Spark 和 Pandas 解压缩 snappy parquet 文件 我有 180 个文件 我的 Jupyter 笔记本中有 7GB 数据 根据我的理解 我需要创建一个循环来获取所有文件 用 Spark 解压缩它们并附加到
  • “pylint”不被识别为内部或外部命令、可操作程序或批处理文件

    我使用的是 Windows 10 我使用命令安装了 pylint 包pip install pylint user并且安装成功 但是当我尝试在命令提示符中运行命令时 我得到了 pylint is not recognized as an i
  • 谷歌数据工作室计算字段的条件语句

    我正在使用谷歌数据工作室 我正在尝试使用创建一个计算字段case声明 但它不起作用 衡量标准是销售额 以下是示例行 CASE WHEN SUM sales gt 350000 THEN 1 ELSE 0 END 上面的公式给了我一个错误 如
  • 如何从 Xcode 4.5 卸载 iOS 5.0 模拟器

    我已经安装了 Xcode 4 5 由于我编写应用程序是为了好玩 我不打算支持旧版 iOS 版本 并且为了节省 500 GB iMac 上的空间 是否有办法删除它 尝试从 Xcode 包中支持的平台中删除 iPhone iPhoneSimul
  • Python 3.7 RPM 创建

    我正在尝试通过以下方式为 Python 3 7 3 创建 RPM 文件Python RPM https docs python org 3 distutils builtdist html但收到 文件未找到 错误 请按照以下链接查看日志 L
  • Azure git 部署 - 第二个程序集中缺少引用

    我正在尝试将 Bitbucket 部署设置到 Azure 网站 我成功链接了 Bitbucket 和 Azure 但是当我推送到 Bitbucket 时 我在 Azure 站点上收到以下错误 如果我单击 查看日志 它会显示以下编译错误 D
  • 我无法在本地主机上播放 .mp3 文件

    我正在使用 HTML jQuery 和 XML 制作音乐播放器 XML 文件包含所有歌曲的名称及其路径 我无法在本地访问 XML 文件 因为 Chrome 不允许这样做 所以我尝试在本地主机上运行它 但本地主机不允许我播放 mp3 我在本地
  • openSSL:PEM_write_RSAPublicKey 和 PEM_write_RSA_PUBKEY 之间的区别

    在 openssl 库中 我可以看到两种将公钥写入文件的方法 int PEM write RSAPublicKey FILE fp RSA x int PEM write RSA PUBKEY FILE fp RSA x 在文档中我可以看到
  • 为 python 的 csv 阅读器中的特定行添加下标?

    我希望能够通过 csv 阅读器访问 csv 文件的特定行 例如第四行 有没有办法用 python 的 csv reader 模块来做到这一点 您只需解析所有 CSV 文件 然后使用正常的排序索引即可 否则 你可以做这样的事情 def my
  • C# 为所有对象订阅相同的事件处理程序是线程安全的吗

    我的项目中有一种情况 我连接到多个服务器并监听事件 每当从服务器接收到事件时 Handler 就应该将该事件添加到公共队列中进行处理 所有连接都应将接收到的事件添加到队列中 foreach var item in collection Co
  • 实现“LazyProperty”类 - 这是一个好主意吗?

    我经常发现自己编写的属性是惰性评估的 就像是 if backingField null backingField SomeOperation return backingField 代码不多 但如果您有很多属性 它确实会重复很多次 我正在考