C#Properties.Settings

时间:2014-07-02 02:20:10

标签: c#

我无法理解Properties.Settings语法的结构。我知道这等同于使用完全限定名称MyProject.Properties.Settings,而Settings是一个类。但是什么是Properties?另一名空间?命名空间MyProject和命名空间MyProject.Properties之间的关系是什么?

顺便说一句,我对此进行了详尽的研究,并对Properties.Settings的所有组成部分非常熟悉。我已经阅读了几十篇文章,但我没有遇到这个基本问题的答案。

3 个答案:

答案 0 :(得分:6)

首先,回答关于命名空间是什么的问题......来自MSDN

  

namespace关键字用于声明包含一组相关对象的范围。您可以使用命名空间来组织代码元素并创建全局唯一类型。

来自MSDN的另一个有用的页面:

  

... .NET Framework使用命名空间来组织其许多类,如下所示:

     

System.Console.WriteLine("Hello World!");

     

System是命名空间,Console是该命名空间中的一个类。

虽然命名空间可能有多种用途,但简而言之,声明命名空间可以为您提供组织类的方法。没有真正的""在他们自己。

如果使用上面的示例,Console类是System命名空间中仅事物,那么您从项目中删除了Console类(假设你创建了这个类),那么System命名空间就不再存在,因为它没有任何意义了。


Settings是一个类,位于MyProject.Properties命名空间中。我必须假设它们只是他们选择给它的命名空间名称 - 它似乎不是该命名空间中的任何其他类,它扩展的类驻留在System.Configuration命名空间中。

Settings类看起来像这样。基本上,它只是在您第一次使用静态Settings.Default访问它时创建自己的新实例。

namespace SampleWinforms.Properties
{
    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.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; }
        }
    }
}

但那里没有任何非静态的东西,那么你创造的实例是什么?它扩展了ApplicationSettingsBase,因此您也可以获得该类内容的实例。

那里有很多,但其中一个是允许你存储和检索值的索引器(假设密钥已经存在;我没有看到添加新方法的方法在运行时设置,但如果在编译时定义了设置,那么您可以读取该值并在运行时覆盖该值。

/// <summary>
/// Gets or sets the value of the specified application settings property.
/// </summary>
/// 
/// <returns>
/// If found, the value of the named settings property; otherwise, null.
/// </returns>
/// <param name="propertyName">A <see cref="T:System.String"/> containing the name of the property to access.</param><exception cref="T:System.Configuration.SettingsPropertyNotFoundException">There are no properties associated with the current wrapper or the specified property could not be found.</exception><exception cref="T:System.Configuration.SettingsPropertyIsReadOnlyException">An attempt was made to set a read-only property.</exception><exception cref="T:System.Configuration.SettingsPropertyWrongTypeException">The value supplied is of a type incompatible with the settings property, during a set operation.</exception><exception cref="T:System.Configuration.ConfigurationErrorsException">The configuration file could not be parsed.</exception><filterpriority>2</filterpriority>
public override object this[string propertyName]
{
  get
  {
    if (!this.IsSynchronized)
      return this.GetPropertyValue(propertyName);
    lock (this)
      return this.GetPropertyValue(propertyName);
  }
  set
  {
    SettingChangingEventArgs e = new SettingChangingEventArgs(propertyName, this.GetType().FullName, this.SettingsKey, value, false);
    this.OnSettingChanging((object) this, e);
    if (e.Cancel)
      return;
    base[propertyName] = value;
    this.OnPropertyChanged((object) this, new PropertyChangedEventArgs(propertyName));
  }
}

这个类反过来扩展SettingsBase,这是属性存储在名为&#34; PropertyValues&#34;的SettingsPropertyValueCollection中。

我无法进一步向下钻取,但SettingsPropertyValueCollection包含HashtableArrayList(用于存储密钥及其相关值)

它还有一个用于检索值的索引器,它基本上只查找您请求的值。

 public SettingsPropertyValue this[string name]
 { 
     get
     {
         object pos = _Indices[name];

         if (pos == null || !(pos is int))
             return null; 

         int ipos = (int)pos;

         if (ipos >= _Values.Count)
             return null;

         return (SettingsPropertyValue)_Values[ipos];
     }
 } 

答案 1 :(得分:4)

严格来说MyProject.Properties是一个自动生成的命名空间。里面类的默认名称是MyProject.Properties.Settings,它继承System.Configuration.ApplicationSettingsBase。您可以通过选中解决方案资源管理器顶部的Show All Files按钮,然后在MyProject-&gt; Properties-&gt; Settings.settings-&gt; Settings.Designer中打开生成的文件,轻松找到所有这些内容。 CS。这个命名空间和类没什么特别的,除了VS自动生成它们。

您可以轻松地在另一个执行相同操作的命名空间中编写自己的类。但这会让VS自动为你生成它。 :)

稍等一下。 System.Configuration.ApplicationSettingsBase课程会免费为您添加一些有价值的内容,例如INotifyPropertyChanged的实施。

答案 2 :(得分:1)

如果我理解你的问题,

MyProject.Properties 就像一个容器,您的项目可以管理您项目独立需要的所有静态引用(语言文件/图像/数据连接等)。它就像每个项目的预定义命名空间一样,这样您就可以轻松地知道在哪里寻找静态资源。