Table of Contents

标识符

Id 是形如 ModId.ItemId:SubId 的结构化标识符,用于跨 MOD 引用。

格式

形式 含义
example_mod.example 无 SubId,视为 0
example_mod.example:0 显式 SubId 为 0,与上面等价
example_mod.example:5 SubId 为 5

构造

// 从三部分构造
var id = new Id("example_mod", "example", subId: 0);

// 从字符串构造
var id2 = new Id("example_mod.example");
var id3 = new Id("example_mod.example:5");

// 使用 IParsable
var id4 = Id.Parse("example_mod.example", null);
Id.TryParse("example_mod.example", null, out var id5);

属性

id.ModId;      // "example_mod"
id.ItemId;     // "example"
id.SubId;      // 0

比较方法

针对不同维度的比较需求:

方法 比较的字段 用途
SameMod(other) ModId 判断是否同一 MOD
SameItem(other) ItemId 跨 MOD 识别同一物品
SameModAndItem(other) ModId + ItemId 同一 MOD 下的同一物品
SameItemAndSubId(other) ItemId + SubId 跨 MOD 的同一物品同一序号
SameAll(other) 全部字段 完全相等,等价 Equals

示例:

var a = new Id("mod_a", "sword");
var b = new Id("mod_b", "sword");
var c = new Id("mod_a", "sword", 1);

a.SameMod(b);           // false,MOD 不同
a.SameItem(b);          // true,ItemId 都是 "sword"
a.SameModAndItem(b);    // false
a.SameItemAndSubId(c);  // false,SubId 不同
a.SameAll(c);           // false

相等性

new Id("a", "b") == new Id("a", "b", 0);    // true
new Id("a", "b", 0) == new Id("a", "b", 1); // false

SubId 参与相等性判断。可以用作字典键。

ToString 格式

new Id("a", "b", 0).ToString();    // "a.b"
new Id("a", "b", 5).ToString();    // "a.b:5"

SubId 为 0 时省略 :0,其他值显式输出。

线程安全

Id 是不可变值类型,天然线程安全。可作为字典键跨线程共享。