繁体   English   中英

在设置类中向下转换-Visual Studio

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM