在Constructor中设置字段与{get; set;}属性

时间:2017-07-27 19:42:02

标签: c#

给出一个课程:

N/A

然后你就像使用它一样:

public class NicePeople {
     public string VNP_Name;
     public int VNP_Age;
     public float VNP_Score;

     public NicePeople(string inName, int inAge, float inScore){
         VNP_Name = inName;
         VNP_Age = inAge;
         VNP_Score = inScore;
    }
}

它和之间有什么区别:

NicePeople nicePerson = new NicePeople("Joe", 55, 1.6f);

如果没有,构造函数只是为了你想做一些额外的工作(比如检查有效值等)而基本的东西完全不需要吗?

3 个答案:

答案 0 :(得分:3)

这里真正的问题是何时使用构造函数参数vs属性。其他人已经提到了原因。这是另一个。

如果没有这些值,则无法创建类实例时使用参数化构造函数。可以使用属性设置实例的任何可选属性。考虑一个Person类。任何人都需要至少一个名称来识别。但是,年龄可以是可选信息。

public class Person {
    public Person(string name) {
        Name = name;
    }

    public string Name { get; private set; }
    public int Age { get; set; }
}

答案 1 :(得分:1)

字段VS.属性

第一种方式,您只是将它们列为无需访问者公开访问的字段:

 public string VNP_Name;
 public int VNP_Age;
 public float VNP_Score;

第二种方式是使用访问者包装字段。它被称为属性,是一个类的成员,而不仅仅是一个字段。比如这个:

 public string VNP_Name {set;get;}
 public int VNP_Age {set;get;}
 public float VNP_Score {set;get;}

如果它们被分开,这些将作为正常的get set语句。您也可以这样做,这使得属性只能由类设置,但可以公开获取:

 public string VNP_Name { private set; get;}
 public int VNP_Age { private set; get;}
 public float VNP_Score { private set; get;}

至于构造函数是否值得关注 他们是一样的。您可以像在字段中一样轻松地在构造函数中设置字段。

答案 2 :(得分:0)

埃里卡,   实际上,您可以使用构造函数来验证输入以设置类变量。虽然,您也可以让您的setter方法在更新类变量的值之前对输入进行一些验证。使用setter方法从构造函数设置值有一个优点,即如果您希望对象具有不变性。在程序中使用并发时,这是一个很好的考虑因素。然后使用构造函数用于该情况下的基本和更高级的要求。因此,如果要使对象不可变,则只能使用构造函数路径来填充最终的类变量。这意味着您使用构造函数参数提供的输入中的值创建实例,并且永远不能更改它们。它有利于代码的并发性,安全性和完整性。在下面的示例中,我将保证SQLFile(此处包含的查询)和我的DAOHelper(数据库资源)将始终与我在应用程序启动期间启动的相同。这里没有setter方法来更新我的实例成员sqlFile和daoHelper的值。希望这会有所帮助。

private final SQLFile sqlFile;
private final DAOHelper daoHelper;

@Inject
public MapMetricsDAOImpl(@Named(SQLFILE_BEAN_NAME) final SQLFile sqlFile,
                         final DAOHelper daoHelper) throws SQLException {
    this.sqlFile = sqlFile;
    this.daoHelper = daoHelper;
}