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

如何检查一个结构体是否已经被实例化?分享

时间:2023-04-10 14:30:13 C#

如何检查一个结构体是否已经被实例化?我有一个结构(出于这个问题的目的)几乎模仿了内置的Point类型。我需要在使用它之前检查它是否已经被实例化。当它是Point时,我可以这样做:if(this.p==null)但现在它会产生以下错误:Operator'=='cannotbeappliedtooperandsoftype'ProportionPoint'and"HowdoIcomparemystructurewithnull用于比较?还有另一种检查实例化的方法吗?结构是一种值类型-它永远不会为null。您可以检查default(ProportionPoint),它是结构的默认值(例如零)。但是,对于某个点,可能是默认值-原点-也是“有效”值。相反,您可以使用Nullable。结构是值类型,与引用类型相反,它们永远不能为null。您可以检查默认值:if(this.p.Equals(default(ProportionPoint)))因为p是结构它永远不会为null所以你应该将它与其默认值进行比较。为了检查你的值和默认值之间的等价性。如果你使用==并且你会得到cannotbeappliedtooperandsoftype'ProportionPoint'和'ProportionPoint'错误,因为默认情况下结构没有得到==的实现。所以你需要重载==和!=运算符,如下:publicstaticbooloperator==(firstOperandop1,secondOperand2op2){returnop1.Equals(op2);}publicstaticbooloperator!=(firstOperandop1,secondOperand2op2){return!op1.Equals(op2);}然后:if(this.p==default(ProportionPoint))另一种选择是直接使用Equals:f(this.p.Equals.default(ProportionPoint))结构不能为空。它是一种值类型,而不是引用类型。您需要检查具有默认值的属性。类似于:if(pX==0&&pY==0)该构造永远不能为null,因此您不能将它与null进行比较。并且结构总是被初始化——如果没有,编译器使用默认值。使用可空:ProportionPoint?p1=空;if(p1==null)...orif(!p1.HasValue)...与引用类型的变量或值不同,引用类型是该类型的零或对实例、结构变量或值的引用那是一个结构实例。如果有一段代码以{PointmyPoint;开头...}{点myPoint;...}{点myPoint;...},并且块中的任何内容都不会关闭MyPoint(当块中有yieldreturn时,或者当封闭块中的变量被lambda或匿名方法使用时,会发生闭包),然后是Point的实例将在执行进入块之前的某个时间存在,并且可能在执行离开块后的任何时间不再存在。结构存在于可以使用结构类型变量的任何上下文中。所有结构类型都被认为具有无操作默认构造函数的原因是结构类型隐式存在。当一个人执行像Point[]myPoints=newPoint[100];这样的语句时Point[]myPoints=newPoint[100];,它创建一个由100个点结构组成的零填充数组;在此过程中,立即出现100个零填充点实例。在C++中,如果一个类型有一个构造函数,那么创建该类型的数组时,在任何代码被授予对该数组的访问权限之前,按顺序调用数组中每个元素的构造函数。如果在构造任何元素时抛出异常,编译器生成的代码将在数组本身消失之前对已成功创建的每个元素运行确定性析构函数。虽然这是一个非常强大的功能,但将其包含在.net中会使框架变得相当复杂。我制作了一个仅适用于结构的扩展方法:publicstaticboolIsNull(thisTsource)whereT:struct{returnsource.Equals(default(T));}调用会话:if(myStruct.IsNull())DoSomething();我知道它并没有真正检查它是否为空。但是,如果我给它一个更准确的名称,如IsEmpty或IsDefault,在六个月内我就会忘记它的存在并且看到可用方法列表时不会选择它。从技术上讲,这不是空检查;但从概念上讲是。结构变量不能为空,一种选择是将其声明为可为空。结构不能为空,但如果您真的想在任何时候存储一个等于默认值的值,则根据其默认值检查结构的变通方法可能会产生误报。(例如,值(0,0,0)可能是未更改的默认值,或者它可能将原点存储在3D空间中。)避免这种假阴性问题的另一种方法是向结构添加另一个属性-例如bool或int-跟踪数据是否实际存储在其中。然后让任何构造函数初始化结构并使用实际数据将此值设置为true/1。在默认结构中,此值仍然为false/0,因此根据默认值default(MyStruct)检查default(MyStruct)应该给出误报,即使存储在其中的所有其他数据都与默认值匹配。以上就是C#学习教程:如何查看结构体是否已经实例化?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——publicStructMyStruct{publicfloatx{get;私有集;}publicboolinitialized{get;私有集;}publicMyStruct(float_x){x=_x;初始化=真;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: