Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 私有变量和getter的问题_C#_Oop_Getter - Fatal编程技术网

C# 私有变量和getter的问题

C# 私有变量和getter的问题,c#,oop,getter,C#,Oop,Getter,看来我在理解上有相当大的欠缺。我理解在类内使用私有变量并通过所述类外的公共getter访问它是最佳实践。现在,当使用C#的默认getter方法(private string Image{get;})时,我无法访问该类之外的Image变量(Console.WriteLine(items[I].Image);) 虽然我可以编写一个自定义的公共getter,但这似乎很荒谬,因为在私有变量上有一个私有getter除了返回变量之外什么都不做,这似乎是完全多余的,因此让我觉得我遗漏了一些东西。当您声明 p

看来我在理解上有相当大的欠缺。我理解在类内使用私有变量并通过所述类外的公共getter访问它是最佳实践。现在,当使用C#的默认getter方法(
private string Image{get;}
)时,我无法访问该类之外的
Image
变量(
Console.WriteLine(items[I].Image);

虽然我可以编写一个自定义的公共getter,但这似乎很荒谬,因为在私有变量上有一个私有getter除了返回变量之外什么都不做,这似乎是完全多余的,因此让我觉得我遗漏了一些东西。

当您声明

private string Image { get; }
创建一个私有只读属性,这意味着getter和setter都是私有的。此外,在构造函数/初始值设定项外部无法访问setter

改成

public string Image { get; }
将为您提供一个公共只读属性。这大致相当于以下安排:

  • getter是公开的,即课堂内外的每个人都可以访问
  • setter是private*,即只能在类内部访问
  • 该属性是只读的,因此对私有setter的附加限制是必须通过构造函数或初始值设定项访问它

在Java中,我将创建一个私有变量和一个公共getter。这实际上是C语言的版本吗

Java中的一个等价物是私有final字段,因为C#限制对构造函数外部setter的访问

*实际上,只读属性没有setter。分配直接写入属性的备份存储,无需通过setter。如果您试图通过反射编写属性,那么只有构造函数才能访问私有setter和根本没有setter之间的区别就变得非常重要。

当您声明

private string Image { get; }
创建一个私有只读属性,这意味着getter和setter都是私有的。此外,在构造函数/初始值设定项外部无法访问setter

改成

public string Image { get; }
将为您提供一个公共只读属性。这大致相当于以下安排:

  • getter是公开的,即课堂内外的每个人都可以访问
  • setter是private*,即只能在类内部访问
  • 该属性是只读的,因此对私有setter的附加限制是必须通过构造函数或初始值设定项访问它

在Java中,我将创建一个私有变量和一个公共getter。这实际上是C语言的版本吗

Java中的一个等价物是私有final字段,因为C#限制对构造函数外部setter的访问


*实际上,只读属性没有setter。分配直接写入属性的备份存储,无需通过setter。如果您尝试通过反射写入属性,那么只有构造函数才能访问私有setter与根本没有setter之间的区别就变得非常重要。

您可以声明一个私有成员

private string _image;
或公共财产。声明属性时,getter和setter都有自己的隐私修饰符(即protected/public/private/none)。例如:

public string Image { get; protected set; }

您可以声明一个私人成员

private string _image;
或公共财产。声明属性时,getter和setter都有自己的隐私修饰符(即protected/public/private/none)。例如:

public string Image { get; protected set; }

如果你不想保密,为什么要保密?如果你想公开,为什么不公开?是的,你的“getter”需要公开。公共字符串图像{get;}@JonathanWoollett light您这样说,然后编写了一个私有getter…尽管在问题中您说您知道正确的做法是不使用私有getter…@JonathanWoollett light属性的可访问性修饰符应用于整个属性。正如你所写的,你说这个私有属性似乎是无用的,这是正确的。这里的根本问题是你完全混淆了变量和属性。变量不是属性,属性也不是变量。字段——类级变量——应该几乎总是私有的。属性应该是私有的或公共的,属性的getter和setter可以具有不同的可访问性。这里没有矛盾;属性不是字段。属性是可以作为字段实现的对象的逻辑属性。字段是实现细节,有时是属性。如果您不希望它是私有的,为什么要将其设置为私有的?如果你想公开,为什么不公开?是的,你的“getter”需要公开。公共字符串图像{get;}@JonathanWoollett light您这样说,然后编写了一个私有getter…尽管在问题中您说您知道正确的做法是不使用私有getter…@JonathanWoollett light属性的可访问性修饰符应用于整个属性。正如你所写的,你说这个私有属性似乎是无用的,这是正确的。这里的根本问题是你完全混淆了变量和属性。变量不是属性,属性也不是变量。字段——类级变量——应该几乎总是私有的。属性应该是私有的或公共的,属性的getter和setter可以具有不同的可访问性。这里没有矛盾;属性不是字段。属性是可以作为字段实现的对象的逻辑属性。字段是实现细节,有时是属性