我是初学者,目前正致力于实践项目。我的目标是创建一个Adress Book应用程序。我想要做的是我要求用户传入一个名字。我将该名称存储在变量中。我可以使用该字符串变量来命名对象吗?我已经找到了解决方案,他们都建议有一个构造函数,它需要一个名字并指定它,但我已经拥有它并且它不是我想要的。我将所有这些Person变量存储在一个Person List中(这就是我使用循环的原因)以后,我想构建一个系统来浏览Adress Book并搜索东西。所以我的整体问题是 - 我可以使用字符串变量来命名对象。有没有办法做到这一点?
while (true)
{
Console.WriteLine("Please enter names to the adress book or type \"quit\" to finish");
var input = Console.ReadLine();
var name = input;
if (string.IsNullOrEmpty(input))
{
throw new IsNullException("Name can not be null or empty");
}
if (input.ToLower() == "quit")
{
break;
}
Person person = new Person(input);
AdressBook.Add(person);
}
答案 0 :(得分:8)
没有。变量名称是程序员的便利,但它不向程序传达任何信息。另请注意,变量只是对象的引用;它不是"对象的名称" (实际上可能有很多变量引用同一个对象)。
然而,存在这样的情况:能够将对象绑定到另一条信息以便能够稍后通过该信息查看对象是方便的。一般的计算机科学术语是哈希表,在C#中,它被称为 Dictionary 。你这样使用它:
var peopleByName = new Dictionary<string, Person>();
string name = Console.ReadLine();
Person person = new Person(name);
peopleByName[name] = person;
Person theSamePerson = peopleByName[name];
theSamePerson
是通过向peopleByName
询问与name
变量的值绑定的对象而获得的,现在将引用添加到字典中的同一对象在那个名字下。
答案 1 :(得分:0)
我怀疑你正在寻找Dictionary<TK,TV>
。您可以使用字典从字符串映射到您喜欢的任何对象:
// create the dictionary to hold your records.
var records = new Dictionary<string,AddressRecord>();
var item = new AddressRecord("Mary", "Smith", "1234 N Park Ln", "Springfield", "OH");
var key = item.FirstName + " " + item.LastName;
records.Add(key, item);
// try to find someone by name
AddressRecord record;
var key = "Mary Smith";
if(records.TryGetValue(key, out record)) {
// use the record
Console.WriteLine("The address for "+ key + " is " + record.Address);
} else {
Console.WriteLine("No record found for " + key);
}
// or iterate over all the records:
foreach(var record in records.Values) {
Console.WriteLine(record.FirstName + " " record.LastName);
}
当然字典要求它的所有键都是唯一的,所以如果你认识一个名叫Jon Smith的人,你可能会遇到问题。
答案 2 :(得分:0)
我已经找到了解决方案,他们都建议使用一个带有名称并指定它的构造函数,但我已经拥有它并且它不是我想要的。
你能解释一下为什么这不是你想要的吗?在.NET中以这种方式为对象命名是常见且自然的。您可以像这样编写Person
类:
class Person
{
private string _name;
public Person(string input)
{
_name = input;
}
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
}
...然后通过调用其Person.Name
属性
var somePerson = new Person("Bob");
Console.WriteLine(somePerson.Name);
事实上,这基本上就是individual controls in Windows Forms are assigned names。
此外,假设您的AdressBook
变量被声明为List<Person>
,那么您可以像这样访问个人的姓名:
// Get the name of the third person added to the AdressBook list.
Console.WriteLine(AdressBook[2].Name);
如果出于某种原因你没有说清楚你想要将每个Person
对象的名称与对象本身分开存储,那么Aasmund's answer中提到的Dictionary<string, Person>
方法就完全可以了。如果你真的想要坚持List
容器类型,探索的另一个选择可能是使用.NET Tuple(T1, T2)
type的List<Tuple<string, Person>>
变量。
如果没有更详细的要求,您可以通过多种方式来实现这一目标。