繁体   English   中英

属性:私有方法还是私有获取/设置?

[英]property: private method or private get/set?

如果我想在 Class 私有中设置我的属性,那么应该只能在这个 class 中使用和设置这个属性,更好的方法是什么? 这个

public string Name { private get; private set }

或者

private string Name { get; set }

嗯,还有

private string Name { private get; private set }

值得注意的是,最初,C# 不允许您在 getter 或 setter 上设置不同的访问权限,因此唯一可能的选择是:

public string Name { get; set; }
protected internal string Name { get; set; }
internal string Name { get; set; }
protected string Name { get; set; }
private string Name { get; set; }

(就此而言,您不能拥有自动属性,并且总是必须自己写入和写入支持字段,但我们将忽略这一点,因为这样我们会有更短的示例)。

对两者进行不同的访问通常很有用,通常是比 getter 更具限制性的 setter,等等

public string Name { get; private set; }

被介绍了。

现在,通过扩展,这似乎是合乎逻辑的,可以允许:

public string Name { private get; private set; }
private string Name { private get; private set; }

然而,这两个表达的是什么?

第二个还不错,只是不必要的重复。 尽管如此,很可能是一些混乱的想法让我们到达了那里(很可能是不完整的重构)。 好的代码就像让计算机做某事一样表达你正在做的事情(如果有的话,更是如此),最好让它清楚地表达出来。

因此,如果您最终{ private get; private set; }之类的东西{ private get; private set; } { private get; private set; }那么它可能值得再看一遍,想想你在这里真正想说什么。 万岁,因为它是一个编译器错误。

第一种情况更糟。 它说“这个属性是公共的,除了 setter 是私有的,getter 是私有的”。 这也不例外,“就是这件事,除了一直”不是任何事情的真实表达。 加倍欢呼编译器不让我们这样做。

你试过编译你的例子吗? 只有中间的会翻译。

如果要指定额外的可访问性级别关键字,则只能在其中一个访问器(getter/setter)上执行,并且访问器的该级别必须比整个属性的可访问性更具限制性。

在这里您可以看到规则:限制访问器可访问性

public string Name { get; private set; }

这就是我认为你想要做的。

除非您只想让 class 看到它,否则在财产公开时尝试将其设为私有是没有意义的。 在这种情况下,您应该使用:

private string Name { get; set; }

更新:在第二次阅读时,您肯定想要第二个示例。

更好的方法取决于你想要什么:

public string Name { private get; private set } public string Name { private get; private set }该属性是public的,但除了class本身之外,没有人可以对其进行读取或写入。 那完全没用,所以只使用private string Name { get; set } private string Name { get; set }

一般来说,如果您将属性视为几种方法(实际上是)

private string get_Name() {  }

private string set_Name(value) {  }

我希望有可能将该标识符应用于属性get/set的原因变得显而易见。

如果我想在Class私有中设置我的属性,那么只能在此类中使用和设置此属性,更好的方法是什么?

public string Name { private get; private set }

或者

private string Name { get; set }

嗯,还有

private string Name { private get; private set }

对于私有成员,您不需要定义访问器。 只需这样做:

private string _name;

好像你想要

private string name;

public string Name

{

    get { return name; }

    set { name = value; }

}

这将允许您访问private string Name

果然,这就是 OOP 中私有分类器的定义:只允许在拥有此类私有成员的 class 的方法和 scope 内访问。 因此,如果您的目标是禁用对 class 特定成员的任何其他访问方式,则将其声明为:

private <Type_name> <member_identifier> ; 

是最简单的,足以使它成为这样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM