将参数传递给构造函数,构造函数是对象类的属性

时间:2016-06-11 14:14:33

标签: c# oop parameters constructor

我对C#和编程领域都很陌生。我一直在书籍和YouTube视频中进行一些练习,以包围许多这些概念。

目前,我坚持这个问题。我有一个寄售商店的小应用程序,我正在努力删除硬编码的样本数据,并让程序从文本文件中读取数据。

这是我的供应商类:

public class Vendor
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public Vendor(string firstName, string lastName)
    {

        FirstName = firstName;
        LastName = lastName;
    }
}

这实际上是我的供应商的.csv文件并将它们推入字符串数组,创建对象并使用数组值填充它的属性,然后将该项添加到Vendor类型的列表中。这种方法不会引发任何错误。

private void ReadFromFile()
{
    string line = "";                
    while ((line = myReader1.ReadLine()) != null)
    {
        string[] data = line.Split(',');                    
        Vendor v = new Vendor(data[0], data[1]);
        store.Vendors.Add(v);
    }
}

当我尝试使用相同的解决方案将项目添加到列表时,我想传递项目的“所有者”,这是属于Vendor类型的属性,位于我的Items类中。由于我无法在构造函数中将对象作为参数传递,因此我决定坚持传递正式的数据类型。我基本上想要使用供应商的First Name& amp;属性。姓氏,并将其设置为项目所有者的名字和姓氏。

public class Item
{
    public string Title { get; set; }        

    public decimal Price { get; set; }             

    public Vendor Owner { get; set; }

    public Item(string title, decimal price, string fName, string lName)
    {
        Title = title;            
        Price = price;
        Item.Owner.FirstName = fName; // this is what I want to do
        Item.Owner.LastName = lName; // throws objref error
    } 
}

//Input file format: title,price,fname,lname
while ((line = myReader2.ReadLine()) != null)
{
    string[] data2 = line.Split(',');
    decimal price = decimal.Parse(data2[1]);                              
    Item i = new Item(data2[0],price,data2[2],data2[3]);                
    store.Items.Add(i);
}

字符串使它进入数组,但是当我运行调试器并检查我的store.Items List时,除了Owner之外,每个属性值都被设置为null。 我知道一个解决方案可能是以某种方式将fName + lName组合成一个字符串,但是我很难理解我的Item构造函数如何根据它将接受的参数来设置。无论我尝试什么,Oner属性都不会收到值,这会导致我的应用程序的其余部分崩溃。

我已经在这工作了几个小时,但我似乎无法提出一个有效的解决方案,甚至是这种方案的解决方法。

非常感谢任何帮助。

谢谢!

3 个答案:

答案 0 :(得分:0)

我认为你的代码甚至没有编译,但你想要的是:

 Owner = new Vendor(fName, lName);

这实质上创建了一个Vendor实例,并将其分配给Owner变量。 Owner未初始化且无效,这就是您获得例外的原因。

而不是:

 Item.Owner.FirstName = fName; // this is what I want to do
 Item.Owner.LastName = lName; // throws objref error

答案 1 :(得分:0)

您有异常,因为实际上并未创建Item.Owner。 解决它:

public Item(string title, decimal price, string fName, string lName)
{
    Title = title;            
    Price = price; 
    Item.Owner = new Vendor(fName, lName);
}

另外:你为什么写'Item.Owner'?它似乎不是static。仅使用Owner

答案 2 :(得分:0)

在Java中,如果某个类是另一个类的成员,则使用new来初始化它。

因此,在构造函数中,您将执行以下操作:

public Item(string title, decimal price, string fName, string lName)
    {
        Title = title;            
        Price = price;
        Owner = new Vendor(fName, lName);