Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 修改类成员值_C# - Fatal编程技术网

C# 修改类成员值

C# 修改类成员值,c#,C#,我有一个类和构造函数,以便像这样启动它: public class Merchant { public int userID; public int clubID; public short categoryID; public string posTerminalID; public string name; public double score; public double subClubSharePercent; publi

我有一个类和构造函数,以便像这样启动它:

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;
    }
}
如何修改类成员值:

  • 再次使用构造函数方法
  • 创建修改类并调用它
  • 使用构造函数和语法初始化类之间有什么区别?
    谢谢。

    类构造函数只能调用一次。一旦对象被构造,它就被构造了,这就是它(抛开任何通过反射调用构造函数中代码的奇怪尝试)

    如果您希望能够在构建类后使用单个方法更改该类的值,则必须编写一个方法来更改该类的值(也许您不希望有人一次只更改一个成员变量?为了线程安全原因,您希望一次全部运行这些变量,对这些变量运行验证?)

    如果不希望外部对象能够修改类的值,则可能应该使这些公共属性具有私有集,例如:

    public bool isActive { get; private set; }
    
    这将清楚地表明属性可以在类本身之外读取,但不能写入,并防止非成员修改变量


    如果希望属性只能由构造函数设置(甚至连成员方法都不能更改),请将它们标记为
    只读
    。但要知道,要在这里获得新的值,您必须创建一个全新的对象(即,
    新商户(param,param,param…
    )。

    Dan Field肯定给了您一个充分的答案,但我想我也会加入一些花絮

    • 构造函数用于设置开发人员无法设置的变量,包括私有字段、私有函数和私有属性

    • 您已经声明了许多公共字段。您知道它们是字段,因为没有“setter”或“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
    };
    

    主要区别在于第一种方法,您强制执行所有要显示的参数。但是,第二种方法为用户提供了更大的灵活性,可以仅实例化他们想要/需要的参数。

    您只想更改类中项的值?当然不想再次调用构造函数。您可以将这些转换为属性,例如,
    public bool IsActive{get;set;}
    然后你可以通过
    classInstance.IsActive=true
    来更改它们。你的问题毫无意义。首先,它不是一个自定义构造函数……它只是一个构造函数。它只是碰巧有参数使它成为一个非默认构造函数。其次,你不使用构造函数来修改类的组件。你使用它们为了创建对象的新实例。因此,您只想向类添加方法,可以调用对象来改变对象的状态。我不想使用SETER GETER。为什么它没有意义?我刚才问哪一个是更好的解决方案!!考虑使用属性。