【问题标题】:Classes in c# - create a string contains the class' instance nameC# 中的类 - 创建一个包含类的实例名称的字符串
【发布时间】:2015-01-31 19:49:33
【问题描述】:

我想在 C# 中创建一个类,其中包含内部字符串中的实例名称。 例如,“Person”类:

Person steve = new Person();

类将如下所示:

class Person
{
    private string Name;
}

所以字符串 'Name' 将包含:“steve”。

我该怎么做?这可能吗?

【问题讨论】:

  • 实例通常没有名称。你想完成什么?
  • 你为什么要这样做?这似乎是个糟糕的主意。
  • 如果你有Person steve = new Person(); Person joe = steve;呢?
  • 我想创建一个名为“Airport”的类,所以我需要一个带有机场名称的字符串,然后我可以下载有关特定机场的信息。 (不仅如此,它还包含更多方法)
  • 请编辑您的问题以更清楚地说明您想要什么。就目前而言,您的问题看起来像您想要一个具有变量名称的字符串。它使您看起来好像只是因为将实例分配给变量而认为实例具有名称。

标签: c# string class instance


【解决方案1】:

不,这不可能。

考虑一下:

Person steve = new Person();
Person john = steve;

现在Name 会是什么?

变量名不是实例名。实例没有名称,只有内存中的位置,并且多个变量名称可能指向同一个实例。

【讨论】:

  • 可能的,请参阅:stackoverflow.com/questions/2566101/…。当然,这并不意味着在这种情况下这是一个好主意(或者,永远,真的......)。
  • @EdS。可以获取已知变量的变量名,但是类实例本身无法获取分配给自己的变量名。
  • @EdS 那是完全不同的事情
  • @Cyral:当然,我只是假设它会被传递给构造函数或在创建对象之后。
【解决方案2】:

如果将实例创建为参数会发生什么?或者如果它在数组中使用?或者如果它被重新分配给另一个变量? 这不是一个好主意(也不是你想要的方式)

在为名称赋值的构造函数中使用string 参数:

class Person
{
    private string Name { get; set; }

    public Person(string name)
    {
         Name = name;
    }
}

并将实例创建为:

Person steve = new Person("Steve");

字符串“Steve”现在在创建时传递给类的构造函数。见Constructors (C# Programming Guide)

【讨论】:

    【解决方案3】:

    您很有可能正在寻找 Dictionary<string, Person> 将人名映射到人的实例:

    class Person
    {
        public string Name {get;set;}
    }
    
    var people = new Dictionary<string, Person>();
    
    people.Add("Steve", new Person { Name = "Steve"});
    
    var theSteve = people["Steve"];
    

    注意事项

    • 正如所有其他答案中提到的,变量/字段的名称与实例的值/属性没有直接关系。
    • 制作“姓名”private 看起来有些奇怪 - 如果您想检查此人的姓名,您应该将其公开(或者最好将其设为属性,如我的示例所示)。如果您不希望其他代码访问“名称” - 您需要在构造函数中设置它。

    也可以完全按照您的要求进行操作-“创建方法,其中存在具有给定名称的变量,该变量包含和对象的实例,并且对象的私有字段之一的名称等于变量名”。您将使用 Reflection.Emit 在运行时构造此类方法,并且可能需要使用 Reflection 命名空间中的其他 API 来更改私有字段的值...我也怀疑它是您正在寻找的。​​p >

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 2015-11-23
      • 2012-08-11
      • 2014-06-04
      相关资源
      最近更新 更多