Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中定义半常量类变量的最佳方法是什么?_C#_Naming Conventions - Fatal编程技术网

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

在C#中定义半常量类变量的最佳方法是什么?,c#,naming-conventions,C#,Naming Conventions,我有一个名为ItemBase的类,许多类从中继承 在这个类中,我有许多单行方法,它们只返回一个字符串或对象,可用于所有继承类。我在继承的类中使用了很多这样的方法,以使代码更具可读性,因此我总是有一个且只有一个位置来定义每个计算或信息片段 我像在PHP和Java中一样使用getter,因为我一直都是这样做的: public class ItemBase { protected string GetApplicationPath() { return System.I

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

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

我像在PHP和Java中一样使用getter,因为我一直都是这样做的:

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

    protected string GetApplicationDataPath()
    {
        return GetApplicationPath() + @"..\..\..\TestServices\";
    }
}
然而,我注意到,getter和setter在C#中并不像在Java或PHP中那样被真正使用,我怀疑有一种更好、更简洁/标准的方法在C#中实现这一点

但我不想使用类变量,因为在a类变量初始值设定项中定义逻辑似乎不正确,我假设即使对于某些计算是可能的,但在某些情况下它可能会引起问题:

protected string _applicationPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
当我读到你对公共领域的不利影响后,我远离公共领域。另外,对于一个简单的定义来说,这是太多的代码了

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);
}
所以我决定使用这些getter,就像我在PHP和Java中所做的那样,尽管这似乎不是一个很好的方法

在C#中,您使用什么约定来存储这些“单行类变量”,它们只保存一条信息或进行一点计算

答复:

在C#中,您使用什么约定来存储这些“单行类变量”,它们只保存一条信息或进行一点计算

在描述之后:使用只读属性。这是C#中的方法,在大多数情况下,它确实是唯一合理的选择。正如你自己所说:

我注意到getter和setter并不像在Java或PHP中那样在C#中使用

是的,原因很简单:.NET的属性提供了一种特殊的语法糖来表示getter和setter。在某种程度上,后者只是弥补前者缺位的一个变通办法

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

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

    public const string Uuid = "D4D5DF8E-51DD-11DE-825A-1A5C55D89593";
    
  • 如果您想让消费者清楚该操作(可能)耗时和/或没有副作用:请使用
    Get
    -前缀方法。然而,在副作用的情况下,让方法名称也反映这一点可能会更好

在C#中,您使用什么约定来存储这些“单行类变量”,它们只保存一条信息或进行一点计算

在描述之后:使用只读属性。这是C#中的方法,在大多数情况下,它确实是唯一合理的选择。正如你自己所说:

我注意到getter和setter并不像在Java或PHP中那样在C#中使用

是的,原因很简单:.NET的属性提供了一种特殊的语法糖来表示getter和setter。在某种程度上,后者只是弥补前者缺位的一个变通办法

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

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

    public const string Uuid = "D4D5DF8E-51DD-11DE-825A-1A5C55D89593";
    
  • 如果您想让消费者清楚该操作(可能)耗时和/或没有副作用:请使用
    Get
    -前缀方法。然而,在副作用的情况下,让方法名称也反映这一点可能会更好

“我可以使用C#的缩写属性,但每个小信息都有两个地方的代码,并且名称被使用了两次,这似乎不是一个简洁的解决方案”

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

public string MyProp
{
   get{return "MyProp";}
}
“我可以使用C#的缩写属性,但每个小信息都有两个地方的代码,并且名称被使用了两次,这似乎不是一个简洁的解决方案”

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

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

答案与您已经因为代码太多而打折的选项之一完全相同?除了那些属性名以Get开头,这一点意义都没有


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

答案与您认为太多代码的选项之一完全相同?除了那些属性名以Get开头,这一点意义都没有


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

看看下面关于缩写属性的语句(Edward的意思是自动实现的属性)——属性名称在属性声明和构造函数中使用。是的,但是从他的java风格的getter方法,他似乎没有使用后场,这让我相信他从来没有必要设置后场。那么,为什么他首先需要auto属性呢?好吧,我想我把只读属性和公共字段搞混了。这就是我想要的