2017-07-27 71 views
1

给出一个类:设置字段{获取;集;}属性

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); 

有没有和任何区别:

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

如果不是,那么当你想做一些额外的工作(例如检查有效值等)并且完全不需要编辑基本的东西?

+6

除了其他任何东西,在你的第一种情况下,你有公共*领域*,从封装和灵活性的角度来看,这通常是一个坏主意IMO。 (在字段和属性之前还有非常规'VNP_'前缀的问题,以及参数的'in'前缀问题。)使用构造函数,还可能使属性变为只读... –

+0

使用构造函数创建一个类的_instances_。这就是你的nicePerson对象所在的类,该类是一个实例。属性用于从类外部访问类的字段。所以说,'nicePerson.VNP_Name = whatever' –

+2

奇怪的是,这有4票。嗯。 – niksofteng

回答

2

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

当你的类实例不能被创建没有这些值时使用参数化的构造函数。实例的任何可选属性都可以使用属性进行设置。考虑一个Person类。任何人至少需要一个名字才能被识别。然而,年龄可以是可选信息。

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

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

YAY!现在我明白你聪明的人是什么意思了(仍然不确定参数和属性之间的区别是什么,但我会Google)。还有一个问题 - 其实是两个:** 1)**有人说公共领域不好? ** 2)**所以我使用你的班级:Person newGuy = new Person(“Brad”,20);?我可以这样做:newGuy.Age = 25; **但不是** newGuy.Name =“Bradley”; - 对? –

+0

1)>几乎从来没有你需要公共领域的情况。他们很坏。为什么?谷歌。这很容易理解。 2)>人不会允许ctor年龄。休息是对的。 – niksofteng

0

Fields 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;} 

这些行为是正常获取的一组语句会,如果他们被打散。你也可以做到这一点,这使得属性设置能够通过类只,但得到-能够公开:

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

至于构造而言 他们是相同的。您可以轻松地在构造函数中设置字段,就像字段一样。

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; 
}