c# - Getter、setter 和属性最佳实践。 Java 与 C#

标签 c# java properties getter-setter

我现在正在学习 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)属性公开它,但将逻辑封装在 getset 中?为什么我会/应该这样做而不是使用专用的 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/

相关文章:

java - 在 java readLine() 中读取响应结束

java - 如何在 Java9 模块中使用 3rd 方库?

java - 我在 Java 中做错了什么才得到这个 IllegalArgumentException ?

c# - 通过 Gmail 在 .NET 中发送电子邮件

java - Spring Boot 外部配置和一次性测试

regex - 在 Delphi 中从 .dfm 文件中删除属性的快速方法

c# - 使用网格中的文本框和带有属性的标签设计用户控件

c# - 枚举 VS 静态类(普通和字符串值)

c# - 用于 HTML 输出的脱离上下文的字符串变量

c# - Entity Framework 子集合