- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个永远无法更改的常量值数组。我尝试这样的事情....
public class ColItem
{
public string Header { get; set; } // real header name in ENG/CHI
public string HeaderKey { get; set; } // header identifier
public bool IsFrozen { get; set; } = false;
public bool IsVisible { get; set; } = true;
public int DisplayIdx { get; set; }
}
public struct DatagridSettingDefault
{
public static ImmutableArray<ColItem> DataGrid_MarketPriceTab = ImmutableArray.Create(new ColItem[] {
new ColItem { HeaderKey = "ORDER_ID", IsFrozen = true, DisplayIdx = 0 },
new ColItem { HeaderKey = "PRICE_RENAMEPROMPT", IsFrozen = false, DisplayIdx = 1 },
new ColItem { HeaderKey = "PRICETBL_TRADESTATENO", IsFrozen = false, DisplayIdx = 2 },
new ColItem { HeaderKey = "PRICETBL_BIDQTY", DisplayIdx = 3 },
new ColItem { HeaderKey = "PRICETBL_BID", DisplayIdx = 4 },
new ColItem { HeaderKey = "PRICETBL_ASK", DisplayIdx = 5 },
new ColItem { HeaderKey = "PRICETBL_ASKQTY", DisplayIdx = 6 }
}
然而,这个数组仍然从代码的某个地方(另一个线程)被改变。我怎样才能使数组常量并且在程序的整个生命周期内绝对不能改变?我只需要在编译时初始化它,无论什么引用或其他线程改变它,它都不应该改变。但我的情况一直在变化。
例如,如果我稍后在代码中或通过另一个线程执行类似操作,它会发生变化...
HeaderKey = col.Header.ToString(),
Header = "whatever"
IsFrozen = col.IsFrozen,
IsVisible = true,
DisplayIdx = col.DisplayIndex
我该如何解决?
最佳答案
你不需要ImmutableArray<T>
.只需这样做:
DataGrid_MarketPriceTab
从可变字段到 getter-only 属性。IReadOnlyList<T>
而不是 ImmutableArray<T>
因为它内置于 .NET 的 BCL 而 ImmutableArray<T>
添加对 System.Collections.Immutable
的依赖.Array
。 ( ColItem[]
) 但因为对它的唯一 引用是通过 IReadOnlyList<T>
那么不使用反射就无法更改集合。
{ get; }
-only 属性意味着你的类的消费者不能重新分配属性值。static readonly
领域。您还需要制作 ColItem
不可变的 - 这可以通过使所有成员属性来完成 { get; }
而不是 { get; set; }
(并确保它们的类型也是不可变的):
像这样:
// This is an immutable type: properties can only be set in the constructor.
public class ColItem
{
public ColItem(
string headerName, string headerKey, int displayIdx,
bool isFrozen = false, bool isVisible = true
)
{
this.Header = headerName ?? throw new ArgumentNullException(nameof(headerName));
this.HeaderKey = headerKey ?? throw new ArgumentNullException(nameof(headerKey));
this.IsFrozen = isFrozen;
this.IsVisible = isVisible;
this.DisplayIdx = displayIdx;
}
public string Header { get; }
public string HeaderKey { get; }
public bool IsFrozen { get; }
public bool IsVisible { get; }
public int DisplayIdx { get; }
}
public struct DatagridSettingDefault // Why is this a struct and not a static class?
{
public static IReadOnlyList<ColItem> DataGrid_MarketPriceTab { get; } = new[]
{
new ColItem( headerName: "Order Id", headerKey: "ORDER_ID", isFrozen: true, displayIdx: 0 ),
new ColItem( headerName: "Price", headerKey: "PRICE_RENAMEPROMPT", IsFrozen:false, displayIdx:1 ),
new ColItem( headerName: "Foo", headerKey: "PRICETBL_TRADESTATENO", IsFrozen:false, displayIdx:2 ),
new ColItem( headerName: "Bar", headerKey: "PRICETBL_BIDQTY", displayIdx:3 ),
new ColItem( headerName: "Baz", headerKey: "PRICETBL_BID", displayIdx:4 ),
new ColItem( headerName: "Qux", headerKey: "PRICETBL_ASK", displayIdx:5 ),
new ColItem( headerName: "Hmmm", headerKey: "PRICETBL_ASKQTY", displayIdx:6 )
};
}
如果您觉得所有这些都很乏味,我同意!好消息是if you're using C# 9.0 or later (which requires .NET 5, unfortunately) you can use Immutable Record Types , 所以 class ColItem
类变为 record ColItem
:
public record ColItem(
string Header,
string HeaderKey,
bool IsFrozen = false,
bool IsVisible = true,
int DisplayIdx
);
关于c# - ImmutableArray如何正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65661142/
有什么方法(可能是肮脏的 hack)来创建一个只使用指定数组而不是复制它的 ImmutableArray? 我有一个我知道不会改变的数组,我想创建一个 ImmutableArray 以允许客户端安全地
为什么 ImmutableArray Microsoft Immutable Collections NuGet 包版本中似乎没有 1.0.34 ? 最佳答案 ImmutableArray不存在于您的
我有一个带有静态成员的内部静态类 MyLists: internal static ImmutableArray MyList = new ImmutableArray { "asd", "q
所以我在多线程环境中工作,我不想一直使用 ImmutableArray,因为它是线程安全的。 不幸的是,ImmutableArray 实现线程不安全接口(interface),因此 LINQ 中的 S
我正在尝试对现有的 ImmutableArray 进行切片在一种方法中,我认为我可以使用构造方法 Create(ImmutableArray a, int offset, int count)像这样:
我在 ImmutableArray<> 中遇到了一个看起来很奇怪的错误(使用 BCL 不可变集合 v1.0.12.0,运行时 .NET 4.5): 我在同一命名空间下的同一源文件中有以下两个完全相同的
假设我有如下方法: unsafe void Convert(byte* ptr, int length) { var span = new Span(ptr, length); var
ImmutableArray 之间有什么区别?和 ImmutableList ,最好在哪里使用它们? 最佳答案 以下是一些可能有助于解释的读物:Please welcome ImmutableArra
当我尝试隐式转换时出现此错误: Cannot implicitly convert type 'System.Array' to 'System.Collections.Immutable.Immut
问题 我在两个相应的 dll 中有以下代码。 dll1 依赖于 dll2。 当 DoWork()被调用它将执行 myInterface.MyListMethod(ImmutableList.Empty
我是一名优秀的程序员,十分优秀!