#c# #oop #object
#c# #ооп #объект
Вопрос:
Привет.
Могу ли я каким-либо образом ссылаться на объект со значением любой строки?
Classname person1 = new Classname("John");
Classname person2 = new Classname("Martin");
string getValue = "person1";
Я пробовал это: Console.WriteLine(getValue.name);
и, очевидно, это не сработало.
Что я мог бы сделать вместо этого?
Комментарии:
1. Возможно, будет лучше, если вы объясните, в чем проблема, которую вы пытаетесь решить с помощью этого подхода.
2. Не могли бы вы объяснить, почему вы этого хотите? Я никогда не видел ничего подобного раньше, и, честно говоря, это кажется плохой идеей, для чего бы это ни было, за исключением, может быть, анализа кода — но опять же, вы бы не стали жестко кодировать имена переменных в строках даже тогда.
Ответ №1:
Вы можете сохранить свои экземпляры Classname
класса в словаре под строковым ключом:
using System;
using System.Collections.Generic;
public class Classname
{
public string Name { get; set; }
public Classname(string name) { Name = name; }
}
public static class Program
{
public static void Main()
{
// store class instance under a name to be referenced later
var dict = new Dictionary<string, Classname>
{
["person1"] = new Classname("John"),
["person2"] = new Classname("Martin"),
};
Console.WriteLine(dict["person1"].Name);
}
}
Вывод:
John
Это может иметь смысл, если у вас 1000 имен и вы хотите получить экземпляр / проверить дубликаты для специального экземпляра Classname по его Name
in O(1) — затем вы помещаете их в dict под тем же именем, с которым они создаются:
var dict = new Dictionary<string, Classname>();
// use your list of names instead here
foreach (var nameNumber in Enumerable.Range(1, 2000))
{
var name = $"Name_{nameNumber}";
dict.Add(name, new Classname(name));
}
// dict provides O(1) access and O(1) check if already created
// an instance with that name
// check if inside, do not retrieve
if (dict.ContainsKey("Name_155"))
Console.WriteLine("Name_155 already constructed");
// check and retrieve, create add if not there
var n = "Name_4000"
if (dict.TryGetValue(n, out var inst))
{
// do smth with inst
}
else
{
dict.Add(n, new Classname(n));
inst = dict[n];
// do smth with inst
}
Все еще чувствую, что это довольно сложный пример.
Ответ №2:
Вы не можете. Если вы хотите ссылаться на несколько перечисленных объектов, просто создайте массив или список со своими объектами. например
Classname[] classnames = {new Classname("..."), new Classname("...")};
затем вы можете ссылаться на них как classnames[0]
и classnames[1]