关于ASP.NET MVC:C#中的访问器行为值得怀疑

Accessors behavior in c# is doubtful

本问题已经有最佳答案,请猛点这里访问。

是声明吗

1
public string FirstName;

相当于

1
public string FirstName { get; set;}

我相信没有什么不同,但我发现了以下几点:当我创建了一个模型-类似于这样

1
2
3
4
public class Subject
{
    public string SubjectName;// { get; set; }
}

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


它不是等价的代码。有很大的区别-如果没有访问器,您就拥有公共字段,而访问器则拥有自动实现的属性。MVC、WPF、Entitiy Framework等需要属性(在MVC中,默认模型绑定器仅与属性一起工作)。参见属性与字段-为什么重要?


这两个肯定不是等价的。

1
2
3
public string FirstName;

public string FirstName { get; set; }

第一个是一个典型的字段,就像一个普通的C++ C++ EDCOX1×0成员。

第二种是财产。更具体地说,它是一个自动实现的属性。属性基本上是EDOCX1的1的语法糖和EDCX1的2个函数,就像一个在Java中使用的。自动实现的属性更进一步,隐藏为您保存数据的备份字段。

由于您应该为公共API使用属性而不是字段,因此许多.NET框架/API(如MVC、EF等)都会对类的属性进行特殊处理(例如自动创建数据库架构)。

为什么要使用属性?考虑下面的例子。您有一个普通的Jane类,它有一个自动实现的属性。

1
2
3
public class Foo {
    public int Bar { get; set; }
}

你有一些客户代码:

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

假设您想添加一个事件,当您在Foo中更改某些内容时触发。由于使用了一个属性,您可以简单地更改实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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保持不变。这只是属性绝对是"正确选择"的一个例子。


1
public string SubjectName;

财产

1
public string SubjectName { get; set; }

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