为什么C#代码类与Java / C ++不同?

时间:2014-07-08 15:51:43

标签: c# class properties

我有几个关于C#的问题,特别是编码类。

采用以下示例代码:

public class Product
{
    public string code;
    public string description;
    public decimal price;

    public Product()
    {
    }

    public string Code
    {
        get
        {
            return code;
        }
        set
        { 
            this.code = value;
        }
    }

} 

1)在C#中,为什么名为code的字段为小写“c”,但属性为Code为大写“c”?套管是否重要?

2)如果我保持套管的方式,字段命名代码(小写c)和名为Code(大写c)的属性,将是一个自动属性,如下面的工作?为什么?

 public string Code {get; set; }

3)为什么我们只能编写getCode和setCode属性,例如在C ++中,如下所示?会有用吗?有没有理由不这样做?

public void setCode (c)
{
    this.code = c;
}

public string getCode ()
{
    return this.code;
}

2 个答案:

答案 0 :(得分:1)

  

套管是否重要?

是 - C#区分大小写。字段以小写字母开头,属性以大写字母开头的事实只是惯例;没有编译器魔法。

  

会不会像下面这样的汽车财产?为什么?

它会编译,但Code属性不会再连接到code字段 - 编译器会创建自己的私有支持字段。

  

为什么我们不能只编写getCodesetCode属性,例如C ++中的属性,如下所示?

你可以,但是你不能使用属性语法来获取/设置字段,因为那些是方法,而不是属性。 C ++没有像C#那样的getter和setter属性的概念。

所以代码

string code = product.Code;
product.Code = "foo";

会变成

string code = product.getCode();
product.SetCode("foo");

(这就是编译器在幕后做的事情 - 它只是为了更漂亮的源代码)

答案 1 :(得分:1)

首先要注意的是,你的例子不是惯用的C#。在好的C#中,code字段(也可能是其他字段)将是私有。然后,Code属性是公共的,并提供对类外部的私有code字段的访问。这里的大写/小写的东西只是惯例,它不是唯一的约定。有些人更喜欢使用m_甚至只是_作为前缀,而不是更改案例。在需要与Visual Basic项目共享代码的商店中尤其如此,这些项目不区分大小写。

至于创建get / set方法:没有理由你不能在C#中做到这一点。但是,你为什么这样?该属性完全相同的事情:编译器将属性转换为get / set方法。存在的属性可以使构建这些get / set方法更容易,帮助您避免使用get / set方法的错误,帮助您更好地表达您的类型正在做什么的含义,允许更长表达式中更清晰的语法,并减少在一个类型的公共接口中混乱(两个方法现在作为单个属性公开)。