C# 如何使用类型安全性装箱和取消装箱结构
在.NET平台中有一个我想用作我的类的状态。结构是内置的这一点很重要,因此我无法更改它。假设此内置结构是下面的C# 如何使用类型安全性装箱和取消装箱结构,c#,struct,thread-safety,type-safety,boxing,C#,Struct,Thread Safety,Type Safety,Boxing,在.NET平台中有一个我想用作我的类的状态。结构是内置的这一点很重要,因此我无法更改它。假设此内置结构是下面的ImmutableStruct struct ImmutableStruct { public string Value { get; } public ImmutableStruct(string value) { Value = value; } } 我的类必须是线程安全的,因此必须声明状态。当然,还有其他方法可以实现线程安全,但是可以说,对于特定情况,选择了vo
ImmutableStruct
struct ImmutableStruct
{
public string Value { get; }
public ImmutableStruct(string value) { Value = value; }
}
我的类必须是线程安全的,因此必须声明状态。当然,还有其他方法可以实现线程安全,但是可以说,对于特定情况,选择了volatile
字段作为最佳选项。因此,我对我的类编写如下代码:
class MyClass
{
private volatile ImmutableStruct _state = new ImmutableStruct("SomeString");
// Error CS0677
// 'MyClass._state': a volatile field cannot be of the type 'ImmutableStruct'
public ImmutableStruct State => _state;
/* Method that mutates the _state is omitted */
}
public class ReadonlyStructWrapper<T> where T: struct
{
public T Value { get; }
public ReadonlyStructWrapper(T value)
{
Value = value;
}
}
不幸的是,编译器不允许使用volatile
结构字段。因此,我决定使用:
这是可行的,但从对象强制转换会让我感到焦虑,因为程序可能会暴露在运行时错误中。我想要一个类型安全的解决方案,编译器确保程序在编译时的正确性。所以我的问题是:是否有任何方法可以使用类型安全性来装箱和取消装箱结构
顺便说一句,有一个关于将结构标记为volatile的相关问题:。我的问题是,它特别关注装箱/拆箱操作的类型安全性。如何创建这样的通用包装器:
class MyClass
{
private volatile ImmutableStruct _state = new ImmutableStruct("SomeString");
// Error CS0677
// 'MyClass._state': a volatile field cannot be of the type 'ImmutableStruct'
public ImmutableStruct State => _state;
/* Method that mutates the _state is omitted */
}
public class ReadonlyStructWrapper<T> where T: struct
{
public T Value { get; }
public ReadonlyStructWrapper(T value)
{
Value = value;
}
}
公共类ReadonlyStructWrapper,其中T:struct
{
公共T值{get;}
公共ReadonlyStructWrapper(T值)
{
价值=价值;
}
}
谢谢斯特伦的回答。这是一个相当漂亮的解决方案!