struct - 公开 Readonly 接口或公开 Readonly Struct 并参考原始?
问题描述
在里面class ItemContainer
,我有一个私人收藏public class Item
。我想将 Item 的属性公开给其他类,而不允许这些类更改它们,同时仍然能够从 ItemContainer 内部更改它们。所以我找到了两个选择。目前我有 Item 实现一个接口 IReadOnlyItem ...
public class Item : IReadOnlyItem
{
public int Amount {get; set;}
}
public interface IReadOnlyItem
{
public int Amount {get;}
}
这让事情变得很漂亮,因为我可以无缝地将 Item 对象传递给 IReadOnlyItem 参数,但问题是如果有人愿意,他们可以将 IReadOnlyItem 重新转换为 Item 并访问所有我不想要的东西他们可以访问。
另一种选择是制作一个单独struct ReadOnlyItem
的,其中仅包含对项目的私有引用,以及公开该项目中包含的值的属性获取器......
public struct ReadOnlyItem
{
public int Amount => item.Amount;
private Item item;
public ReadOnlyItem( Item item )
{
this.item = item;
}
}
这种方法似乎更难维护,这意味着我不能只将 Item 作为 IItem 传递,而是new ReadOnlyItem(item)
每次我想查看 Item 时都必须创建一个。
所以我的问题是,我们是否认为 struct 方法值得做以获得 Item 的内容始终安全的铁定安全性,或者接口方法是否足够好地表达了隐私的意图,我们不需要担心恶意编码器试图将其转换为原始类?
解决方案
推荐阅读
- llvm - llvm 在循环中通过添加函数调用(通过感应变量进行参数)
- html - 防止鼠标悬停在孩子上时父母调整大小
- ios - 错误 ITMS-90171:“无效的捆绑结构不允许使用二进制文件 MyApp.app/libswiftRemoteMirror.dylib
- c# - 如何检查输入的十进制值是否大于十进制列表
- android - 在发布模式下启用 Proguard 后 Firebase 应用内消息崩溃
- sql-server - 如何重命名 SQL Server 2016 数据库,包括物理文件,即 .mdf 和 .log 文件
- javascript - 比较 JavaScript 中对象数组的两个参数
- javascript - 我怎样才能承诺一个 AJAX 请求 onreadystatechange?
- python-3.x - 打印函数结果 python2 正确但 python3 错误
- android-studio - 将 Android Studio 更新到 3.3 后,Crashlytics 无法正常工作