当前位置: 首页 > 编程语言 > C#

c#从int32派生分享

时间:2023-04-10 14:44:39 C#

c#从int32派生我有几个成员叫'Id'。最初我想将它们作为一个整体存储,但我想要一些保护层以确保我不会不小心将房间ID分配给一个人等。一种解决方案是typedef(使用RoomId=System.Int32;)然后我需要在所有文件中使用这些代码。例如,我更喜欢从int32派生的RoomId类,但我不知道如何设置它以允许显式转换(用于初始化),或者我应该以其他方式进行吗?如果我理解正确的话,你真正需要的唯一操作是相等比较。您可以创建一个RoomId类(或结构,任何适合您的)classRoomId{privateintValue{get;设置;}publicRoomId(intvalue){this.Value=value;}publicboolEquals(RoomIdother){返回这个。价值==其他.价值;}}RoomIdroom1=newRoomId(1);RoomIdroom2=newRoomId(2);//比较是否相等boolisItTheSameRoom=room1.Equals(room2);//或者如果你重载了相等运算符(==)boolisItTheSameRoom=room1==room2;如果需要,您可以实现IEquatable并重载相等和不等运算符。如果需要持久化,可以实现ISerializable接口,确保整数值只在真正需要时才“转义”类。你不能从Int32派生,但你可以指定一个隐式转换,这可能会给你你想要的行为:publicstructRoomId{privateint_Value;publicstaticimplicitoperatorRoomId(intvalue){returnnewRoomId{_Value=value};}publicstaticimplicitoperatorint(RoomIdvalue){returnvalue._Value;}}//...RoomIdid=42;控制台.WriteLine(id==41);//错误Console.WriteLine(id==42);//真正的Console.WriteLine(id41);//真Console.WriteLine(id*2);//84publicstaticexplicitoperatorRoomId(intvalue){returnnewRoomId{Id=value};然后你可以这样做:RoomIdvariable=(RoomId)10;在C#中无法从Int32或任何其他值类型派生类。您不能在.NET中继承值类型(结构,包括Int32)。最接近的选择是创建一个仅包含Int32的结构。这将需要相同数量的空间,但可能受限于您的确切结构。如果需要,您可以稍后更改结构以包含其他信息。(但请注意,这可能是一个重大的API更改。)我的偏好是使用简单的T4模板来动态生成自定义类型。这是我最近在个人项目中使用的示例。第10行是生成的类型列表。这些东西中的每一个都是一个int,但现在它们是强类型的。这也通过避免通常的“原始痴迷”反模式,将代码转向使用更多功能范例。我正在使用一个模板。随时更新/修改(如果您添加了任何有用的内容,请告诉我们其他人)。以上就是C#学习教程:由int32派生的c#分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注——usingSystem;使用System.Collections.Generic;使用系统。组件模型;使用System.Diagnostics.Contracts;//ReSharper禁用CheckNamespace[ImmutableObject(true)]publicstruct:IComparable>{public(intvalue){Value=value;}[纯]publicintValue{get;}[Pure]publicboolEquals(other)=>Value==other.Value;[纯]publicoverrideboolEquals(objectobj){if(ReferenceEquals(null,obj))returnfalse;如果(等于(this,obj))返回真;返回obj.GetType()==GetType()&&Equals(()obj);}[纯]publicoverrideintGetHashCode(){unchecked{return(base.GetHashCode()*397)^Value;}}[纯]publicstaticbooloperator==(left,right)=>Equals(left,right);[纯]publicstaticbooloperator!=(left,right)=>!Equals(left,right);[纯]publicintCompareTo(other)=>Equals(this,other)?0:Value.CompareTo(other.Value);[浦re]publicstaticbooloperatorleft,right)=>Comparer>.Default.Compare(left,right)(left,right)=>Comparer>.Default.Compare(left,right)>0;operatorleft,right)=>Comparer>.Default.Compare(left,right)=(left,right)=>Comparer>.Default.Compare(left,right)>=0;[纯]publicoverridestringToString()=>$"{nameof(Value)}:{Value}";}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: