public string Name { private get; private set }
或者
private string Name { get; set }
嗯,还有这个
private string Name { private get; private set }
public string Name { private get; private set }
或者
private string Name { get; set }
嗯,还有这个
private string Name { private get; private set }
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; }
(说起来,你以前不能使用自动属性,总是要自己编写从后备字段读取和写入的代码,但我们将忽略这一点,因为这样可以使例子更短)。
通常有必要为两者设置不同的访问级别,最常见的情况是将setter设为比getter更严格限制,所以会有以下代码:
public string Name { get; private set; }
被引入了。
现在,通过这个推论,允许下面的操作似乎是足够合理的:
public string Name { private get; private set; }
private string Name { private get; private set; }
然而,这两个表达式分别代表什么?
第二个表达式其实并不算太糟糕,只是过于重复了。不过,很可能出现了某些混乱的想法(最可能是未完整重构)。优秀的代码不仅要让计算机执行任务,还要清晰地表达正在做什么(甚至更为重要),最好让它表达得清清楚楚。
因此,如果你最终得到 { private get; private set; }
这样的东西,那么值得再次审视并考虑你真正想表达的内容。幸好这是一个编译器错误。
第一个表达式更糟糕。它的意思是“这个属性是公开的,除了设置器是私有的,获取器也是私有的”。这不是一个例外,“除了所有时间都是这样”并不能表达任何实际意义。双倍欢呼,编译器没有让我们这样做。
protected internal string Name { get; set; }
。 - Jeppe Stig Nielsenprotected internal
在 C#1.0 中不存在,是后来加入的,但快速搜索似乎表明它一直存在。 - Jon Hanna你是否尝试编译示例代码?只有中间的一个才能被翻译。
如果你想指定额外的辅助级别关键字,只能在其中一个访问器(getter / setter)上这样做,而此访问器的级别必须比整个属性的可访问性更加严格。
在此处你可以查看规则: 限制访问器的可访问性
public string Name { get; private set; }
我认为这是您想要做的事情。
如果您只想让您的类看到它,那么在属性为公共属性时尝试使其变为私有属性是没有意义的。在这种情况下,您应该使用:
private string Name { get; set; }
private string _name;
更好的方式取决于你想要什么:
public string Name { private get; private set }
这个属性是public
,但没有人可以读取或写入它,除了类本身。这完全没有用,所以只需使用private string Name { get; set }
。
一般来说,如果您将属性视为一对方法(实际上就是这样),
private string get_Name() { }
private string set_Name(value) { }
希望你能明白为什么有可能将这些标识符应用于属性的get/set
方法。
private void set_Name(string value) { }
。 - Hand-E-Foodpublic string Name { private get; private set; }
won't compile Cannot specify accessibility modifiers for both accessors of the property or indexer 'Program.Name'
- Alex78191看起来你想要
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
这将允许您访问 private string Name
。
确实如此, 这就是OOP中私有分类器的定义:只允许在拥有该私有成员的类的方法和范围内进行访问。因此,如果您的目的是禁用任何其他访问特定类成员的方式,并声称它为:
private <Type_name> <member_identifier> ;
这是最简单的,足以使其如此。
set
后面缺少了分号;
。但即使加上分号,只有第二个是合法的(请参见我的答案)。 - Jeppe Stig Nielsen