我正在使用VS2010 C#.NET 3.5和应用程序设置(Settings.settings文件).我想要做的是为我的开发和生产环境设置不同的设置,而不必使用条件语句检查调试模式来丢弃我的代码.这个问题的常见方法是什么?
我试图在手机ApplicationSettings中保存两个对象列表,但我遇到了一个奇怪的问题(但可能是我在某个地方犯了一个愚蠢的错误).
如果我只保存其中一个列表,它可以正常运行 - 它将保存它,并在下次启动应用程序时重新加载它.但是,如果我尝试保存2个列表,它们似乎都没有正确保存.没有错误或任何东西,只是"空白".
见下面的代码.
//My save method
public void Gem()
{
var settings = IsolatedStorageSettings.ApplicationSettings;
if (settings.Contains(INDTASTNINGER_LIST))
{
settings[INDTASTNINGER_LIST] = _indtastningsListe;
}
else
settings.Add(INDTASTNINGER_LIST, _indtastningsListe);
if (settings.Contains(INDTASTNINGER_LIST2))
{
settings[INDTASTNINGER_LIST2] = _indtastningsListe2;
}
else
settings.Add(INDTASTNINGER_LIST2, _indtastningsListe2);
settings.Save();
}
//Constructor supposed to load settings
public Indtastninger()
{
var settings = IsolatedStorageSettings.ApplicationSettings;
if (settings.Contains(INDTASTNINGER_LIST))
{
_indtastningsListe = null;
_indtastningsListe = (List<Indtastning>)settings[INDTASTNINGER_LIST];
}
if (settings.Contains(INDTASTNINGER_LIST2))
{
_indtastningsListe2 = null;
_indtastningsListe2 = (List<Indtastning>)settings[INDTASTNINGER_LIST2];
}
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?如果我用"list2"注释掉部分,第一个将被完美地保存/检索.
里德·科普西 (Reed Copsey) 对以下 SO 问题做出了回应:
我更喜欢创建一个用于设置查询、加载和保存的界面。通过使用依赖注入,我可以将其注入到需要它的每个组件中。
有人可以给出这样的代码示例吗?例如,电子邮件客户端的设置类和 FTP 客户端的另一个设置类,基于这个可以是 DI 的“接口”。我知道您可以对应用程序中的所有设置进行全局单例(我目前正在这样做),但是 Reed 的这个建议很有趣,并且想尝试一下。
我在运行时保存应用程序设置有一些问题...
如果我将设置范围更改为用户,它可以正常工作,但在应用范围内,没有任何事情发生...
我用过:
Properties.Settings.Default.Save();
Run Code Online (Sandbox Code Playgroud)
有任何想法吗 ?
谢谢
我已经阅读了单例导致代码出现问题的所有原因,但在以下场景中我找不到替代方案。
我有一个 Java Swing 应用程序。用户可以通过 GUI 设置影响应用程序显示和功能的设置,这些设置存储在 XML 配置文件中并从 XML 配置文件中检索。加载应用程序时,会构造一个 SettingsManager 对象。在构造函数中,设置管理器解析 XML 配置文件并将所有设置存储在本地以便快速访问(我将其称为缓存)。当应用程序中的设置发生更改时,该设置会立即写入文件,但缓存也会同时更新。
如果设置管理器的多个实例被创建,当一个设置在一个实例中被更改时,其他的缓存变得陈旧。在不使用单例的情况下,解决此问题的一种可能方法是不使用缓存并始终从文件中检索设置。这不是一个可怕的想法,但它不是可取的。如果我这样做了,我想我还必须做一些额外的工作才能使其线程安全。
如果 SettingsManager 是 Singleton,则只有一个缓存,因此它永远不会过时。但是,我已经看到这不是一个好主意,因为它现在本质上是一个全局变量,不需要访问设置的类现在可以访问它们。从我阅读的内容来看,还有很多其他问题。
那么有没有其他方法来设计它来解决这个问题而不使用单例?
我有几行代码可以运行好几个月,现在突然他们不工作,我得到一个非常奇怪的错误.这是有问题的功能:
public void OnCommandsRequested(SettingsPane settingsPane, SettingsPaneCommandsRequestedEventArgs eventArgs) {
UICommandInvokedHandler handler = new UICommandInvokedHandler(OnSettingsCommand);
SettingsCommand appSettings = new SettingsCommand("appSettings", "??????", handler);
eventArgs.Request.ApplicationCommands.Add(appSettings);
}
Run Code Online (Sandbox Code Playgroud)
当然,这会响应SettingsPane.GetForCurrentView().CommandsRequested事件而被调用.错误发生在第二行,如下所示:
mscorlib.dll中发生了'System.FormatException'类型的第一次机会异常
附加信息:Guid应包含32位数字和4个破折号(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
如果我继续该应用程序,则会出现另一个异常:
mscorlib.dll中发生了'System.InvalidCastException'类型的第一次机会异常
附加信息:IPropertyValue中的对象是"String"类型,无法转换为"Guid".
这里发生了什么?正如您所看到的,我没有在任何地方使用任何GUID值.
任何人都可以知道限制android中特定应用程序的移动数据访问吗?最近,我在 4.4.4 Kitkat 版本的 MOTO G(第 2 代)上发现了此功能。
如何以编程方式做到这一点?
这是截图

在 .NET应用程序设置中保存一系列结构相同的简单配置元组的干净、规范的方法是什么?
假设我的程序有(用户范围)设置,如“服务器名称”、“地址”、“端口”。我只是将这三个作为两个字符串和一个 int 添加到应用程序设置中。
但是如果我的程序的配置需要处理多个这样的服务器,用户可以在其中添加和删除任意数量的服务器怎么办?我希望设置包含一组三元组,每个三元组由两个字符串和一个 int 组成,而应用程序设置似乎不太支持这一点。
这是一个由基本类型组成的相对轻量级的结构,但到目前为止,我发现的最简洁的方法是创建一个新类(!)来保存三元组数组,用自定义序列化/反序列化代码来适应类,然后将其设置为单个“设置”的类型。
我可以做到这一点,但考虑到大多数应用程序设置是多么的不干涉,这真的很像一些可能以更直接的方式可行的东西。
那么有没有这样的方法呢?
(是的,我已经看到了“应用程序设置中的 int[] 数组”问题,在这种情况下,那里的有用答案并没有那么有用。)
ETA:问题的关键不在于服务器名称或端口号,而在于一组结构相同的简单数据元组,其中每个单独的数据都将被简单地保存。
.NET配置设置功能不像我想的那么灵活.如果我正确理解应用程序设置,我可以更改/编辑设置时受到限制.在C#中,应用程序设置分为两种不同的类型或范围("应用程序"和"用户"),但两者在如何更改或修改它们方面都有局限性.下表显示了不同之处:
SCOPE: | EDIT AT DESIGN-TIME: | EDIT AT RUN-TIME: | EDIT BETWEEN SESSIONS: --------------------------------------------------------------------------------------- User | Setings.settings | Settings.Default.Save() | *Not supported* Application | Setings.settings | *Not supported* | edit app.exe.config
是否有任何"内置"设置功能允许我通过所有三种机制编辑设置?使用配置文件的主要动机之一是允许用户更改默认值而无需重新构建源代码(可以使用应用程序作用域设置完成).但是,不应强制用户编辑.config文件; 他们还应该能够在运行时进行跨设置的更改(可以使用用户范围设置完成).当然必须有某种机制提供两种功能.
BOTTOM LINE:为什么不能app.exe.config在运行时编辑应用程序设置()?这将解决我所有的问题.我知道这可能会导致共享同一台计算机的用户出现问题.但是谁又这样做了?
可能的解决方法:是否有将用户设置配置文件的默认存储位置更改为非隐藏文件夹?
UPDATE(澄清):
我想说的是,我希望能够在更改默认设置设计时,在运行时,或 在两者之间的会议(即通过编辑配置文件).但是当使用内置的C#持久性机制时Settings.settings,我必须选择最多2个中的3个.我错过了什么?还有其他我不知道的选择吗?
[ 用例:我想为连接字符串存储"默认"数据库名称,但我希望用户能够在运行时指定不同的数据库(从而成为该用户的"新"默认值).但我还希望能够覆盖配置文件中的默认值,而无需重新运行或重新构建应用程序.
[ 更好的用例:(回复评论)
我有一个配置文件的计算模型,其中包含模型中参数的默认值.用户A启动模型并决定更改多个参数的值.对于该用户的所有未来会话(即,在RunTime编辑),该更改需要持续存在.随后,该用户希望与他的团队共享该修改的配置文件(例如,通过版本控制存储库或电子邮件).这将允许用户B更新其默认参数值(以匹配用户A),而无需在应用程序中手动更改它们(即,在会话之间编辑).所有这些mod都应该在Design-Time之后发生. …
我正在使用 C# 开发 Windows 应用程序。我需要在应用程序设置( App.config )中添加一些注释 这是我的 App.config
<connectionStrings>
<add name="SLTBillConnectionString" connectionString="Data Source=DESKTOP-BIJLHTG\Yuresh_SQL;Initial Catalog=SLTBillPaymentDB;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="ScheduledTimeForNewDay" value="09" />
<add key="KioskCode" value="0001" />
<add key="IsMobitelPaymentEnable" value="false" />
<add key="MaxChequeAmount" value="500000" />
<add key="MinChequeAmount" value="10" />
</appSettings>
Run Code Online (Sandbox Code Playgroud) c# ×7
winforms ×2
android ×1
app-config ×1
interface ×1
save ×1
settings ×1
silverlight ×1
singleton ×1
windows ×1
windows-8.1 ×1