如何装箱和拆箱具有类型安全的结构
How to box and unbox a struct with type safety
.NET 平台中有 a struct,我想将其用作我的 class 的状态。重要的是该结构是内置的,所以我无法更改它。假设这个内置结构是下面的 ImmutableStruct
。
struct ImmutableStruct
{
public string Value { get; }
public ImmutableStruct(string value) { Value = value; }
}
我的class要求是线程安全的,所以必须声明状态volatile
。当然还有其他方法可以实现线程安全,但可以说 volatile
字段已被选为特定情况下的最佳选择。所以我这样编码 class:
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 */
}
不幸的是,编译器不允许 volatile
结构字段。所以我决定使用 boxing and unboxing:
class MyClass
{
private volatile object _state = new ImmutableStruct("SomeString");
public ImmutableStruct State => (ImmutableStruct)_state;
/* Method that mutates the _state reference is omitted */
}
这行得通,但是从对象进行转换让我感到焦虑,因为程序可能会出现 运行 时错误。我想要一个类型安全的解决方案,编译器在编译时确保程序的正确性。所以我的问题是:有什么方法可以对具有类型安全性的结构进行装箱和拆箱吗?
顺便说一句,有一个关于将结构标记为 volatile
的相关问题:。我的问题推迟了,因为它特别关注 boxing/unboxing 操作的类型安全。
像这样创建通用包装器如何:
public class ReadonlyStructWrapper<T> where T: struct
{
public T Value { get; }
public ReadonlyStructWrapper(T value)
{
Value = value;
}
}
.NET 平台中有 a struct,我想将其用作我的 class 的状态。重要的是该结构是内置的,所以我无法更改它。假设这个内置结构是下面的 ImmutableStruct
。
struct ImmutableStruct
{
public string Value { get; }
public ImmutableStruct(string value) { Value = value; }
}
我的class要求是线程安全的,所以必须声明状态volatile
。当然还有其他方法可以实现线程安全,但可以说 volatile
字段已被选为特定情况下的最佳选择。所以我这样编码 class:
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 */
}
不幸的是,编译器不允许 volatile
结构字段。所以我决定使用 boxing and unboxing:
class MyClass
{
private volatile object _state = new ImmutableStruct("SomeString");
public ImmutableStruct State => (ImmutableStruct)_state;
/* Method that mutates the _state reference is omitted */
}
这行得通,但是从对象进行转换让我感到焦虑,因为程序可能会出现 运行 时错误。我想要一个类型安全的解决方案,编译器在编译时确保程序的正确性。所以我的问题是:有什么方法可以对具有类型安全性的结构进行装箱和拆箱吗?
顺便说一句,有一个关于将结构标记为 volatile
的相关问题:
像这样创建通用包装器如何:
public class ReadonlyStructWrapper<T> where T: struct
{
public T Value { get; }
public ReadonlyStructWrapper(T value)
{
Value = value;
}
}