在C#中定义半常量类变量的最佳方法是什么?

时间:2009-06-05 14:28:04

标签: c# naming-conventions

我有一个名为ItemBase的类,其中有许多类继承。

在这个类中,我有许多单行方法,它只返回一个字符串或对象,并且可用于所有继承类。我在继承的类中使用了这些,以使代码更具可读性,因此我总是只有一个地方定义每个计算或信息。

我像使用PHP和Java一样使用Getters ,因为这是我一直以来的方式:

public class ItemBase
{
    protected string GetApplicationPath()
    {
        return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
    }

    protected string GetApplicationDataPath()
    {
        return GetApplicationPath() + @"..\..\..\TestServices\";
    }
}

但是,我注意到 Getters和Setter并没有真正用在C#中,因为它们是Java或PHP而且我怀疑有更好,更简洁/标准的方法在C#中这样做。

但是我不想使用类变量,因为在类变量初始化器中定义逻辑似乎不对,我假设即使可能进行某些计算,它也可能是皱眉在某些情况下会导致问题:

protected string _applicationPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);

我在阅读了Jon Skeet's article中关于你的不利之处后,远离公共领域。另外,这只是一个简单定义的代码太多了。

protected string ApplicationPath
{
    get
    {
        return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
    }
}

我可以使用C#的缩写属性,但是每一小段信息都有两个地方的代码,名称使用两次,只是看起来不是一个简洁的解决方案。

protected string ApplicationPath { get; set; }

public ItemBase()
{
    ApplicationPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
}

所以我已经确定使用这些Getters就像我在PHP和Java中那样,虽然这似乎不是一种非常C#的方式来实现它。

您在C#中使用哪些约定来存储这些只包含一条信息或进行一些计算的“一行类变量”?

解答:

protected string ApplicationPath
{
    get { return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); }
}

protected string ApplicationDataPath
{
    get { return ApplicationPath + @"..\..\..\TestServices\"; }
}

3 个答案:

答案 0 :(得分:3)

“我可以使用C#的缩写属性,但是每个小信息都有两个地方的代码,名称使用两次,只是看起来不是一个简洁的解决方案”

你是什么意思?属性只是通常用Java做的getter / setter方法的语法糖。你在哪里看到两个地方的代码?

public string MyProp
{
   get{return "MyProp";}
}

答案 1 :(得分:2)

  

您在C#中使用哪些约定来存储这些只包含一条信息或进行一些计算的“一行类变量”?

在您的描述之后:使用只读属性。这是 在C#中执行此操作的方式,在大多数情况下,它确实是唯一合理的替代方法。正如你自己说过的那样:

  

我注意到Getter和Setter并没有真正用在C#中,因为它们是Java或PHP

是的,原因很简单:.NET的属性提供了一种特殊的语法糖来表达getter和setter。在某种程度上,后者只是一种解决方法,以弥补前者的缺席。

某些情况下,您可能想要使用属性:

  • 保证永远不会改变的编译时常量:对这些使用公共常量(const):

    public const string Uuid = "D4D5DF8E-51DD-11DE-825A-1A5C55D89593";
    
  • 您希望向消费者明确说明操作(可能)耗时和/或没有副作用的情况:使用Get - 前缀方法。但是,在副作用的情况下,让方法名称也反映出来可能会更好。

答案 2 :(得分:1)

答案与你已经打折的一个选项完全相同,因为代码太多了?除了那些属性名称以Get开头,这根本没有意义..

只有get实现的受保护属性确实是可行的方法。如果有人想知道它应该由编译器内联。