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

返回前测试属性是否为空Share

时间:2023-04-11 12:18:31 C#

返回前测试属性是否为空我有以下属性publicMyTypeMyProperty{get;set;}我想更改此属性,以便如果值为null,它会先填入值,然后返回……但不使用私有成员变量。例如,如果我这样做:publicMyTypeMyProperty{get{if(_myProperty!=null)return_myPropertyelse_myProperty=XYZ;返回_myProperty;}设置{_myProperty=值;}}这可能吗?或者我需要成员变量来完成它吗?您需要一个成员变量和一个完整的属性声明。自动实现的属性仅在它们是字段周围不相关的包装器时才适用,不涉及任何逻辑。顺便说一句,您可以稍微简化您的getter代码:get{if(_myProperty==null){_myProperty=XYZ;}返回_myProperty;(请注意,如果没有额外的锁定,这些都不是线程安全的,但我认为没关系。)顺便说一句,如果你使用自动实现的属性,你已经有一个私有成员变量——它只是编译器为你生成的。返回_myProperty??(_myProperty=XYZ);你能做的最好的就是在构造函数中给它一个值。我知道这样你就失去了“延迟加载”,但你不能同时拥有自动属性和延迟加载。你的代码:publicMyTypeMyProperty{get;set;}参见“自动属性”,这只是“语法糖”,你可以在这里查看。编译器为该属性生成一个字段,并在获取集中生成指向该字段的代码。内部类ClassName{//字段[CompilerGenerated]privateMyTypek__BackingField;//属性publicMyTypeMyProperty{[CompilerGenerated]get{returnthis.k__BackingField;}[CompilerGenerated]set{this.k__BackingField=value;所以你的代码将始终由编译器生成的字段支持。您将需要一个私有变量来实现它,因为您的getter/setter中有逻辑。如果您希望对获取或设置属性的行为进行任何装饰,那么您将失去编译器生成的存储位??置,因此您必须自己将值存储在某个地方。在大多数情况下,私有成员变量最有意义。我建议考虑使用延迟初始化。它不会帮助您避免成员变量,对此感到抱歉,但是这段代码将帮助您避免为成员变量保留内存,直到您的类需要该变量:publicclassMyType{publicMyType(){XYZ();}publicvoidXYZ(){//某种初始化}}publicclassTestType{privateLazy_myProperty;publicMyTypeMyProperty{get{return_myProperty.Value;}//_myProperty将是null,直到一些代码尝试读取它}}to另一件要指出或实际提醒的事情是,您将无法绝对没有成员变量。因为在幕后,.Net编译器将代替您创建该成员变量。它只是不会通知您这一步。但正如其他人所提到的,如果您查看生成的MSIL,您会看到为您创建的成员变量。你需要使用成员变量来做到这一点:publicclassMyClass{MyType_myProperty=null;publicMyTypeMyProperty{get{if(_myProperty==null)_myProperty=XYZ;返回_myProperty;}}}通过“成员变量”我假设你的意思是属性中定义的变量得到。是的,您当然不需要本地定义的变量。一种更常见的保存代码行的模式是:if(_myProperty==null)_myProperty=XYZ;返回_myProperty;如果您的意思是通过“成员变量”支持字段,那么是的,您确实需要一个。这只有在没有显式创建支持字段的情况下,才能通过完全简单的“传递”字段/属性关系实现。(即便如此,它也是由编译器创建的。)要实例化-if-null,您需要明确定义它。对的,这是可能的。但是你必须自己实现它,而不是自动属性。您的属性不一定只需要使用成员变量,尽管这是默认设置。请记住,属性实际上被转换为Getter和Setter方法,您可以在它们的范围内执行很多工作。尽管通常不鼓励这种做法。良好的实践表明属性访问应该是快速的并且不会长时间阻塞客户端代码。你可以这样做:publicMyTypeMyProperty{get{if(_myProperty!=null)return_myPropertyelsereturnXYZ;}设置{_myProperty=值;}}仅当您使用成员变量时。通常,我将延迟加载与IDisposable的实现相结合,以便可以在Dispose方法中释放任何需要清理的变量。如果需要该属性,则进行一些检查可以使其防弹。我倾向于使用类似的东西:publicMyTypeMyProperty{get{if(_myProperty==null)_myProperty==XYZ;返回_myProperty;}set{if(value==null)throwInvalidArgumentException();_myProperty=值;}}使TDD更简单。试试看以上是C#学习教程:返回前测试属性是否为空所有内容分享,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注——公共课MyClass{PublicMyTypeAlfa{If(this._Alfa==null)this.SetAlfa();返回_Alfa;}privateMyType_Alfa{get;set;}privatevoidSetAlfa(){//Somentthingtovalorize_Alfa}}本文收集自网络,不代表如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢