一个被设置为private或者没有private关键字的属性,有什么区别?

4
我正在设置一个类的属性,就像这样
public string Name { get; set; }

但我也可以这样设置属性。
public string Name { get; private set; }

我想了解它们之间的区别以及它们的适用范围?

3个回答

5
这意味着您无法从类实例中设置此属性。只有同一类的成员才能设置它。因此,对于外部人员来说,这个属性变成了只读属性。
class Foo
{
    public string Name1 { get; set; }

    public string Name2 { get; private set; }

    public string Name3 { get { return Name2; } set { Name2 = value; }
}

那么

Foo f = new Foo();

f.Name1 = ""; // No Error

f.Name2 = ""; // Error.

f.Name3 = ""; // No Error
Name3会设置Name2的值,但直接设置Name2的值是不可能的。
“它们有什么作用域?”
由于Name1Name3属性是公共的,因此它们及其获取和设置方法在任何地方都可用。 Name3也是公共的,但其设置为私有,因此属性和获取方法将在任何地方都可用。 设置方法的范围仅限于类内部(private访问修饰符的范围仅限于定义它的实体内部)。

感谢您清晰地阐述了这一点。 - amit kohan

3

第一个方法会在类外提供SetGet方法。第二个方法会在类外提供Get方法,但Set方法只能在类内使用。这通常表示只读行为。


3

对于这个例子 public string Name { get; private set; },使用私有的set意味着这个属性从外部来看是只读的。当你有一个只读属性并且不想显式地声明后备变量时,这很有用。

public string Name { get; private set; }和下面的代码是等价的:

private string _Name;
public string Name
{
    get { return _Name; }
    private set { _Name = value; }
}

后两件事实际上并不相同。在类内部,this.Name = "bill" 与第一种实现是有效的,但 不是 第二种实现。 - kdbanman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接