Tag: readonly

在C#中,不可变和只读是什么意思?

是否正确无法更改不可变对象的值? 我有两个关于readonly场景,我想了解: 如果我有一个集合并将其标记为readonly ,如下所示。 我还可以打电话给_items.Add吗? private readonly ICollection _items; 并且对于以下变量,如果稍后我调用_metadata.Change ,它将更改Metadata实例中的一对成员变量的内部值。 _metadata仍然是不可变的吗? private readonly Metadata _metadata; 对于上面的两个变量,我完全理解我不能在初始化器和构造器之外直接为它们分配新值。

可以在构造函数外部分配值的只读字段

有没有办法在类中有一个私有只读字段,可以在类中的任何位置分配值,但只有一次? 也就是说,我正在寻找一个私有只读类型的字段,它只能被赋值一次,但不一定在构造函数中。 因此,如果将一个值重新分配给一个字段,那么它会显示编译时错误(我确信这要求太多)。 如果有任何模式(不是语言特征)可以做同样的工作,那么真的有兴趣知道这一点。 谢谢你的关注。

在初始化列表中分配readonly属性

可以告诉我,为什么它会编译? namespace ManagedConsoleSketchbook { public interface IMyInterface { int IntfProp { get; set; } } public class MyClass { private IMyInterface field = null; public IMyInterface Property { get { return field; } } } public class Program { public static void Method(MyClass @class) { Console.WriteLine(@class.Property.IntfProp.ToString()); } public static void Main(string[] args) { // ************ […]

如何在C#中声明一个局部常量?

如何在C#中声明一个局部常量? 与在Java中一样,您可以执行以下操作: public void f(){ final int n = getNum(); // n declared constant } 如何在C#中做同样的事情? 我尝试使用readonly和const但似乎没有工作。 任何帮助将不胜感激。 谢谢。

为什么我不能在初始化器中初始化只读变量?

为什么我不能在初始化器中初始化只读变量? 以下内容不起作用: class Foo { public readonly int bar; } new Foo { bar=0; }; // does not work 这是由于CLR的某些技术限制吗? 编辑 我知道new Foo { bar=0; } new Foo { bar=0; }与new Foo().bar=0;相同new Foo().bar=0; ,但是CLR强制执行“readonly”,还是只是编译器限制?

不可变的只读引用类型和FXCop违规:不要声明只读可变引用类型

我一直试图绕过FXCop违规行为“DoNotDeclareReadOnlyMutableReferenceTypes” MSDN: http : //msdn.microsoft.com/en-us/library/ms182302%28VS.80%29.aspx 来自MSDN的代码会导致此违规: namespace SecurityLibrary { public class MutableReferenceTypes { static protected readonly StringBuilder SomeStringBuilder; static MutableReferenceTypes() { SomeStringBuilder = new StringBuilder(); } } } 从Jon 在这里和这里的答案,我理解持有对象引用的字段(在本例中为SomeStringBuilder)是readonly而不是对象本身(由new StringBuilder()创建) 所以以这个例子为例,一旦该字段引用它,我将如何更改对象本身? 我喜欢Eric Lippert关于如何更改readonly数组的示例 ,并希望看到类似于任何其他可变引用类型的内容

限制对只读属性的方法调用的访问

我有一个类,它定义了一个只读属性,可以有效地公开一个私有字段,如下所示: public class Container { private List _myList; public List MyList { get { return _myList;} } public Container() : base () { _myList = new List(); } // some method that need to access _myList public SomeMethod(int x) { _myList.Add(x); } } 现在消费者不可能直接管理我的属性,所以代码如aContainer.MyList = new List(); 生成编译时错误。 但是,消费者可以完全自由地在他所获得的引用上调用各种方法,因此这是完全有效的代码 Container c = new Container(); Console.WriteLine(c.MyList.Count); […]

如何只读静态字段为空?

所以这是我的一个课程的摘录: [ThreadStatic] readonly static private AccountManager _instance = new AccountManager(); private AccountManager() { } static public AccountManager Instance { get { return _instance; } } 如您所见,它是每个线程的单例 – 即该实例标有ThreadStatic属性。 该实例也被实例化为静态构造的一部分。 既然如此,当我尝试使用Instance属性时,我的ASP.NET MVC应用程序中是否有可能出现NullReferenceException?

如何使用C#中的setter覆盖仅限getter的属性?

更新 :此问题已经过修改,以使其更加清晰。 下面的答案似乎反映出这种方法效果很好。 希望这个问题可以帮助那些需要添加get或set to existing property的人。 今天遇到一个问题,我需要用get和set来覆盖基类的get -only属性。 目前的共识似乎是这是不可能的,但我认为我找到了一种方法。 一般的想法是创建一个new属性而不是直接override旧属性,然后我们创建一个桥接方法, override调用新的方法override旧的get方法。 情况 这是一些无法修改的任意预先存在的类型结构的代码。 public abstract class A { public abstract int X { get; } } public class B : A { public override int X { get { return 0; } } } 问题 我们想编写这段代码,但不会编译。 public class C : B // won’t compile: […]

protobuf-net如何处理只读字段?

我使用protobuf-net来序列化/反序列化我的数据。 我有一些相当简单的类,所以这不是真正的问题。 据我所知,protobuf-net使用IL生成来创建序列化/反序列化代码。 虽然我的模型中只有字段,但我想知道如何用IL写入这样的字段? 我可以清楚地看到它运作良好,但我不知道为什么…… 我试图在代码中窥探它,但它有点太复杂了。 我自己尝试生成此类代码总是会导致ILvalidation程序错误。