pgh*_*ech 36 c# encapsulation field properties
首先,我已经阅读了关于这个主题的帖子列表,并且由于我对封装和字段修饰符(private,public..ect)的了解,我不觉得我已经掌握了属性.
我学习的C#的一个主要方面是使用封装在代码中保护数据的重要性.我认为'我理解这是因为使用修饰符的能力(私人,公共,内部,受保护).然而,在了解了属性之后,我不仅理解了属性的使用,而且还理解了C#中数据保护(我理解为封装)的整体重要性/能力.
更具体地说,当我到达C#中的属性时,我读过的所有内容都是你应该尝试使用它们代替字段,因为:
1)当您直接直接访问字段时,它们允许您更改数据类型.
2)它们为数据访问增加了一定程度的保护
然而,根据我的想法,我已经了解了字段修饰符的使用#2,在我看来属性只是生成了额外的代码,除非你有一些理由改变类型(#1) - 因为你是(或多或少)创建隐藏方法来访问字段而不是直接访问.
然后可以将整个修饰符添加到属性中,这进一步使我对属性访问数据的需要的理解变得复杂.
我已经阅读了不同作者关于"属性"的一些章节,并且没有人真正解释过对属性与字段与封装(以及良好的编程方法)的良好理解.
有人能解释一下:
1)为什么我想要使用属性而不是字段(特别是当它出现时我只是添加额外的代码
2)在跟踪其他人的代码时,有关识别属性的使用以及不将它们视为简单方法(除了get; set明显)之外的任何提示吗?
3)任何关于何时使用什么的良好编程方法的一般经验法则?
感谢和抱歉这篇长篇文章 - 我不想只问一个问题100x而不解释为什么我再问它.
kem*_*002 21
1)为什么我想要使用属性而不是字段(特别是当它出现时我只是添加额外的代码
您应该始终使用属性.它们抽象直接访问字段(如果您不创建字段,则为您创建).即使该属性除了设置值之外什么都不做,它可以在以后保护您.稍后将字段更改为属性是一个重大更改,因此如果您有一个公共字段并希望将其更改为公共属性,则必须重新编译最初访问该字段的所有代码.
2)在跟踪其他人的代码时,有关识别属性的使用以及不将它们视为简单方法(除了get; set明显)之外的任何提示吗?
我并不完全确定你在问什么,但是当追踪别人的代码时,你应该总是假设该属性正在做的事情不仅仅是获取和设置一个值.尽管在getter和setter中没有放入大量代码是公认的做法,但你不能只假设它是一个属性,它会表现得很快.
3)任何关于何时使用什么的良好编程方法的一般经验法则?
我总是使用属性来获取和设置方法.这样我可以稍后添加代码,如果我需要检查值是否在某些范围内,而不是null等.不使用属性,我必须返回并将这些检查放在我直接访问该字段的每个地方.
Dan*_*son 11
关于Properties的一个好处是getter和setter可以有不同的访问级别.考虑一下:
public class MyClass {
public string MyString { get; private set; }
//...other code
}
Run Code Online (Sandbox Code Playgroud)
此属性只能在内部更改,例如在构造函数中更改.阅读依赖注入.构造函数注入和Property注入都处理来自某种形式的外部配置的设置属性.那里有很多框架.如果您深入研究其中一些,您将对物业及其使用有一个良好的感觉.依赖注入也将帮助您解决有关良好实践的第3个问题.
在查看其他人的代码时,您可以判断某些东西是方法还是属性,因为它们的图标不同.此外,在Intellisence中,属性摘要的第一部分是Property.
您不必担心通过属性访问字段所需的额外代码,它将被JIT编译器"优化"(通过内联代码).除非它太大而无法内联,但无论如何你还需要额外的代码.
用于定义简单属性的额外代码也是最小的:
public int MyProp { get; set; } // use auto generated field.
Run Code Online (Sandbox Code Playgroud)
当您需要自定义时,您可以稍后定义自己的字段.
所以你留下了额外的封装/数据保护层,这是一件好事.
我的规则:始终通过属性公开字段
您可能希望在字段上使用属性有几个原因,这里只是一对:
一个.通过以下方式
public string MyProperty { get; private set; }
Run Code Online (Sandbox Code Playgroud)
你正在使该物业"只读".没有人使用你的代码可以修改它的价值.在某些情况下,这不是严格正确的(如果您的属性是列表),但这些是已知的并且有解决方案.
湾 如果您决定需要增加代码使用属性的安全性:
public string MyProperty
{
get { return _myField; }
set
{
if (!string.IsNullOrEmpty(value))
{
_myField = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)你可以告诉他们属性,因为他们没有().编译器会告诉您是否尝试添加括号.
始终使用属性被认为是一种好习惯.