【问题标题】:what is use of creating property in separate class for each entilty?为每个实体在单独的类中创建属性有什么用?
【发布时间】:2010-11-16 14:32:39
【问题描述】:

我正在学习一些很好的代码实践,这就是为什么我要通过一些代码,一些我无法理解的东西。它为每个实体在一个单独的类中创建了属性,就像在 userClass 中它具有属性

  #region public properties

    private int uid;
    public int userId
    {
        get { return uid; }
        set { uid = value; }
    }

    private string uName;
    public string userName
    {
        get { return uName; }
        set { uName = value; }
    }

    private string pwd;
    public string password
    {
        get { return pwd; }
    //    set { pwd = value; }
    }


    private string uAddress;
    public string userAddress
    { 
        get { return uAddress; }
        set { uAddress = value; }
    }


    private string fName;
    public string firstName
    {
        get { return fName; }
        set { fName = value; }
    }

    private string lName;
    public string lastName
    {
        get { return lName; }
        set { lName = value; }
    }

    private string uPhone;
    public string userPhone
    {
        get { return uPhone; }
        set { uPhone = value; }
    }

    private string uMobile;
    public string userMobile
    {
        get { return uMobile; }
        set { uMobile = value; }
    }

    private int secretQuestion;
    public int securityQuestion
    {
        get { return secretQuestion; }
        set { secretQuestion = value; }
    }

    private string userAnswer;
    public string answer
    {
        get { return userAnswer; }
        set { userAnswer = value; }
    }

    #endregion

从业务逻辑类中,它使用属性而不是直接使用任何实体的属性名称,但我很困惑有什么需要制作这样的属性?

除此之外,它有数据库列名称的枚举,这背后有一个明确的原因,如果在不久的将来我们必须更改数据库表的字段名称,那么我们不必更改整个业务逻辑类我们可以直接对枚举进行更改,但是像这样创建属性有什么用,请详细说明

【问题讨论】:

标签: c#-3.0


【解决方案1】:

你真的在问为什么它使用属性而不是公共字段?

字段是一个实现细节——它们是数据的存储方式,这不应该是外界关心的事情,至少对于 99% 的类型而言。属性是类型根据其 API 所具有的契约的一部分 - 实现 取决于类型。换句话说,这是一个封装问题。属性可以用接口、抽象方法等表示,正是因为它们使契约和实现分开。

此外,属性使数据绑定、调试和其他各种事情变得更简单。我有一个article about why properties matter,你可能会觉得有用。

说了这么多,这些属性的实现方式很繁琐——而且它们不遵守 .NET 命名约定。我会把它们写成:

public int UserId { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
// etc

【讨论】:

  • 你说这些属性的实现方式很繁琐,如何实现?
【解决方案2】:

可以在接口上定义属性,但不能在成员字段上定义。因此,如果您需要将该类重构为实现接口的类,您可以将属性放在接口上(然后让其他类也实现它们。)

【讨论】:

    【解决方案3】:

    一些类似的问题:

    Public Fields versus Automatic Properties

    Property vs public field.

    除此之外:实际上您可以轻松地自行决定公共领域或财产。比较容易理解:

    (1) NamePerson 类的属性

    (2) SpeedPlane 类的属性

    (3) EmptyString 类的公共字段。如果你说String 有一个名为Empty 的属性,那真的很奇怪。而String 有一个属性Length 很容易理解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 2014-06-09
      相关资源
      最近更新 更多