0

是声明

public string FirstName;

相当于

public string FirstName { get; set;}

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

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

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

4

3 回答 3

5

它不是等效的代码。有很大的不同——没有访问器你有公共字段,有访问器你有自动实现的属性。MVC、WPF、实体框架等需要属性(在 MVC 默认模型绑定器中仅适用于属性)。请参阅属性与字段 - 为什么它很重要?

于 2013-11-07T07:51:07.110 回答
4

这两者当然不是等价的。

public string FirstName;

public string FirstName { get; set; }

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

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

由于您应该为公共 API 使用属性而不是字段,因此许多 .NET 框架/API(如MVCEF等)将对类的属性执行特殊操作(例如自动创建数据库模式) .

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

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 保持不变。这只是属性绝对是“正确选择”的一个例子。

于 2013-11-07T07:51:17.977 回答
1

场地

public string SubjectName; 

财产

public string SubjectName { get; set; } 

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

于 2013-11-07T07:51:34.413 回答