c#中的访问者行为是值得怀疑的

时间:2013-11-07 07:48:02

标签: c# asp.net-mvc properties field

是声明

public string FirstName;

相当于

public string FirstName { get; set;}

我相信没有区别,但我发现了以下内容:当我创建一个模型时 - 就像这样

public class Subject
{
    public string SubjectName;// { get; set; }
}

然后在MVC中使用表单发布此对象,我得到SubjectNamenull。但是,如果我删除注释的访问器,那么我得到一个值。这种行为有什么理由吗?

3 个答案:

答案 0 :(得分:5)

它不是等效的代码。存在很大差异 - 如果没有访问者,您可以公开field,而访问者则自动实施property。 MVC,WPF,Entitiy Framework等需要属性(在MVC默认模型绑定器中仅适用于属性)。见Properties vs Fields – Why Does it Matter?

答案 1 :(得分:4)

这两个肯定是不等同于

public string FirstName;

public string FirstName { get; set; }

第一个是典型的field,就像普通的C ++ class成员一样。

第二个是property。更具体地说,它是auto-implemented property。属性基本上只是_get()_set(value)函数的语法糖,就像在Java中习惯的那样。自动实现的属性更进一步,隐藏支持字段,为您保存数据。

由于您假定使用属性而非字段,因此对于您的公共API,许多.NET框架/ API(如MVCEF等)将会使用类的属性执行特殊事物(例如,自动创建数据库模式)。

为什么要使用属性?请考虑以下示例。你有一个简单的类,有一个自动实现的属性。

public class Foo {
    public int Bar { get; set; }
}

你有一些客户代码:

var f = Foo();
f.Bar = 32;

假设您要添加在Foo中更改内容时触发的事件。由于您使用了属性,因此您只需更改实现:

public class Foo {
    private int m_bar;
    public int Bar {
        get { return m_bar; }
        set {
            m_bar = value;
            OnChanged();
        }
    }

    public event EventHandler Changed;
    protected virtual void OnChanged() {
        var evt = Changed;
        if (evt != null)
            evt(this, EventArgs.Empty);
    }
}

和(重要部分!)面向客户端的API保持不变。这只是属性绝对是“正确选择”的一个例子。

答案 2 :(得分:1)

字段

public string SubjectName; 

财产

public string SubjectName { get; set; } 

两者都提供相同的价值,但它们是不同的。