【问题标题】:Why should I use a Field when I can use a Property? [duplicate]当我可以使用属性时,为什么要使用字段? [复制]
【发布时间】:2012-11-27 19:21:09
【问题描述】:

可能重复:
Difference between Property and Field in C# .NET 3.5+
Why should I use an automatically implemented property instead of a field?

下面的两个示例完全相同,在类内部和外部具有相同的访问写入... 那么为什么每个人似乎都使用示例 1 而不是示例 2? 我确定我只是遗漏了一些东西,但这一直困扰着我一段时间,我一直无法找到明确的答案。

class SampleClass
{
    /// Example 1
    /// Shown by online examples. 
    /// Why use a Field AND a Property where you could just use Example 2?
    private int age;
    public int Age { get { return age; } }
    private void setAge()
    {
        age = 1;
    }

    /// Example 2
    /// Tidier code and better understanding of how Age2 can be accessed. 
    /// Personally I prefer this method, though am I right to use it over Example 1?
    public int Age2 { get; private set; }
    private void setAge2()
    {
        Age2 = 1;
    }
}

【问题讨论】:

  • 这些重复项均无效。他不是在问他是否应该使用字段与属性,而是在询问手动实现的属性与自动实现的属性。
  • @OP 还注意到自动实现的属性是在 C# 3.0 中引入的,但属性自 C# 1.0 起就在该语言中。手动定义属性的许多示例要么是遗留下来的旧代码示例,要么来自尚未(或尚未)习惯新语法的人。当然,在某些情况下,您可以手动执行自动道具无法执行的操作,但您发布的示例并非如此。
  • 这可能是我最挣扎的地方,什么是新的,什么是更好的做法?如果示例 2 在早期的 .NET 版本中是不可能的,并且示例 1 是实现相同效果所必需的。令人欣慰的是,通过使用示例 2,我使用了更现代的语法,而不是在示例 1 中不必要地使我的代码臃肿。:)

标签: c# properties get set field


【解决方案1】:

如果您想在属性 setter 或 getter 上提供任何实际功能,则必须使用支持字段。例如,如果您想在 setter 上进行验证,则需要使用支持字段。

public class MyClass
{
    private string myString = "blah";

    public string MyNotNullString
    {
        get
        {
            return this.myString;
        }
        set
        {
            if (value == null)
            {
                throw new ArgumentNullException("Cannot set MyNotNullString to null");
            }
            this.myString = value;
        }
    }
}

【讨论】:

    【解决方案2】:

    如果我使用的是 VS2008 或更高版本,并且不需要在 VS2005 中编译,通常我使用简写或:

    public string SomeProperty { get; set; }
    

    但有时您需要一个支持字段,尤其是在您实施 INotifyPropertyChanged 时。

    private string _someProperty;
    public string SomeProperty
    {
        get { return _someProperty; }
        set
        {
            _someProperty = value;
            OnPropertyChanged("SomeProperty");
        }
    }
    

    但即使我有一个支持字段,我仍然通过属性设置值,以保持一致性。

    【讨论】:

    • 谢谢。这不是我做过的,甚至没有想过。我假设 INotifyPropertyChanged 是一个在属性更改时触发事件的接口?请原谅我的经验不足...
    • 正确,在使用 MVVM 模式的 WPF 中工作时会大量使用它。基本上使用这种模式,您可以创建一个 ViewModel 类,并将 View 绑定到 ViewModel 上的属性。 View 为 PropertyChanged 事件注册,因此当 ViewModel 中的值发生更改时,View 可以使用新数据更新相应的控件。
    • 谢谢你,你真的很有帮助。 :D
    【解决方案3】:

    如果可能,我每次都会使用 Example2 作为整洁因素...除非有需要字段的情况,如@Platinum Azure 答案。

    对于 Example1,我能想到的唯一其他好处是,您可以在 getter 或 setter 方法中设置断点,作为找出谁在更改值的快速方法。

    【讨论】:

    • 嗯,好吧。考虑到所有这些,我理解它的方式是字段非常适合声明类中的变量/对象。而属性有一个直接的优势,我需要使用适当的读/写访问修饰符在声明类之外安全地公开变量/对象。我在这里的波长是否正确? :)
    • 哦,我没有意识到这是一个字段与属性的问题,我假设您正在比较带有 {get;set;} 的自动属性与带有支持字段的属性。好吧,理想情况下,字段应该是私有的,并且对于属性,如果可能的话使用自动道具......无论如何,这就是我的看法。
    • 这不是...我只是一个初学者,试图理解我应该如何去做一些事情,无论是否包括使用字段。在问这个之前,我从未听说过“自动”属性。仍然不确定为什么我需要一个支持领域,但也许当我的技能提高并且需要出现时,我会意识到需求是什么。现在我相信我有我的答案了,谢谢大家:)
    猜你喜欢
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2011-01-11
    • 2020-10-04
    • 1970-01-01
    • 2017-02-04
    相关资源
    最近更新 更多