C# 私有变量访问

C# 私有变量访问,c#,private,C#,Private,声明有什么用 private Int64 _ID ; public Int64 ID{get { return _ID; }set { _ID = value; } }; 像这样声明一个私有变量 现在,通常在编码中,我们直接使用ID,然后访问私有的_ID。 这如何提供更高的安全性,而不是直接声明为 public int64 ID{get;set;} 两者兼而有之: public long ID {get;set;} 那不是更容易吗 您不应该将字段公开为public,但这并不意味着您也需要冗

声明有什么用

private Int64 _ID ;
public Int64 ID{get { return _ID; }set { _ID = value; } };
像这样声明一个私有变量

现在,通常在编码中,我们直接使用ID,然后访问私有的_ID。 这如何提供更高的安全性,而不是直接声明为

public int64 ID{get;set;}
两者兼而有之:

public long ID {get;set;}
那不是更容易吗


您不应该将字段公开为
public
,但这并不意味着您也需要冗长

通过调用get和set方法,您可以在其中放置您的
自定义逻辑,从而获得封装的
好处。私有
\u ID
是一个占位符,用于在某些主体写入
\u ID
时,保存通过set方法受
保护的属性数据,类似地,您可以在通过
get
给出值之前放置自定义逻辑


这是
msdn
对属性的解释“属性结合了字段和方法的各个方面。对于对象的用户来说,属性似乎是一个字段,访问该属性需要相同的语法。对于类的实现者来说,属性是一个或两个代码块,表示get访问器和/或set访问器。读取属性时执行get访问器的代码块;为属性分配新值时,将执行集合访问器的代码块。没有集合访问器的属性被视为只读。没有get访问器的属性被视为只写属性。具有两个访问器的属性都是读写属性。您可以阅读更多内容。

您应该了解和。属性提供更好的封装,应该使用,而不是公开公共字段。

在设置和获取值之前检查输入或输出会带来安全性,请看:

private int? _ID;
public int ID 
{
    get { return _ID ?? 0; }
    set { _ID = value >= 0 ? value : 0; } 
}

“为什么?”?“将是使setter
私有化的能力。现在您有了一个从外部只读的属性。没错,但我想提供安全性,如果我使用上面的方法,那么我实际上是在创建公共变量,我不希望这样。您不应该公开-尽管这可能是一个讨论的主题;)IIRC Jeffrey Richter是完全不使用属性的坚定支持者,尽管人们不必总是遵循他的推理,但他对属性和亲(公共)字段提出了一些有效的观点。@Raghurocks不,上述内容并没有使变量(意思是:字段)公开;此外,您可以在以后添加所需的任何逻辑,而无需将API更改为caller@Raghurocks我不同意那个博客。这假设您有需要维护的不变量,但要点是:一旦某个东西是自动道具,您可以稍后更改它以添加更多逻辑,而不会破坏向调用方公开的接口。公共字段不是这样的:以后对道具的任何更改都是根本性的突破性更改。@igrimpe我知道在某些情况下,您希望正式声明:“这是实现*”,因此公开字段(在某些非常特定的情况下)是可取的,但这只是少数情况。对于大多数日常业务线etc编程,它根本不适用;public Int64 ID{get{return}ID;}set{{u ID=value;}};区别是什么?实际上,我的基本疑问是,如果我们写这种符号,有私有字段和公共道具,我们有商业逻辑的优势,但我们不是把私有字段变成了公共字段吗当然@MarcGravel你是对的,只是想向他展示你可以控制输入和输出,这个例子并不实用。