我有几个关于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;
}
答案 0 :(得分:1)
套管是否重要?
是 - C#区分大小写。字段以小写字母开头,属性以大写字母开头的事实只是惯例;没有编译器魔法。
会不会像下面这样的汽车财产?为什么?
它会编译,但Code
属性不会再连接到code
字段 - 编译器会创建自己的私有支持字段。
为什么我们不能只编写
getCode
和setCode
属性,例如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方法的错误,帮助您更好地表达您的类型正在做什么的含义,允许更长表达式中更清晰的语法,并减少在一个类型的公共接口中混乱(两个方法现在作为单个属性公开)。