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
函数时,它会返回正确的值。关于实例字段发生了什么的任何想法?感谢您的帮助。
似乎
您认为设置 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;
为每个属性执行此操作,应该可以正常工作