- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 this 中看到了一些代码引起我注意的项目。
有一个简单的方法可以调用 List 上的 AsReadOnly。该方法没有对 ReadOnlyCollection 做任何事情,而是立即返回它并将其隐式转换为 IEnumerable。
如果您只需要一个 Enumerable,那么使用 AsReadOnly 有什么意义?
AsEnumerable 会是更好的选择吗?
private List<PaymentMethod> _paymentMethods = new List<PaymentMethod>();
public IEnumerable<PaymentMethod> PaymentMethods =>
_paymentMethods.AsReadOnly();
最佳答案
What is the point of using
AsReadOnly
if you only need an enumerable?
重点是AsReadOnly
确保低信任度的敌对或错误调用者无法转换回可变集合。
Would
AsEnumerable
be a better option?
没有。试试这个:
List<int> list = new List<int>{ 10, 20, 30 };
...
IEnumerable<int> seq = list.AsEnumerable();
// Or (IEnumerable<int>)list, or whatever.
...
List<int> list2 = (List<int>)seq;
list2[0] = 40;
现在我们改变了list[0]
.
但是AsReadOnly
防止这种情况,因为只读包装器不能转换回 List<int>
.
记住,AsEnumerable
只是一种编写强制转换的视觉上更好的方式,并且作为引用转换的强制转换是引用转换。引用未更改,可以更改回其实际类型!
当然,具有完全信任的恶意或错误调用者可以任意破坏安全系统,因为完全信任意味着完全信任。只读集合维护对原始集合的引用,并且可以通过反射检索该引用。
此外,请记住只读意味着只读,而不是不变。围绕可变集合的只读包装器仍然可以观察更改;您只是无法通过只读包装器更改它。
关于c# - 如果您最终将 AsReadOnly 转换到 IEnumerable 中,它是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57501296/
In 想知道此方法是返回集合的副本还是仅返回 ReadOnlyCollection 的实例,后者将以某种方式包装原始集合,而不读取所有引用。 我必须明白如果它会浪费内存空间,它会复制所有指针到我的实例
示例代码如下:只读扩展不适用于引用类型集合。如果我将 Employee 更改为字符串,那么它将起作用。有人可以解释为什么我会出现这种行为。 List Emps = new List(2
List dinosaurs = new List(); dinosaurs.Add("Tyrannosaurus"); dinosaurs.Add("Amargasaurus"); dinosaur
根据 MSDN,.AsReadOnly() 方法被列为受 PCL 支持,但我无法在我的 Xamarin PCL 上引用它。 任何人都可以验证这一点吗?如果是这样,是否有任何替代 .AsReadOnly
我在 this 中看到了一些代码引起我注意的项目。 有一个简单的方法可以调用 List 上的 AsReadOnly。该方法没有对 ReadOnlyCollection 做任何事情,而是立即返回它并将其
List工具 IReadOnlyCollection接口(interface)并提供AsReadOnly()返回 ReadOnlyCollection 的方法(它又实现了 IReadOnlyColle
我是一名优秀的程序员,十分优秀!