c# - 私有(private)变量和 setter/getter 的问题

标签 c# oop getter

看来我在理解上遇到了相当大的不足。我知道最好的做法是在类中使用私有(private)变量并通过类外的公共(public) getter 访问它。现在,当使用 C# 的默认 getter 方法(private string Image { get; })时,我无法访问此类之外的 Image 变量(Console.WriteLine( items[i].Image);).

enter image description here

虽然我可以编写自定义公共(public) getter,但这似乎很荒谬,因为在私有(private)变量上使用私有(private) getter 除了返回变量外什么都不做似乎完全多余,因此让我觉得我遗漏了什么。

最佳答案

当你声明

private string Image { get; }

你创建了一个私有(private)的只读属性,这意味着 getter 和 setter 都是私有(private)的。此外,setter 在构造函数/初始值设定项之外是不可访问的。

将其更改为

public string Image { get; }

会给你一个公共(public)的只读属性。这大致对应于以下安排:

  • getter 是公开的,即类内外的每个人都可以访问
  • setter 是私有(private)的*,即只能在类内部访问。
  • 该属性是只读的,因此对私有(private) setter 的额外限制是必须通过构造函数或初始化程序访问它。

In Java I would create a private variable and a public getter. Is this effectively the version of that in C#?

这在 Java 中的等效项是私有(private)最终字段,因为 C# 限制对构造函数外部的 setter 的访问。

* 实际上,只读属性没有setter。分配直接写入属性的后备存储,而无需通过 setter 。如果您尝试通过反射编写属性,则拥有只能从构造函数访问的私有(private) setter 与根本没有 setter 之间的区别变得很重要。

关于c# - 私有(private)变量和 setter/getter 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46779538/

相关文章:

c# - 具有流畅验证 ASP.NET Core WebApi 的正则表达式验证

javascript - 用 TypeScript 编写的具有 protected /私有(private)字段的类可以从 JavaScript 中的类外部访问吗?

java - 类的 getters() 和 setters() 简化

java - 我可以在 getter/setter 中执行额外的逻辑吗?

c++ - 带有 C++ 对象作为属性的 Objective C ViewController 具有 getter 和 setter,每次引用它时都会重新初始化它

c# - 使用 c# 使用证书进行 SSL 客户端身份验证

c# - 在 UIElementCollection 上使用 Where 表达式

c# - Linq 获取按最快日期排序的第一行,其中 B 列不是 "Expired"或 "Cancelled"

java - 当从类创建对象时,公共(public) Java 方法实际上会被复制到新对象中吗?

c++ - 从函数返回局部值而不触发复制构造函数