私有变量访问

7
声明的作用是什么?
private Int64 _ID ;
public Int64 ID{get { return _ID; }set { _ID = value; } };

使用这种方式声明私有变量

通常在编码中,我们直接使用ID来访问_ID,而_ID是私有的。 这样做比直接声明更安全。

public int64 ID{get;set;}
4个回答

4

两全其美:

public long ID {get;set;}

这不是更容易吗?

你不应该将字段暴露为public,但这并不意味着你需要过于冗长。


没错,但我想提供一些安全性,如果我像上面那样使用,那么我实际上是在将变量公开,而我不想这样做。 - Raghurocks
你不应该暴露 - 尽管这可能是一个讨论的话题 ;) 如果我没记错,Jeffrey Richter强烈支持完全不使用属性,虽然我们不总是必须遵循他的推理,但他对属性和公共字段提出了一些有效的观点。 - igrimpe
@Raghurocks 不,上述代码并不会将该变量(即字段)公开;此外,您可以在以后添加任何所需的逻辑而无需更改 API 调用者。 - Marc Gravell
@Raghurocks 嗯,我不同意那个博客的观点。那篇文章假设你已经有需要维护的不变量,但是事实上:一旦某些东西成为自动属性,你就可以在后面添加更多逻辑而不会破坏暴露给调用者的接口。这对于公共字段来说是不正确的:稍后对属性进行任何更改都是基本上破坏性的变化。 - Marc Gravell
@igrimpe 我知道有些情况下你想正式声明:“这就是实现”,因此暴露字段可能是(在某些非常特定的情况下)可取的,但这只是少数情况。对于大多数日常的业务编程等,它根本不适用。 - Marc Gravell
显示剩余2条评论

3
您可以通过使用 get 和 set 方法来调用自定义逻辑,从而获得封装的好处。私有的 _ID 是一个占位符,用于保存属性的数据,当有人写入 _id 时,set 方法将其保护起来,同样,在给定值之前,您可以在 get 中放置自定义逻辑。
这是 msdn 对属性的解释:“属性结合了字段和方法的方面。对于对象的用户,属性看起来像是一个字段,访问属性需要相同的语法。对于类的实现者,属性是一个或两个代码块,表示 get 访问器和/或 set 访问器。当读取属性时,执行 get 访问器的代码块;当属性被分配新值时,执行 set 访问器的代码块。没有 set 访问器的属性被认为是只读的。没有 get 访问器的属性被认为是只写的。具有两个访问器的属性是可读写的”。您可以在这里阅读更多信息。

谢谢您的回复。如果我写了这样的代码:private Int64 _ID {get;set;} ; public Int64 ID{get { return _ID; }set { _ID = value; } };那么它和其他代码有什么不同呢? - Raghurocks
其实我的基本疑问是,如果我们像这样写注释,拥有私有字段和公共属性,我们拥有了业务逻辑的优势,但我们不是将私有字段变成了公共字段吗? - Raghurocks

2

“为什么?”的一个例子是可以将 setter 设为 private。现在你有一个从外部只读的属性。 - Jonathon Reinhart

2
当您在设置和获取值之前检查输入或输出时,它会带来安全性,如下所示:
private int? _ID;
public int ID 
{
    get { return _ID ?? 0; }
    set { _ID = value >= 0 ? value : 0; } 
}

当然,@MarcGravell,你是对的,我只是想向他展示你可以控制输入和输出,这个例子并不实用。 - Mahdi Tahsildari

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