未设置为对象实例的对象引用



如何在一行中声明和初始化下面的内容

private Data model1 = new Data { M1 = 0, M2 = 0 };
private Data model2 = new Data { M1 = 0, M2 = 0 };
private Data model3 = new Data { M1 = 0, M2 = 0 };
private Data model4 = new Data { M1 = 0, M2 = 0 };
private Data model5 = new Data { M1 = 0, M2 = 0 };
....

像这样→

private MyData model1, model2, model3, model4, model5 = new MyData {Max = 0, Min = 0};

未设置为对象实例的"对象"引用;是一个很有名的错误,这里有一个规范的答案。错误不在您尝试初始化模型变量的行中,而是在稍后使用变量model1、model2、model3和model4时,只有最后一个model5被创建和初始化。

如果您对集合感到满意,那么就不会有太大的问题。你可以为5个MyData实例创建一个数组,并循环该数组以初始化具有相同值的5个实例,但如果你想在一行中有5个单独的实例,每个实例分配给5个不同的变量名称,那么,据我所知,该功能不存在,也许没有真正的理由拥有它。但我不知道该语言的未来版本是否允许。

与此同时,有一个可能的解决方案,尽管不是最明确的解决方案。(不过,你真的需要它吗?)它涉及到使用5个元组MyData

您可以在MyData类中实现一个静态方法,返回5个初始化的变量,如下所示

public class MyData
{ 
public int Max { get; set; }
public int Min { get; set; }

public static (MyData model1, MyData model2, MyData model3,  
MyData model4, MyData model5)  
FiveInstanceFactory(int max, int min)
{
MyData[] factory = new MyData[5];
for (int x = 0; x < factory.Length; x++)
factory[x] = new MyData {Max = max,Min = min};

return (factory[0], factory[1], factory[2], factory[3], factory[4]);
}
}

现在,您就可以用您喜欢的5个名称创建5个实例了。

(MyData model1, MyData model2, MyData model3,  
MyData model4, MyData model5) = MyData.FiveInstanceFactory(0,0);
model1.Max ++;
model2.Min++;
Console.WriteLine($"Min={model1.Min}, Max={model1.Max}");
Console.WriteLine($"Min={model2.Min}, Max={model2.Max}");
MyData[] data = Enumerable.Range(0, 5).Select(a => new MyData()).ToArray();
public class MyData
{
public int Max { get; set; } = 0;
public int Min { get; set; } = 0;
}
private var modelList = new List<MyData>();
for(var i = 0; i < 5; i++)
modelList.Add(new MyData { Max = 0, Min = 0});

这不是单行,但比你想做的要简单。

相关内容

  • 没有找到相关文章

最新更新