C# 快捷访问另一类属性的最佳实践

C# 快捷访问另一类属性的最佳实践,c#,properties,getter,C#,Properties,Getter,我的应用程序有一个CurrentContext类,它提供对整个应用程序中使用的属性的访问(因此不需要通过构造函数参数或方法传递对象) 大多数属性在单个会话期间不会更改其值 因为有些类经常使用某些属性,所以我决定在它们内部创建属性,现在我正在重构我的代码,以便所有地方的访问模式都是相同的 以下哪种模式是更好的做法 内存使用或性能有什么不同 CurrentContext类: public class CurrentContext { public Document Doc {get; set}

我的应用程序有一个CurrentContext类,它提供对整个应用程序中使用的属性的访问(因此不需要通过构造函数参数或方法传递对象)

大多数属性在单个会话期间不会更改其值

因为有些类经常使用某些属性,所以我决定在它们内部创建属性,现在我正在重构我的代码,以便所有地方的访问模式都是相同的

以下哪种模式是更好的做法

内存使用或性能有什么不同

CurrentContext类:

public class CurrentContext
{
   public Document Doc {get; set}
   public LogFile LogFile {get; set;}
   public bool AbortFlag {get; set;}
}
类访问CurrentContext类的属性:

public class CurrentContext
{
   public Document Doc {get; set}
   public LogFile LogFile {get; set;}
   public bool AbortFlag {get; set;}
}
备选案文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;
   }
}

你的问题是基于错误的信念;这两种方法之间的唯一区别是性能上的增益(或损失)。事实并非如此;你提出的两个选择有着截然不同的含义

第一个将在访问属性时始终返回更新的值,第二个将在创建对象时返回值

这取决于你决定哪一个是正确的方法。性能方面的差异(如果有的话)是绝对不重要的,除非访问的属性本身很昂贵(如果您遵循最佳实践,它们不应该如此)


如果这是我的代码,我可能会推迟整个设置。如果底层对象在应用程序的整个生命周期中发生更改,那么重复属性是很无聊的,而且很难维护。我只会公开对象本身,或者如果这不是一个选项,我会公开一个只读接口;这两种方法之间的唯一区别是性能上的增益(或损失)。事实并非如此;你提出的两个选择有着截然不同的含义

第一个将在访问属性时始终返回更新的值,第二个将在创建对象时返回值

这取决于你决定哪一个是正确的方法。性能方面的差异(如果有的话)是绝对不重要的,除非访问的属性本身很昂贵(如果您遵循最佳实践,它们不应该如此)


如果这是我的代码,我可能会推迟整个设置。如果底层对象在应用程序的整个生命周期中发生更改,那么重复属性是很无聊的,而且很难维护。我只需公开对象本身,或者如果这不是一个选项,我会公开一个只读接口。

第一个版本更好,因为它返回的是当前值。当任何MyApp.CurrentContext.*变量的值更改时,您的示例也将更改

这个版本稍微慢一点,但在99%的情况下,这个缺点是可以接受的

但请使用表达式体成员语法。此语法是针对这种情况设计的:

public class Example
{
   private Document Doc => MyApp.CurrentContext.Doc;
   private LogFile LogFile => MyApp.CurrentContext.LogFile;
   private bool AbortFlag => MyApp.CurrentContext.AbortFlag;
}

这段代码更容易理解。

第一个版本更好,因为它返回的是当前值。当任何MyApp.CurrentContext.*变量的值更改时,您的示例也将更改

这个版本稍微慢一点,但在99%的情况下,这个缺点是可以接受的

但请使用表达式体成员语法。此语法是针对这种情况设计的:

public class Example
{
   private Document Doc => MyApp.CurrentContext.Doc;
   private LogFile LogFile => MyApp.CurrentContext.LogFile;
   private bool AbortFlag => MyApp.CurrentContext.AbortFlag;
}

这段代码更容易理解。

这是什么类型的应用程序?非常具体地说,是Autodesk Revit附加组件。变量2将由编译器生成一个soild变量,因此会导致内存稍微增加。变量1只不过是一个get函数,它会向其调用者返回一个“real”引用,这意味着即使Doc被某个新实例替换,变量1也能找到它,因此该变量需要更多关于机器代码的指令,意味着性能稍低。我不能说哪一个是最好的,这取决于应用程序情况的限制。可以考虑的另一点是:对于这两个变体,对CurrentContext类的依赖关系都是硬编码的这是哪种应用程序?非常具体地说,是Autodesk Revit附加组件。变体2将通过编译器生成一个soild变量,因此,造成稍微多一些记忆。变量1只不过是一个get函数,它会向其调用者返回一个“real”引用,这意味着即使Doc被某个新实例替换,变量1也能找到它,因此该变量需要更多关于机器代码的指令,意味着性能稍低。我不能说哪一个是最好的,这取决于对应用程序情况的限制。可以考虑的另一点是:对于这两个变体,对CurrentContext类的依赖性都是硬编码的为什么更好?如果物业不变,会更好吗?对象应该始终返回更新的值,还是在创建时返回值?如果财产非常昂贵,即使它以后没有改变,用户体验是更好地支付创建或财产访问的价格?如果属性正在更改,则应用程序上下文中的数据将不一致。我认为这是不能接受的。在我的回答中,我还写道,在99%的情况下,性能损失是可以接受的。当然,当属性计算非常昂贵时,需要缓存机制。但此缓存也必须位于MyApp.currentcontext.DocCahced或类似的内容中。原来的问题是:“其他班级成员的捷径”。表达式体成员语法是专门为它设计的。为什么?不要假设,用事实数据回答。如果对象是某种快照呢?那么更新值有意义吗?更好的方法取决于对象应该做什么。你不知道它是做什么的,所以不要判断它是否更好;简单地指出两种方法之间的区别。事实上,我指出大多数属性