C#int和只包含int的结构之间的实际和理论差异

C#int和只包含int的结构之间的实际和理论差异,c#,.net,struct,C#,.net,Struct,对于C#缺少typedef的解决方案,我正在考虑我所看到的各种建议,即创建一个包含您想要“typedef”类型的一个成员的结构。例如: struct SpecialIndex { private int value; public SpecialIndex(int value) { this.value = value; } // implement necessary operations: add, IEquatable, increment, etc. //.

对于C#缺少typedef的解决方案,我正在考虑我所看到的各种建议,即创建一个包含您想要“typedef”类型的一个成员的结构。例如:

struct SpecialIndex {
  private int value;
  public SpecialIndex(int value) {
    this.value = value;
  }

  // implement necessary operations: add, IEquatable, increment, etc.
  //...
}

List<SpecialThing> specialThings = new List<SpecialThing> { ...... };

SpecialThing GetSpecialThingByIndex(SpecialIndex idx) {
  return specialThings[idx.value];
}

void Main() {
  SpecialIndex myThingIndex = new SpecialIndex(3);
  int someInt = 5 + 12;
  
  SpecialThing thing1 = GetSpecialThingByIndex(myThingIndex); // nice
  SpecialThing thing2 = GetSpecialThingByIndex(someInt); // woah sonny, what makes you think this is an index?
}
struct SpecialIndex{
私有int值;
公共特殊Lindex(int值){
这个值=值;
}
//执行必要的操作:添加、计算、增加等。
//...
}
列表特殊项=新列表{……};
SpecialThing GetSpecialThingByIndex(SpecialLindex idx){
返回specialThings[idx.value];
}
void Main(){
SpecialIndex myThingIndex=新SpecialIndex(3);
int-someInt=5+12;
SpecialThing thing1=GetSpecialThingByIndex(myThingIndex);//很好
SpecialThing thing2=GetSpecialThingByIndex(someInt);//哇,孩子,你怎么会认为这是一个索引?
}
撇开正确实现这样一个结构的潜在尴尬不谈,并假设其内部达到了标准,这种方法的技术和可用性问题是什么


谢谢

我在几个地方使用了这个
struct
包装器方法,结果总是好坏参半。我担心这始终是特定于用例的,您必须尝试看看它是如何为您工作的。下面是我的里程数

例如,如果您有
Dictionary
,创建两个类型并获取
Dictionary
,那么这对于可读性和可用性非常有效,特别是如果您使用此类类型执行一些LINQ查询。因此,这是一个我可以推荐的用例,也是一个对我有用的地方:为一组您不想混淆的值提供更精确的名称,特别是在底层类型相同的情况下

但是,它的正确性价值有限,因为包装的值通常来自系统外部(否则您将使用枚举、继承或重新设计API,对吗?)。因此,最后,只需将值验证从实际的索引访问移动到包装器类型的构造函数。您可能认为您从类型系统中获得了一些东西,但最终,您的包装器类型仍然接受
int
,并且您的API的使用者必须阅读文档,了解该
int
的约束是什么。但是,他们现在需要的不是访问他们想要使用的API,而是进一步导航一个地方并记住其他类型。由于这个原因,到目前为止,我在以这种方式定义特殊索引类型方面有过负面的经验


仅仅是吹毛求疵,
typedef
无法解决您的问题,因为它使用创建了一个类似于C#的
的类型别名,即没有创建新类型,类型仍然兼容,只有不同的名称。您要查找的是Haskell中的
newtype

我很好奇您对此类内容的使用案例是什么。我知道有一些(例如,在.Net中没有“数字”接口,这让很多人多年来做了很多艰苦的工作),但你的原因是什么呢?类似的C#特性是
使用SoneAlias=SomeType。包装器的语义是完全不同的。这种结构的一个实际用例是实现这样的东西:我不知道你在问什么。似乎你了解很多哥特加语;您必须实现所有运算符、接口等。您可以在
SpecialIndex
类型上使用
int
免费获得。听起来你希望有人为你列出所有这些问题。“这种方法在技术和可用性方面都有哪些缺陷?”——坦率地说,这对于堆栈溢出来说是一个过于宽泛的问题。对于这样一个问题,可能会有无数不同的答案,也没有明确的方法来区分你想要的答案。也就是说,这里的关键因素讨论见副本。另见非常密切相关的