![]() |
1
6
一种防止这种情况的方法是 AsReadOnly() 为了防止这种邪恶行为。我认为真正的答案是,在返回类型等方面,您不应该依赖于公开的接口/契约之外的任何东西。做任何其他事情都会破坏封装,阻止您将实现换成其他不使用列表而只使用t[]的实现,等等。 编辑: 像你提到的那样下投基本上是违反了 Liskov Substition Principle |
![]() |
2
2
在这种情况下,可以定义自己的集合类,该类实现
|
![]() |
3
2
接口是对它必须做的最少一组事情的实现的约束(即使“做”不超过抛出
|
![]() |
4
1
我在与.NET(以及一些很快就会跳转到黑客解决方案的人)合作时学到的一件事是,如果没有其他东西,反射通常会让人们通过你的“保护”
其他一些技巧,比如使内容只读或将实际列表隐藏在包装器后面,都只是权宜之计。如果您真的需要的话,可以使用反射轻松地挖掘类型以拉出私有列表。我认为有些属性可以应用于类型,以防止人们反映到类型中。 同样,只读列表也不是真的。我可能想办法修改列表本身。我几乎可以肯定地修改列表上的项目。因此只读是不够的,副本或数组也是不够的。您需要原始列表的深层副本(克隆),以便在某种程度上实际保护数据。 但真正的问题是,你为什么对合同如此激烈 你写的 . 有时,当别人的库设计得很差,并且没有公开它需要的东西(或者一个bug需要你去挖掘来修复它)时,反射黑客是一个很方便的解决方法,但是当你控制了接口和接口的使用者,就没有理由不让公开的接口像你需要它来完成你的工作。 或者简而言之: 如果需要列表,不要返回IEnumerable,返回列表。如果你有一个IEnumerable,但你确实需要一个列表,那么从IEnum创建一个新列表并使用它会更安全。仅仅因为“我知道这实际上是一个列表,所以这是可行的”,所以很少有理由(甚至更少,也许没有,很好的理由)去选择一个类型 是的,你可以采取措施阻止人们这样做,但1)你越是努力与坚持要破坏系统的人斗争,他们就越难试图打破系统,2)他们只是在寻找更多的绳子,最终他们会得到足够的绞刑。 |
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |