我现在正在学习 C# 类(class),我正在尝试找出最好的做事方式。我来自 Java 背景,所以我只熟悉 Java 最佳实践;我是 C# 新手!
在 Java 中,如果我有私有(private)属性,我会这样做;
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
在 C# 中,我发现有很多方法可以做到这一点。
我可以像 Java 一样做:
private string name;
public void setName(string name) {
this.name = name;
}
public string getName() {
return this.name;
}
或者我可以这样做:
private string name;
public string Name {
get { return name; }
set { name = value; }
}
或者:
public string Name { get; set; }
我应该使用哪一种,每种方法有哪些注意事项或微妙之处?在创建类时,我遵循我从 Java 中了解的一般最佳实践(尤其是阅读有效 Java)。因此,例如,我赞成不变性(仅在必要时提供 setter )。我只是想知道这些实践如何与 C# 中提供 setter 和 getter 的各种方式相适应;本质上,我如何将 Java 世界的最佳实践转化为 C#?
编辑
我将此作为对 Jon Skeet 答案的评论发布,但后来它变得很长:
那么重要的属性(即,可能有重要的处理和验证)呢?我是否仍然可以通过公共(public)属性公开它,但将逻辑封装在 get
和 set
中?为什么我会/应该这样做而不是使用专用的 setter 和 getter 方法(具有相关的处理和验证逻辑)。
最佳答案
C# 6 之前的版本
我会使用其中的最后一个,作为一个微不足道的属性。请注意,我将其称为 public 属性,因为 getter 和 setter 都是公共(public)的。
对于自动实现的属性来说,不变性有点让人头疼——你不能写一个只有 getter 的自动属性;你能来的最接近的是:
public string Foo { get; private set; }
这不是真的不可变的......只是在你的类(class)之外不可变。因此,您可能希望使用 real 只读属性:
private readonly string foo;
public string Foo { get { return foo; } }
你肯定不想写 getName()
和 setName()
。在某些 情况下,编写 Get/Set 方法而不是使用属性是有意义的,尤其是当它们可能很昂贵并且您希望强调这一点时。但是,您可能希望遵循 PascalCase 的 .NET 方法命名约定,并且无论如何您都不希望使用普通方法来实现像这样的琐碎属性 - 这里的属性更加惯用。
C# 6
万岁,我们终于有了正确的只读自动实现属性:
// This can only be assigned to within the constructor
public string Foo { get; }
同样对于确实需要做一些工作的只读属性,你可以使用成员实体属性:
public double Area => height * width;
关于c# - Getter、setter 和属性最佳实践。 Java 与 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4948816/