实现一个带有自动属性的单例是个好主意吗?我最近发现了一些关于自动属性的东西并且非常喜欢它们。目前,我正在尝试在任何地方使用它们。不仅能够在任何地方使用它们,而且更多地了解它们在大多数情况下的工作方式。现在我正在制作一个单身人士并想:“嘿,让我们在这里尝试自动属性”。公共类MySingleton{公共静态MySingletonMySingleton{得到;私有集;}privateMySingleton(){}staticMySingleton(){MySingleton=newMySingleton();所以我的问题是:“像这样实现单例是个好主意吗?”我不是在问一般情况下单身是否是个好主意。我个人不会这样做。我不喜欢将自动实现的属性与私有setter一起使用,在这种情况下,您永远不会调用您希望只读变量返回的只读属性。只有一行代码更明确地说明了你的意思:publicsealedclassMySingleton{privatestaticreadonlyMySingletonmySingleton;公共静态MySingletonMySingleton{得到{返回mySingleton;}}privateMySingleton(){}staticMySingleton(){mySingleton=newMySingleton();这样一来,甚至没有人会尝试更改单例类来重新分配属性或变量,因为编译器会阻止它们。他们必须添加一个设置器和/或使变量不可读,这是一个更大的变化——希望他们重新考虑。换句话说:从C#6开始,使用只读的自动实现属性会更容易:}=新的MySingleton();privateMySingleton(){}staticMySingleton(){}}我会从与Jon略有不同的方向来处理这个问题。无论对象是否是单例,从逻辑上讲,它是否最好首先建模为属性?属性应代表...属性。(明显队长再次出击!)你知道的。颜色。长度。高的。姓名。父母。您在逻辑上认为是事物属性的所有事物。我无法想象一个对象上的属性在逻辑上是单例的。也许你想出了一个我没有想过的场景;今天早上我没有吃健怡胡椒博士。但我怀疑这是对模型语义的滥用。您能描述一下什么是单例吗?为什么您认为它是某物的属性?总而言之,我自己经常使用这种模式;通常是这样的:classImmutableStack{privatestaticreadonlyImmutableStackemptystack=whatever;publicstaticImmutableStackEmpty{get{returnemptystack;}}...逻辑上“空”是不可变的堆栈属性?不,这是能够说varstack=ImmutableStack.Empty;的引人注目的好处。逻辑上胜过我对财产的渴望。说varstack=ImmutableStack.GetEmpty();看起来很奇怪。在这种情况下,拥有一个readonly字段和一个常规属性,还是一个静态ctor和autoprop比首先将其作为一个属性更好,这似乎不是一个有趣的问题。在“纯粹主义者”的情绪中,我可能会站在Jon一边,将其设为只读字段。但出于懒惰,我也经常将autoprops模式与私有setter一起用于逻辑上不可变的对象。如何解决各方面的问题?我看不出有任何理由认为这是不正确的。毕竟,自动属性只是私有(编译器生成的)访问器支持字段的语法糖。当然,我看不出有什么问题。车产?不,我不在单身人士身上使用二传手,是的,我这样做。我认为你想要比汽车财产给你更多的控制权。...请提供建设性的反馈。在这家受人尊敬的公司,这感觉像是一个勇敢(或愚蠢)的举动......我的场景是一个WPF应用程序,有一个可以加载和保存的当前项目。当前项目设置在整个应用程序中使用...我在代码中保留了所有“噪音”,因为有些人可能会发现它很有用。类设置:INotifyPropertyChanged{私有静态设置_currentSettings=newSettings();///当前项目的唯一当前设置。[JsonIgnore]//所以它没有被JSON.NETpublicstaticSettingsCurrentSettings序列化//http://csharpindepth.com/Articles/General/Singleton.aspx{}//setter是将新设置加载到当前设置中(使用JSON.NET)。嘿,它有效。可能不是线程安全的。内部设置{Log.Verbose("CurrentSettings已重置。项目名称:{projectName}",value.ProjectName);_currentSettings=值;_currentSettings.IsChanged=false;NotifyStaticPropertyChanged("CurrentSettings");}}//http://10rem.net/blog/2011/11/29/wpf-45-binding-and-change-notification-for-static-properties///当当前CurrentTvCadSettings加载新设置时触发///对StaticPropertyChanged事件感兴趣的所有侦听器的事件队列。公共静态eventEventHandlerStaticPropertyChanged=delegate{};privatestaticvoidNotifyStaticPropertyChanged(stringpropertyName){StaticPropertyChanged?.Invoke(null,newPropertyChangedEventArgs(propertyName));}//各种实例属性,包括get....publicstringSet;}[JsonIgnore]publicboolIsChanged{get;放;用于将单例设置设置为新加载项,设置非常简单Settingssettings=newSettings();//加载、保存、反序列化、设置属性,疯狂Settings.CurrentSettings=settings;setter可能不是线程安全的,但我只是将它设置在UI线程上的一个位置,所以我不害怕你可以按照http://csharpindepth.com/Articles/General/Singleton.aspx上的尊重建议进行操作线程安全我意识到OP没有询问WPF,但我认为这与说明您可能想要设置单例的原因有关。我这样做是因为这是最简单的解决方案。使用称为计算属性(又名表达式成员)的lambda样式(>=C#6)来包装+替代语法:该代码在功能上与JonSkeet的答案相同,此处再次使用“实例”。我不期待这样的荣誉,但我认为这个较新的包装器在一个地方有一个解释是值得的,因为这个C#6问答扩展了旧的封闭线程,它讨论了Singleton变体。您可能会争辩说,具有显式缺失集的自动属性样式表达了更清晰的只读属性意图,但最终它是基于样式的,并且这两种样式在现代C#中都很常见。publicsealedclassMySingleton{publicstaticMySingletonInstance=>newMySingleton();//确保实例化只进行一次(因为静态属性)并且以线程安全的方式进行,因为这是只读属性的替代样式,所以没有setterprivateMySingleton(){}//确保,实例化不能从类外部完成staticMySingleton(){}//确保部分惰性,见下文}这里是一个包含所有细节和历史参考的地方:关于惰性讨论:http://csharpindepth.com/Articles/General/Beforefieldinit.aspx简单总结:只要类中没有引入其他静态字段/属性,上面的实现就是惰性的。(但这是一个你可以依赖.NET实现的领域。)讨论单例和线程安全的不同实现(旧的C#风格):http://csharpindepth.com/Articles/General/Singleton.aspx原始线程(closed):C#的单例模式以上是C#学习教程:用自动属性实现单例好不好?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
