C#从get中返回一个只读变量; 组;

Jon*_*Jon 33 c# properties readonly

我发誓我已经看到了这个例子,但谷歌搜索了一下,找不到它.

我有一个类,它有一个对象的引用,需要有一个GET; 它的方法.我的问题是我不希望任何人能够摆弄它,即我希望他们得到它的只读版本(注意我需要能够在我的班级内改变它).

谢谢

Jon*_*eet 52

不,没有办法做到这一点.例如,如果您返回List<string>(并且它不是不可变的),则调用者能够添加条目.

这种方法的正常方法是返回一个不可变的包装器,例如ReadOnlyCollection<T>.

对于其他可变类型,您可能需要在返回之前克隆该值.

请注意,只返回一个不可变的接口视图(例如返回IEnumerable<T>而不是List<T>)将不会阻止调用者返回到mutable类型并进行变异.

编辑:请注意,除了其他任何东西,这种关注是不可变类型使得更容易推理代码的原因之一:)

  • 首先你说它不能完成然后你指向克隆解决方案.此外,克隆可能是c#的一个新概念,但它在c ++中已存在很长时间了.它也不是严格克隆 - 它创建内部数据的副本并返回此副本,而不是原始数据 - 副本不必与原始数据类型相同. (2认同)

Ant*_*lev 6

返回对精简接口的引用:

 interface IFoo
   string Bar { get; }

 class ClassWithGet
   public IFoo GetFoo(...);
Run Code Online (Sandbox Code Playgroud)

  • 理想情况下包括 IFoo 的“私有”或“内部”实现,以便它不能被回滚;) (2认同)