[英]Downcasting in Settings Class - Visual Studio
我正在使用Visual Studio v12.0,并在解决方案资源管理器中查看Settings.Designer.cs文件。 在Properties命名空间中,Settings派生类是从ApplicationSettingsBase类创建的,如下所示:
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
在课堂上,这行代码使我感到困惑:
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
我认为,这是一个垂头丧气的例子。 我不清楚为什么这是必要的。 为什么不创建一个Settings实例,因为它已被定义为继承基础?
这是一个较长的代码段:
namespace ConfigMgrTest.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
...rest of the namespace...
}
该行:
Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
相当于说:
Settings s1 = new Settings();
SettingsBase synchronizedBaseSettings = global::System.Configuration.ApplicationSettingsBase.Synchronized(s1);
Settings settings = (Settings)synchronizedBaseSettings;
因此,必须进行强制转换,因为ApplicationSettingsBase.Synchronized
返回SettingsBase
类型。 然后调用ApplicationSettingsBase.Synchronized
使设置对象成为线程安全的。 否则,您将必须:a)将defaultInstance
定义为SettingsBase
或b)不要调用ApplicationSettingsBase.Synchronized
并可能引起线程问题。
我想现在,方法ApplicationSettingsBase.Synchronized
将被声明为这样的泛型:
public static TSettings Synchronized<TSettings> (TSettings settingsBase) where TSettings: SettingsBase
但是此类可能比c#中的泛型要老;)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.