Tag: 不变性

LINQ to SQL和不变性

我尝试使用LINQ to SQL。 Everythign工作得很好但似乎对不可变对象不友好。 LINQ to SQL要求我为不可变类创建一个无参数构造函数。 但我希望它是不可变的,所以我想只允许人们每次都使用所有必需的参数创建它。 同样,我需要在我的所有成员上安装。 有没有办法让我仍然可以使用LINQ 2 SQL而不放弃我的不变性? 这是我的代码: DataContext db = new DataContext(“myconnectistring”); Table myImmutableObjects = db.GetTable(); 它会抛出没有setter的exception,也没有没有参数的默认构造函数。

在运行时使对象不可变

是否有任何方法(利用我希望的reflection),我可以使实例化对象与其所有公共属性一起不可变? 我有一个来自别人的代码库(没有可用的源代码)的类,我需要利用它,如果任何代码片段在实例化之后尝试调用此类中的公共setter,我基本上都希望抛出exception。 注意:我不想在类周围创建一个包装器对象来实现它。 我很懒。

在C#中创建不可变类的最简洁方法是什么?

我发现自己必须创建许多不可变类,我想找到一种方法来做到这一点,没有多余的信息。 我不能使用匿名类型,因为我需要从方法返回这些类。 我想要intellisense支持,所以我不想使用词典,动态或类似的东西。 我还想要有名的属性,它排除了元组。 到目前为止,我尝试过一些模式: // inherit Tuple. This has the added benefit of giving you Equals() and GetHashCode() public class MyImmutable : Tuple { public MyImmutable(int field1, string field2, bool field3) : base(field1, field2, field3) { } public int Field1 { get { return this.Item1; } } public string Field2 { get { return […]

readonly是否有任何运行时开销?

出于某种原因,我一直认为readonly字段有与它们相关的开销,我认为这是CLR跟踪是否已初始化readonly字段。 这里的开销是一些额外的内存使用量来跟踪状态并在分配值时进行检查。 也许我假设这是因为我不知道readonly字段只能在构造函数内或字段声明本身内初始化,并且没有运行时检查,你将无法保证它不被多次分配各种方法。 但是现在我知道了,它可以很容易地被C#编译器静态检查,对吧? 那是这样的吗? 另一个原因是我读过readonly的使用对性能有轻微的影响,但他们从未涉及过这个主张,因此无法找到有关此主题的信息,因此我提出了问题。 我不知道运行时检查可能会对其他性能产生什么影响。 第三个原因是我看到readonly在编译的IL中保存为initonly ,所以如果readonly仅仅是C#编译器保证该字段永远不会分配给IL,那么这个信息在IL中的原因是什么?在构造函数或声明之外? 另一方面,我发现你可以通过reflection设置readonly int的值,而CLR不会抛出exception,如果readonly是运行时检查,这是不可能的。 所以我的猜测是:’readonlyness’只是一个编译时function,任何人都可以确认/否认这个吗? 如果是,那么这些信息被包含在IL中的原因是什么?

设计一个可变类,在它被消耗后变为不可变类

假设场景不允许实现不可变类型。 按照这个假设,我想了解如何正确设计一个在消费后变成不可变的类型的意见/例子。 public class ObjectAConfig { private int _valueB; private string _valueA; internal bool Consumed { get; set; } public int ValueB { get { return _valueB; } set { if (Consumed) throw new InvalidOperationException(); _valueB = value; } } public string ValueA { get { return _valueA; } set { if (Consumed) throw new […]

有没有办法将Json.Net反序列化与不可变类一起使用?

我正在使用一个使用json的API。 我有一些我为API建模而创建的类。 为了简化生活,我的模型使用公共属性,当将json反序列化为对象时,Json.Net将使用这些属性。 我想让我的对象不可变,但我遇到了一个问题,因为如果我将我的属性设为只读,我就会破坏反序列化。 有没有办法让我拥有不可变对象,并使用反序列化?

.NET枚举类型实际上是可变的值类型吗?

通过反思,在枚举类型的字段中查看,我惊讶地发现,保留枚举的特定实例的实际值的“支持”实例字段不是private ,正如我所想的那样,但是public 。 它也不是readonly 。 ( IsPublic true, IsInitOnly false。) 许多人认为.NET类型系统中的“可变”值类型是“邪恶的”,那么为什么枚举类型 (例如从C#代码创建) 就是这样? 现在,事实certificate,C#编译器有某种神奇的东西否认公共实例字段的存在(但见下文),但在例如PowerShell中你可以这样做: prompt> $d = [DayOfWeek]::Thursday prompt> $d Thursday prompt> $d.value__ = 6 prompt> $d Saturday 字段值value__可以写入。 现在,要在C#中执行此操作,我必须使用dynamic因为看起来使用正常的编译时成员绑定,C#假装public实例字段不存在。 当然要使用dynamic ,我们将不得不使用枚举值的装箱 。 这是一个C#代码示例: // create a single box for all of this example Enum box = DayOfWeek.Thursday; // add box to a hash set […]

并行应用程序的Mutable与Immutable

在我写的应用程序中,我需要编写许多基类型,这很可能是不可变的。 但我想知道可变类型在并行应用程序中如何与不可变类型进行比较。 你可以使用带有可变对象的锁,对吗? 它与并行应用程序中与不可变类型一起使用的其他技术相比如何? 你至少不使用具有不可变类型的锁,对吧?

用reflection实例化不可变对象

我创建了一个基类来帮助我减少C#中不可变对象初始化的样板代码, 我正在使用延迟初始化以尽量不影响性能,我想知道通过这样做我有多大影响性能? 这是我的基类: public class ImmutableObject { private readonly Func<IEnumerable<KeyValuePair>> initContainer; protected ImmutableObject() {} protected ImmutableObject(IEnumerable<KeyValuePair> properties) { var fields = GetType().GetFields().Where(f=> f.IsPublic); var fieldsAndValues = from fieldInfo in fields join keyValuePair in properties on fieldInfo.Name.ToLower() equals keyValuePair.Key.ToLower() select new {fieldInfo, keyValuePair.Value}; fieldsAndValues.ToList().ForEach(fv=> fv.fieldInfo.SetValue(this,fv.Value)); } protected ImmutableObject(Func<IEnumerable<KeyValuePair>> init) { initContainer = init; } protected T […]

不变性的真正定义?

我想知道如何定义不变性? 如果值没有公开,那么无法修改,那就够了吗? 是否可以在类型内修改值,而不是类型的客户? 或者只能将它们设置在构造函数中? 如果是这样,在双初始化的情况下(在结构上使用this关键字等)对于不可变类型仍然可以吗? 我怎样才能保证该类型是100%不可变的?