C# 如何以字符串形式获取对象的实例?

C# 如何以字符串形式获取对象的实例?,c#,C#,是否可以获取以字符串表示形式返回的对象实例,例如“0x12345678”或仅“12345678” 类似这样的伪代码: string myObjectsInstanceAsAString = myObject.instance.ToString(); 谢谢您需要覆盖对象类型的ToString方法 您需要重写对象类型的ToString方法 如果要根据实例查找字符串编号,可以尝试以下操作: yourInstance.GetHashCode().ToString(); 此外,您还可以通过重写GetH

是否可以获取以字符串表示形式返回的对象实例,例如“0x12345678”或仅“12345678”

类似这样的伪代码:

string myObjectsInstanceAsAString = myObject.instance.ToString();
谢谢

您需要覆盖对象类型的ToString方法

您需要重写对象类型的ToString方法


如果要根据实例查找字符串编号,可以尝试以下操作:

yourInstance.GetHashCode().ToString();

此外,您还可以通过重写GetHashCode方法来改进返回值,这样您就可以确保它将返回一个唯一的数字。

如果您正在根据实例查找字符串编号,您可以尝试以下操作:

yourInstance.GetHashCode().ToString();

此外,您还可以通过重写GetHashCode方法来改进返回值,这样您就可以确保它将返回一个唯一的数字。

根据我的注释,如果您将此用于排序,请改为实现IComparable:


这将允许您使用默认的排序器对对象进行排序,或手动将一个对象与另一个对象进行比较。

根据我的评论,如果您将此用于排序,请改用IComparable:


这将允许您使用默认的排序器对对象进行排序,或手动将一个对象与另一个对象进行比较。

这取决于字符串表示的含义。对象可以用多种方式表示为字符串。在.NET中执行此操作的默认方法是返回类型名。即,如果您编写此代码:

class MyClass { }

// In the main function
MyClass mc = new MyClass();
Console.WriteLine(mc.ToString());
将输出MyClass

然而,这通常不是你想要的。您通常有一种自定义的类表示方式。例如,在DateTime类/结构中,ToString方法应返回包含日期和时间的字符串

要为类型创建自定义字符串表示形式,需要从System.Object重写ToString方法:


这将输出Albert Einstein。

这取决于字符串表示法的含义。对象可以用多种方式表示为字符串。在.NET中执行此操作的默认方法是返回类型名。即,如果您编写此代码:

class MyClass { }

// In the main function
MyClass mc = new MyClass();
Console.WriteLine(mc.ToString());
将输出MyClass

然而,这通常不是你想要的。您通常有一种自定义的类表示方式。例如,在DateTime类/结构中,ToString方法应返回包含日期和时间的字符串

要为类型创建自定义字符串表示形式,需要从System.Object重写ToString方法:


这将输出Albert Einstein。

假设您试图为类的每个实例分配一个唯一的ID,您可以为类创建一个私有静态变量,并在构造函数期间递增并将该值分配给实例属性

public class MyClass {

    private static long INSTANCE_ID = 0;
    private long ID;

    //ctor
    public MyClass() {
         this.ID = INSTANCE_ID++;
    }

    //You could build your string method based on the ID if you wanted to...
    public long getID() {
         return ID;
    }

}

编辑我在发布这个答案之前没有看到@djs的评论。这与他的想法完全相同。

假设您试图为类的每个实例分配一个唯一的ID,您可以为类创建一个私有静态变量,并在构造函数期间递增并将该值分配给实例属性

public class MyClass {

    private static long INSTANCE_ID = 0;
    private long ID;

    //ctor
    public MyClass() {
         this.ID = INSTANCE_ID++;
    }

    //You could build your string method based on the ID if you wanted to...
    public long getID() {
         return ID;
    }

}
class MyClass {
    private static int _counter = 0;
    private int _id;
    public MyClass() {
        _id = ++_counter;
    }
    public override string ToString() {
        return _id.ToString();
    }
}
编辑我在发布这个答案之前没有看到@djs的评论。这与他的想法完全相同

class MyClass {
    private static int _counter = 0;
    private int _id;
    public MyClass() {
        _id = ++_counter;
    }
    public override string ToString() {
        return _id.ToString();
    }
}
我不知道这是否是一个有用的排序值,但它似乎满足了您的要求



我不知道这是否是一个有用的排序值,但它似乎满足了您的要求。

请注意,如果您不重写它,它将返回类型名称。是的,但我将用什么来重写它?我需要根据实例以字符串形式返回一个唯一的数字。@Surfbutler-因此生成一个唯一的数字并将其转换为字符串。确保生成的内容实际上是唯一的大多数人在尝试生成唯一数字时失败。生成一个随机数将其设置为属性,然后将其作为字符串返回。您可以在类中放置一个静态计数器成员,并将当前值存储到构造函数中的私有成员变量中。然后在ToString中,返回存储值。请注意,如果不重写它,它将返回类型名称。是的,但我将用什么重写它?我需要根据实例以字符串形式返回一个唯一的数字。@Surfbutler-因此生成一个唯一的数字并将其转换为字符串。确保生成的内容实际上是唯一的大多数人在尝试生成唯一数字时失败。生成一个随机数将其设置为属性,然后将其作为字符串返回。您可以在类中放置一个静态计数器成员,并将当前值存储到构造函数中的私有成员变量中。然后在ToString中,返回存储的值。重写ToString以检索所需内容。那怎么办?那数字是什么意思?如果它是某种唯一ID,即内存位置:这在C中是不可能的。当GC执行其工作时,对象的内存位置会随着时间的推移而改变。myObject已经是实例@antonijn:我认为'instance'在C语言中不是一个有效的关键字。如果你用它来排序的话,你可能不想把它放在

ToString—相反,您可能希望实现IComparable和/或通用版本。这将允许您基于您的计算、手动或使用类似List.override ToString之类的默认排序来比较对象,以检索所需内容。那怎么办?那数字是什么意思?如果它是某种唯一ID,即内存位置:这在C中是不可能的。当GC执行其工作时,对象的内存位置会随着时间的推移而改变。myObject已经是实例@antonijn:我不认为'instance'在C中是一个有效的关键字。如果您使用它进行排序,您可能不希望它包含在ToString中,而是希望实现IComparable和/或泛型版本。这将允许您根据您的计算、手动或使用类似列表的默认排序来比较对象。请注意,这不一定是唯一的。例如,整数的散列码只是定义为整数本身。@antonijn:是的,同意。根据MSDN,GetHashCode不应用于此目的。请注意,这不一定是唯一的。例如,整数的散列码只是定义为整数本身。@antonijn:是的,同意。根据MSDN,GetHashCode不应用于此目的。是的,刚刚试过,效果很好——正是我所需要的!谢谢。是的,刚刚试过,而且很有效——正是我所需要的!谢谢。是的,谢谢Antonijn-我的类中已经有类似的字段和代码,但是它们在不同的实例中都是相同的,所以我需要某种方法为每个实例生成一个唯一的id。另一个人的解决方案符合要求+1尽管在稍有不同的情况下,这是一个有用的答案。干杯。是的,谢谢Antonijn-我的类中已经有类似的字段和代码,但它们在不同的实例中都是相同的,所以我需要某种方法为每个实例生成唯一的id。另一个人的解决方案符合要求+1尽管在稍有不同的情况下,这是一个有用的答案。干杯。谢谢乔,我已经有了一个IComparer。比较函数。这就是我需要获得实例的唯一表示的地方。一旦我添加了djs提出的解决方案,一切都很好。谢谢,+1建议进行比较。谢谢Joe,我已经有了一个IComparer。比较功能。这就是我需要获得实例的唯一表示的地方。一旦我添加了djs提出的解决方案,一切都很好。谢谢,+1为您提供了比较建议。