目前我正在使用一种方法来设置数据保护属性,这对我来说看起来很尴尬。我想知道是否有更直接的方法,而不是处理NSString
和NSMutableDictionary
?这就是我目前正在使用的(我知道它可以通过" using
"语句进行优化,但这不是我在这里所追求的):
public static void SetDataProtectionFor ( string sFileToProtect )
{
NSError oError = null;
NSMutableDictionary oDic = null;
try
{
oDic = new NSMutableDictionary ();
oDic.Add ( new NSString ("NSFileProtectionKey"), new NSString ("NSFileProtectionComplete") );
NSFileManager.DefaultManager.SetAttributes ( oDic, sFileToProtect, out oError );
if ( oError != null )
{
throw new DataProtectionGoneMissingException ();
}
}
catch ( Exception ex )
{
throw new DataProtectionGoneMissingException ();
}
finally
{
if ( oDic != null )
{
oDic.Dispose ();
oDic = null;
}
}
}
现在 ? 不多。这是Objective-C的方式,MonoTouch(生成的)绑定允许你遵循相同的模式。
您可以避免创建NSString
并使用 MonoTouch 提供的,例如 ' NSFileManager.FileProtectionComplete
和 NSFileManager.FileProtectionKey
。这将避免多次创建两个NSString
实例(如果多次调用您的方法,则会延迟创建和缓存 MonoTouch 版本),并消除拼写错误的可能性。
因此,使用 C#3 语法,这将变为:
NSMutableDictionary oDic = new NSMutableDictionary () {
{ NSFileManager.FileProtectionKey, NSFileManager.FileProtectionComplete }
};
此外,我们尝试提供更多的 C# 式 API 来完成与 NSDictionary
相同的工作。OTOH 由于有很多 API 使用 NSDictionary
作为选项,我们(到目前为止)只有它们用于最常见的选项。
注意:当您发现 API 可以更好的情况时,请随时提交增强错误报告
例如,基于类似的情况(以前做过),理想情况下,这将/应该如下所示:
var attr = new NSFileManagerAttribute ();
attr.ProtectionKey = NSFileManager.ProtectionComplete; // enum version
NSFileManager.DefaultManager.SetFileAttribute (sFileToProtect, attr);
它不会节省太多代码行(至少对于单个值),但它会使源代码看起来更好(IMO),并且更容易使用代码完成并避免拼写错误(超过字符串)。
您可以在NSMutableDictionary
上使用SetObject
而不是Add
,以避免必须创建新的NSString
,但它对您已经拥有的东西并没有太大区别,例如
var oDic = new NSMutableDictionary ();
oDic.SetObject ("NSFileProtectionComplete", "NSFileProtectionKey");
据我所知,这是设置文件属性的唯一方法。