我无法理解Properties.Settings
语法的结构。我知道这等同于使用完全限定名称MyProject.Properties.Settings
,而Settings
是一个类。但是什么是Properties
?另一名空间?命名空间MyProject
和命名空间MyProject.Properties
之间的关系是什么?
顺便说一句,我对此进行了详尽的研究,并对Properties.Settings
的所有组成部分非常熟悉。我已经阅读了几十篇文章,但我没有遇到这个基本问题的答案。
答案 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
包含Hashtable
和ArrayList
(用于存储密钥及其相关值)
它还有一个用于检索值的索引器,它基本上只查找您请求的值。
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 就像一个容器,您的项目可以管理您项目独立需要的所有静态引用(语言文件/图像/数据连接等)。它就像每个项目的预定义命名空间一样,这样您就可以轻松地知道在哪里寻找静态资源。