快捷方式访问另一个类的属性,最佳做法

时间:2018-11-28 07:26:24

标签: c# properties getter

我的应用程序具有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;
   }
}

2 个答案:

答案 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>();

此代码更易于理解。