我有一个类和构造函数,以便像这样启动它:
public class Merchant
{
public int userID;
public int clubID;
public short categoryID;
public string posTerminalID;
public string name;
public double score;
public double subClubSharePercent;
public double simClubSharePercent;
public bool isActive;
public string modificationDatetime;
public Merchant()
{
}
public Merchant(int uID, int cID, Int16 aID, string pID, string n, double s, double sSp, double sCp, Boolean iA, DateTime dt)
{
Date da = new Date();
this.userID = uID;
this.clubID = cID;
this.categoryID = aID;
this.posTerminalID = pID;
this.name = n;
this.score = s;
this.subClubSharePercent = sSp;
this.simClubSharePercent = sCp;
this.isActive = iA;
this.modificationDatetime = da;
}
}
如何修改类成员值:
使用构造函数和语法初始化类有什么区别? 谢谢。
答案 0 :(得分:3)
构造函数对于设置开发人员永远无法设置的变量非常有用。这些包括私人领域,私人职能和私人财产。
您宣布了很多公共领域。你知道他们是领域,因为没有“安装人员”。或者' getter'功能。但是,属性是通过具有getter和setter函数来定义的。 Setter和getter不仅仅是C#
现象,它们在许多面向对象语言中都很有用。
在C#
中,程序员可以在必要时设置公共属性 - 通过构造函数初始化公共属性(除了少数例外)并不一定有用。也就是说,有些模式要求要求将每个字段传递给构造函数意味着该对象不能存在所有信息。在您的情况下,由于您在public Merchant()
中有无参数构造函数,因此这并不是一个问题。
C#
还允许在语法中初始化对象,而无需通过构造函数中的参数传递每个属性。
考虑一下这里的区别:
//Constructor with all parameters
public Merchant(int uID, int cID, Int16 aID, string pID, string n, double s, double sSp,
double sCp, Boolean iA, DateTime dt) {
Date da = new Date();
this.userID = uID;
this.clubID = cID;
this.categoryID = aID;
this.posTerminalID = pID;
this.name = n;
this.score = s;
this.subClubSharePercent = sSp;
this.simClubSharePercent = sCp;
this.isActive = iA;
this.modificationDatetime = da;
}
//Code using it
Merchant merchant = new Merchant(uID, cID, aID, pID, n, s, sSp, sCp, iA, dt);
与
//Constructor with no parameters
public Merchant( ) { }
//Code using it
Merchant merchant = new Merchant( ) {
userID = uID,
categoryID = aID,
isActive = iA,
modificationDateTime = da
};
主要区别在于,使用第一种方法,您可以强制执行所有参数。但是,第二种方法使用户更灵活地仅实例化他们想要/需要的内容。
答案 1 :(得分:2)
您只能调用一次类构造函数。一旦构造了对象,它就被构造出来并且只是它(抛开任何通过反射在构造函数中调用代码的奇怪尝试)。
如果您希望能够在构造类之后使用单个方法更改类的值,则必须编写一个方法来执行此操作(可能您不希望有人只更改一个成员一次变量?针对变量运行验证,出于线程安全的原因,您不能一次运行所有变量?)。
如果您不希望外部对象能够修改类的值,则应该使这些公共属性具有私有集,例如:
public bool isActive { get; private set; }
这将清楚表明可以读取属性但不能在类本身之外写入,并防止非成员修改变量。
如果希望属性只能由构造函数设置(甚至成员方法都不能更改它们),请标记它们readonly
。但要意识到要在这里获得新的价值,你必须创造一个全新的对象(即new Merchant(param, param, param....
)。