当前位置: 首页 > 面试题库 >

获取,设置和属性最佳实践。Java与C#

韦宏扬
2023-03-14
问题内容

我现在正在上一门C#类,并且试图找出做事的最佳方法。我来自Java背景,因此只熟悉Java最佳实践。我是C#新手!

在Java中,如果我有私有财产,则可以这样做。

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中学到的最佳常规(特别是阅读Effective
Java)。因此,例如,我赞成不变性(仅在必要时提供设置器)。我很好奇这些实践如何与C#中提供setter和getter的各种方式相适应。本质上,我如何将Java世界中的最佳实践转换为C#?

编辑

我将其发布为对乔恩·斯凯特(Jon Skeet)的回答的评论,但随后很长一段时间:

非平凡属性(即可能需要大量处理和验证)又如何呢?我是否仍可以通过公共属性公开它,但逻辑封装在getand中set?为什么/应该通过拥有专用的setter和getter方法(以及相关的处理和验证逻辑)来做到这一点。


问题答案:

C#6之前的版本

我会用其中的最后一个作为琐碎的属性。请注意,由于getter和setter都是公共的,因此我将其称为 公共 属性。

对于自动实现的属性,不变性会有些痛苦-您不能编写只有吸气剂的自动属性;您能找到的最接近的是:

public string Foo { get; private set; }

这并不是 真正的 不变……只是在课堂之外不变。因此,您可能希望使用一个 真实的 只读属性:

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;


 类似资料:
  • 问题内容: 在Web应用程序(jsp /servlets)中获取EntityManagerFactory的最佳方法是什么?这是一个好方法,何时应创建/打开EntityManagerFactory实例?,还是从JNDI或其他方式获得它更好? 问题答案: 它们是重量级的,应该在应用程序范围内。因此,您需要在应用程序启动时将其打开,并在应用程序关闭时将其关闭。 该如何做取决于您的目标容器。它是否支持EJ

  • 问题内容: 我在应用程序中使用Log4j。放置在classpath中的Jar中。该配置文件正在使用中,并且在大多数情况下都可以正常工作。 但是有时,生成的日志记录语句与配置文件不同。 我的理解是,这是因为属性文件是从类路径中获取的。不管第一个属性文件是什么,都由log4j获取和使用。因此,有时我们得到的日志记录语句与属性文件中配置的语句不同。 如果上述原因属实,那么我认为,我们需要通过以下方式之一

  • 问题内容: 我们的代码使用了许多系统属性,例如’java.io.tmpdir’,’user.home’,’user.name’等。我们在任何地方都没有为这些常量定义任何常量(我认为Java也没有)或处理它们的任何其他聪明的事情,因此它们在整个代码中都是乱七八糟的。 每个人如何使用系统属性? 问题答案: 我将把它当作您遍历整个代码的任何其他String常量,并为其定义一个常量变量。当然,在这种情况下

  • 问题内容: 用PHP完成这项工作时,可能会遇到这种问题: 问题是,如果包含双引号,应将其更改为 但这还不是全部故事: 在这种情况下,我们需要将单引号更改为,而将双引号保持不变。 那么,我们如何以一般财产的方式来做呢? 问题答案: 您始终希望对HTML属性中的内容进行HTML编码,您可以使用以下方法: 您可能需要将第二个参数()设置为。 唯一的潜在风险是可能已经被编码,因此您 可能 需要将最后一个参

  • Overview This article discusses performance and reliability best practices for Express applications deployed to production. This topic clearly falls into the “devops” world, spanning both traditional

  • 本文档旨在汇总和强调用户指南、快速开始文档和示例中的最佳实践。该文档会很活跃并持续更新中。如果你觉得很有用的最佳实践但是本文档中没有包含,欢迎给我们提Pull Request。 通用配置建议 定义配置文件的时候,指定最新的稳定API版本(目前是V1)。 在配置文件push到集群之前应该保存在版本控制系统中。这样当需要的时候能够快速回滚,必要的时候也可以快速的创建集群。 使用YAML格式而不是JSO