OOP C# 实例字段不保存数据

本文关键字:保存 数据 字段 实例 OOP | 更新日期: 2023-09-27 18:33:52

我有一组实例字段,由对象G481Var从类G481Vars继承。

G481Vars G481Var = new G481Vars();

实例字段的值通过此函数分配给

    private void AssignValuesG481()
    {                       
        HtmlInputText[] G481Inputs = new HtmlInputText[13]  //Create an explicit array of type HtmlInputText to handle elements of input boxes on G481 tab.
        {
            G481Disp_Txt, G481IniVel_Txt, G481FinVel_Txt, G481Acc_Txt,
            G481Time_Txt, G481Force_Txt, G481Mass_Txt, G481Weight_Txt,
            G481Press_Txt, G481Dens_Txt, G481Energy_Txt, G481Area_Txt,
            G481Vol_Txt
        };
        double[] G481List = new double[13] //Create an explicit array of type double that stores the instance fields of class G481Vars
        {
            G481Var.Disp, G481Var.IniVel, G481Var.FinVel, G481Var.Acc,
            G481Var.Time, G481Var.Force, G481Var.Mass, G481Var.Weight,
            G481Var.Press, G481Var.Dens, G481Var.Energy, G481Var.Area,
            G481Var.Vol
        };  
        for (int i = 0; i <= 12; i++) //Perform the iterative loop
        {
            if (G481Inputs[i].Value != "")
            {
                double.TryParse(G481Inputs[i].Value, out G481List[i]);
            }
        }
    }

其中G481Vars定义为:

public class G481Vars
{
    public double Disp { get; set; }
    public double IniVel { get; set; }
    public double FinVel { get; set; }
    public double Acc { get; set; }
    public double Time { get; set; }
    public double Force { get; set; }
    public double Mass { get; set; }
    public double Weight { get; set; }
    public double Press { get; set; }
    public double Dens { get; set; }
    public double Energy { get; set; }
    public double Area { get; set; }
    public double Vol { get; set; }
}

但是,当我尝试从另一个函数CalculateG481_Click访问这些实例字段时,它们总是返回0,即使它们是事先分配的。

protected void CalculateG481_Click(object sender, EventArgs e)
{
    AssignValuesG481();
    TempInputDebugField.Value = Convert.ToString(G481Var.Disp); //This always returns 0 in the field, even though <>0 was put into the disp input field and assignvariables run.
}

当我将TempInputDebugField代码放入AssignValuesG481函数时,它会返回正确的值。关于实例字段发生了什么的任何想法?感谢您的帮助。

OOP C# 实例字段不保存数据

似乎

您认为设置 G481List 元素的值会将该值转发到用于初始化数组的G481Var的相应属性。 事实并非如此。 它所做的只是更改数组中的值。

您需要

显式设置实例的值。 您可以使用反射来动态设置属性,但是只有 13 个属性,仅显式设置它们会更安全、更干净:

G481Var.Disp   = double.Parse(G481Inputs[0].Value)
G481Var.IniVel = double.Parse(G481Inputs[1].Value)
G481Var.FinVel = double.Parse(G481Inputs[2].Value)
G481Var.Acc    = double.Parse(G481Inputs[3].Value)
G481Var.Time   = double.Parse(G481Inputs[4].Value)
G481Var.Force  = double.Parse(G481Inputs[5].Value)
G481Var.Mass   = double.Parse(G481Inputs[7].Value)
G481Var.Weight = double.Parse(G481Inputs[8].Value)
G481Var.Press  = double.Parse(G481Inputs[9].Value)
G481Var.Dens   = double.Parse(G481Inputs[10].Value)
G481Var.Energy = double.Parse(G481Inputs[11].Value)
G481Var.Area   = double.Parse(G481Inputs[12].Value)
G481Var.Vol    = double.Parse(G481Inputs[13].Value)

从那里你可以使用TryParse来更好地处理错误值,你可以尝试使用反射来减少重复代码(以牺牲编译时的安全性为代价)等。 关键是要得到一些有用的东西,然后找到让它更好的方法。 如果您感到疲倦或尝试重构代码时遇到困难,您可以随时返回不太"优雅"的代码。

试试这个:

    for (int i = 0; i <= 12; i++) //Perform the iterative loop
    {
        double val;
        if (G481Inputs[i].Value != "")
        {
            double.TryParse(G481Inputs[i].Value, out val);
            G481List[i] = val;
        }
    }

double是一个valuetype,所以当你解析字符串时,值只存储在数组中。您必须将此值分配给G481Var属性:

double value;
if (double.TryParse(G481Disp_Txt.Value, out value)
    G481Var.Disp = value;

为每个属性执行此操作,应该可以正常工作