是否可以在C#中引用对象的名称,以避免复制
这样的无用代码public static void Main (string[] Args)
{
Champion aatrox = new Champion("Aatrox");
Champion ahri = new Champion("Ahri");
// and so on ...
}
一直在寻找类似的东西
class Champion
{
public string Name { get; set; }
public Champion () => Name = nameOf(this);
}
但是没有找到任何办法。
答案 0 :(得分:5)
如果要在对象实例中使用变量名,则不可能,也不是一个好主意。您可以在代码的不同位置使用对象实例,在该位置可以用不同的名称命名变量(或根本不像Corak pointed out那样命名变量),因此没有可用的单一名称,因此无法创建一致的逻辑
它还会在您的程序逻辑和提供给用户的字符串之间创建依赖关系-这可能会导致更多问题,例如如果名称需要包含空格,则要使用与编码约定不同的大写或小写形式,或者要将名称翻译成其他语言。
因此,有充分的理由无法实现您想要的目标。
答案 1 :(得分:1)
@CompuFreak所说的一切都是正确的,您应该将他的回答标记为已接受。
但是,您可以做的一件事是:
Champion Aatrox = new Champion (nameof(Aatrox));
这给您带来的次要优势是,如果您意识到Aatrox的拼写错误(例如,应该有两个“ x” -es),则可以重命名变量名称,该名称会渗入您的代码中。我一直都使用“ nameof”,但不确定在这里使用它。
但是,正如已经指出的那样,您不能执行所描述的操作的主要原因是,您赋予变量的名称引用了您创建的对象,而该对象本身并不是已知的。它只是您为对象引用(某些东西可以引用同一对象)提供的名称。该引用名称仅在作用域的使用位置知道。
答案 2 :(得分:0)
我不确定是否可以使用字段来完成此操作,但是可以使用CallerMemberNameAttribute使用属性来完成此操作:
class Champion {
public string Name { get; set; }
public Champion([CallerMemberName] string name = "") {
Name = name;
}
}
这会将属性名称传递给构造函数。以下将打印预期的名称“ Aatrox”和“ Ahri”:
class Program {
static Champion Aatrox { get; set; } = new Champion();
static Champion Ahri { get; set; } = new Champion();
static void Main(string[] args) {
Console.WriteLine(Aatrox.Name);
Console.WriteLine(Ahri.Name);
Console.ReadLine();
}
}
如果要在不希望使用属性的地方创建类的实例,则可以将其包装在类中:
class ChampionContainer {
public Champion Aatrox { get; set; } = new Champion();
public Champion Ahri { get; set; } = new Champion();
}
并像这样使用它
static void Main(string[] args) {
ChampionContainer champions = new ChampionContainer();
Console.WriteLine(champions.Aatrox.Name);
Console.WriteLine(champions.Ahri.Name);
Console.ReadLine();
}