我是OOP和C#的新手,所以有一个潜在的菜鸟问题。
查看类,我看到的所有代码都需要对对象名称进行硬编码。举例来说,我们不知道用户将输入多少Customers
,以及他们的名字是什么。那如何创建类实例呢?
是否只创建一类客户作为数据类型(使用所需的方法)并将其存储在列表中?还是一个类可以容纳一个对象的多个实例,但可以创建它们并根据用户输入动态命名它们?
我还不太了解类如何在内存中保存记录等。
答案 0 :(得分:3)
如果您需要在某个对象中进行迭代,我将使用List
。
如@wazz所述,您应该将它们存储在列表中,如下所示:
List<Customer> customers = new List<Customer>();
然后,您可以开始使用列表,添加新实例,删除等等。
您可以在docs上查看更多信息。
答案 1 :(得分:2)
将客户存储在集合中。有许多不同的收集类型。最受欢迎的2种可能是List<T>
和Dictionary<TKey, TValue>
。
List<T>
,其中T
是一种类型(在您的情况下为Customer
)
List<Customer> customers = new List<Customer>();
Customer c = new Customer { Name = "My first customer" };
customers.Add(c);
c = new Customer { Name = "My second customer" };
customers.Add(c);
customers.Add(new Customer { Name = "My third customer" });
可以通过从零开始的索引访问列表中的客户
Customer c = list[5]; // Get the 6th customer
列表也可以枚举:
foreach (Customer cust in customers) {
Console.WriteLine(cust.Name);
}
Dictionary<TKey, TValue>
:通过字典,您可以通过键来查找客户,例如客户编号。
Dictionary<string, Customer> customers = new Dictionary<string, Customer>();
Customer c = new Customer { Id = "C1", Name = "My first customer" };
customers.Add(c.Id, c); // The Id is used as key, the customer object as value.
然后您可以通过
将其找回Customer c = customers["C1"];
如果提供的密钥不存在,这将引发异常。为避免异常,您可以编写:
string id = "XX";
if (customers.TryGetValue(id, out Customer cust)) {
Console.WriteLine(cust.Name);
} else {
Console.WriteLine($"Customer '{id}' not found");
}
答案 2 :(得分:1)
为了帮助您首先理解课程。
类是数据外观的蓝图。如果要盖房子,例如,要盖房子,首先要制作蓝图。这些印刷品可以用来制造许多看起来一样的房屋。这些房屋的不同之处在于颜色,木材,砖块或乙烯基,以及是否铺有地毯等区域。这只是一个示例,但让我们将这栋房子变成一个类(蓝图),然后将其中几栋房子变成实际的单个对象;最后,让我们引用同一位置的所有对象(使用列表)。
首先让我们决定我们的房屋选择是什么,这些因素使它们与众不同。它是彩色的,外部的,有或没有地毯。在这里,为了简单起见,我们将颜色设置为string
(文本),将外观设置为enum
(因此将选项进行硬编码),并在地毯上设置bool
或不设置{true或false )。
首先让我们制作enum
,因为它与类分开但在类中使用。
public enum Exterior { Brick, Vinyl, Wood }
现在让我们制作课程(蓝图)。
public class House
{
public string Color { get; set; }
public Exterior Exterior { get; set; }
public bool HasCarpet { get; set; }
}
现在我们有了蓝图,让我们实际建造一些房屋。当我们制作它们时,我们需要一种在内存中定位它们的方法,以便将它们分配给一个变量。假设我们在控制台应用程序中,这是main方法的前几行。
var house1 = new House();
var house2 = new House();
var house3 = new House();
现在,我们在内存中拥有3个独立的房子,可以通过引用house1
,house2
或house3
来访问其中的任何一个。但是,这些房屋的建造方式仍然相同,不幸的是没有颜色(由于字符串Color为空),默认为Brick(因为第一个枚举为Brick),并且没有地毯(由于HasCarpet默认为false)。
我们可以通过引用每个房屋对象引用并分配这些值来解决此问题……
house1.Color = "Red";
house1.Exterior = Exterior.Wood;
我们可以为这些类提供一个构造函数,该构造函数需要以这些值作为参数开头,或者我们可以使用更简单的内联方式(由于C#语法的强大功能)。
var house1 = new House()
{
Color = "Red",
Exterior = Exterior.Wood
};
我们也可以给它铺地毯,但是由于这所房子不会有任何东西,并且默认为false,所以我将其遗漏了。
好,让我们说我们已经通过我们的蓝图建造了所有3栋房屋。现在,将它们一起存储在一个列表中。首先,我们需要将List变成一个对象,并对其进行引用。
var houses = new List<House>();
现在让我们将房屋添加到列表中。
houses.Add(house1);
houses.Add(house2);
houses.Add(house3);
现在houses
是对我们所有房屋对象的引用。如果要在列表中找到房子,可以使用索引(从0开始)并在列表中获取该位置。因此,假设house2
需要铺地毯,但我们现在想使用列表来引用它。注意:有很多方法可以引用列表中的项目,这是基本方法。
houses[1].HasCarpet = true;
我在手机上这样做,希望没有错误。我的意图是清楚地回答您的问题并进行教育,并帮助您更好地理解课堂。
答案 3 :(得分:0)
您很有可能会使用IEnumerable<Customer>
。现实生活中的Customer
类与数据库有关。
在处理数据库时,会想到使用IQueryable<Customer>
(从IEnumerable
继承)的Linq。如果需要,您还可以使用其他集合类型,例如List<Customer>
,Dictionary<...>
等