我的应用程序具有CurrentContext类,它提供对整个应用程序中使用的属性的访问(因此无需通过构造函数参数或方法传递对象)。
其中大多数属性在单个会话中都不会更改其值。
因为某些类经常使用某些属性,所以我决定在它们内部创建属性,现在我在重构代码,以便所有地方的访问模式都相同。
以下哪种模式是更好的做法?
内存使用量或性能有何区别?
CurrentContext类:
public class CurrentContext
{
public Document Doc {get; set}
public LogFile LogFile {get; set;}
public bool AbortFlag {get; set;}
}
类访问CurrentContext类的属性:
变种1:
public class Example
{
private Document Doc {get { return MyApp.CurrentContext.Doc; } }
private LogFile LogFile {get { return MyApp.CurrentContext.LogFile; } }
private bool AbortFlag {get { return MyApp.CurrentContext.AbortFlag; } }
}
变种2:
public class Example
{
private Document Doc {get; }
private LogFile LogFile {get; }
private bool AbortFlag {get; }
public Example()
{
Doc = MyApp.CurrentContext.Doc;
LogFile = MyApp.CurrentContext.LogFile;
AbortFlag = MyApp.CurrentContext.AbortFlag;
}
}
答案 0 :(得分:2)
您的问题基于错误的信念;两种方法之间的唯一区别是性能的提高(或降低)。那是不对的。您提出的两个选项的含义完全不同。
访问属性时,第一个将始终返回更新的值,第二个将在创建对象时返回值。
由您决定两者中的哪一种是正确的方法。在性能方面,除非访问的属性本身很昂贵(如果您遵循最佳实践,否则不应该),则这种差别(如果有的话)是绝对微不足道的。
如果是我的代码,我可能会推迟整个设置。如果基础对象在应用程序的整个生命周期中都发生变化,则重复属性很无聊且难以维护。我只是公开对象本身,或者如果这不是一种选择,我将公开一个只读接口。
答案 1 :(得分:0)
第一个版本更好,因为它返回了当前值。当任何MyApp.CurrentContext。*变量的值更改时,您的示例也将更改。
此版本的速度稍慢一点,但是在99%的情况下,此缺点是可以接受的。
但是请表达主体成员的语法。此语法是针对这种情况设计的:
var task = url.GetAsync();
HttpResponseMessage response = await task;
HttpResponseHeaders headers = response.Headers;
//Get what I need now from headers, .ReceiveJson<T>() will dispose
//response object above.
T obj = await task.ReceiveJson<T>();
此代码更易于理解。