我有一个类Bar,它有一个包含引用类型Foo的私有(private)字段。我想在公共(public)属性(property)中公开Foo,但我不希望该属性(property)的消费者能够改变Foo...但是它应该在内部是可改变的通过Bar,即我无法将字段设置为readonly。所以我想要的是:private_Foo;publicFoo{get{returnreadonly_Foo;}}...这当然是无效的。我可以只返回Foo的克隆(假设它是IClonable),但这对消费者来说并不明显。我应该将属性的名称更改为FooCopy吗?它应该是GetCopyOfFoo方法吗?您认为最佳实践是什
为什么ReSharper在下面的示例中为“设置”建议只读字段?如果我理解正确的话,如果你只在构造函数中更改这个字段,你应该使用readonly修饰符,但在我的示例中,我也在同一个类的另一个方法中更改它。我错过了什么?publicpartialclassOptionsForm:Form{privateSettingssettings;publicOptionsForm(Settingss){settings=s;}privatevoidSaveData(){settings.ProjectName=TextBoxProject.Text;}} 最佳答案
我注意到“常见做法和代码改进”下的ReSharper建议:将局部变量或字段转换为常量。我还注意到,在BillWagner的《EffectiveC#:50SpecificWaystoImproveYourC#》一书中,有一个语言成语“Preferreadonlytoconst”,作者在其中解释了使用const的风险。我的问题不是关于readonly和const之间的区别以及何时使用它们,而是为什么一个来源将const视为一种常见的做法/代码改进,而另一方面,第二个来源将readonly视为一个习语? 最佳答案 私有(private)常
我需要在反序列化后初始化私有(private)只读字段。我有以下数据契约(Contract):[DataContract]publicclassItem{publicItem(){//ConstructornotcalledatDeserialization//becauseofFormatterServices.GetUninitializedObjectisused//sofieldwillnotbeinitializedbyconstructoratDeserialization_privateReadonlyField=newobject();}//Initialization
考虑:classFoo{privatereadonlystring_value;publicFoo(){Bar(ref_value);}privatevoidBar(refstringvalue){value="helloworld";}publicstringValue{get{return_value;}}}//...varfoo=newFoo();Console.WriteLine(foo.Value);//"helloworld"这如何编译,仍然有效?我不应该能够在构造函数之外为_value字段分配不同的值,因为它被标记为readonly。但是,通过ref传递给方法,确实可以操
我有一个包含集合的类。我想提供一个返回集合内容的方法或属性。如果调用类可以修改单个对象是可以的,但我不希望它们在实际集合中添加或删除对象。我一直在将所有对象复制到一个新列表,但现在我想我可以将列表作为IEnumerable返回。在下面的简化示例中,GetListC是返回集合的只读版本的最佳方式吗?publicclassMyClass{privateListmylist;publicMyClass(){mylist=newList();}publicvoidAdd(stringtoAdd){mylist.Add(toAdd);}//Returnsthelistdirectlypublic
我有一个类,在构建时,从数据库中加载它的信息。该信息都是可修改的,然后开发人员可以调用SaveE()来将其保存回数据库。我也正在创建一个类,它将从数据库中加载,但不允许对其进行任何更新。(只读版本)我的问题是,我应该创建一个单独的类并继承,还是应该更新现有的对象以在构造函数中获取一个只读参数,还是应该完全创建一个单独的类?现有类已经在代码中的许多地方使用。谢谢。更新:首先,这里有很多很好的答案。只接受一个是很难的。谢谢大家。看起来主要的问题是:满足基于类名和继承结构的期望。防止不必要的重复代码可读和只读之间似乎有很大的区别。只读类可能不应被继承。但是一个可读的类表明它在某个时候也可能获
C#是否允许不能修改的变量?它就像一个const,但不必在声明时为其赋值,该变量没有任何默认值,但只能在运行时赋值一次(编辑:并且可能不是来自构造函数)。或者这是不可能的? 最佳答案 是的,在C#中有多种方法可以做到这一点。首先,什么是“变量”?变量是存储位置。局部变量、方法的形式参数(以及索引器、构造函数等)、静态和实例字段、数组元素和指针解引用都是变量。一些变量可以声明为“只读”。“只读”变量只能通过声明中的初始值设定项或构造函数更改一次。只有字段声明可以是只读的;C#不支持用户声明的只读局部变量。对只读变量有一定的限制,有助于
以下不编译。publicclassA{privatereadonlyinti;publicA(){voidSetI(){i=10;}SetI();}}失败并出现此错误:CS0191Areadonlyfieldcannotbeassignedto(exceptinaconstructororavariableinitializer)从技术上讲,我们仍然不在构造函数中,因为局部函数的可见性是有限的,所以我想知道为什么它不能编译。 最佳答案 编译器将SetI局部函数到一个单独的类级方法中。由于这个单独的类级方法不是构造函数,因此您不能从中
我有一个包含大量数据的绑定(bind)DataGridView。问题是某些单元格必须是只读的,并且当用户在单元格之间使用TAB或ENTER导航时,应该绕过只读单元格。加载后立即将某些特定单元格设为只读的最佳方法是什么?考虑到网格有大量数据,在我设置DataSource后循环遍历单元格不是一个好主意。此外,在CellEnter上将单元格设置为ReadOnly不起作用,因为在使用TAB键导航时,我必须已经知道下一个单元格是否为ReadOnly。 最佳答案 尝试在绑定(bind)数据之前将列而不是单个单元格设置为只读:this.dgrid