如何将对象的实例作为字符串?

时间:2013-04-22 14:51:21

标签: c#

是否可以将对象的实例作为字符串表示形式返回,例如'0x12345678'或只是'12345678'?

像这样的伪代码:

string myObjectsInstanceAsAString = myObject.instance.ToString();

由于

6 个答案:

答案 0 :(得分:5)

override ToString()需要method object {/ 1}}。

type

MSDN: How to: Override the ToString Method

答案 1 :(得分:3)

class MyClass {
    private static int _counter = 0;
    private int _id;
    public MyClass() {
        _id = ++_counter;
    }
    public override string ToString() {
        return _id.ToString();
    }
}

我不知道这对于排序来说是一个有用的价值,但它似乎做了你所要求的。

答案 2 :(得分:1)

如果您要根据实例查找字符串编号,可以尝试这样做:

yourInstance.GetHashCode().ToString();

您也可以通过覆盖GetHashCode方法来提高返回值,这样您就可以确定它会返回一个唯一的数字。

答案 3 :(得分:1)

根据我的评论,如果您将其用于排序目的,请改为实施IComparable

public class Foo : IComparable<Foo> {
    public int CompareTo(Foo other) {
        return SomeCalculation.CompareTo(other.SomeCalculation());
    }

    private int SomeCalculation() {
        // your implementation
    }
}

这将允许您使用默认排序器对对象进行排序,或者手动将它们进行比较。

答案 4 :(得分:1)

这取决于字符串表示的含义。对象可以以多种方式表示为字符串。在.NET中执行此操作的默认方式是返回typename。即如果你写这段代码:

class MyClass { }

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

将输出MyClass

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

要为类型制作自定义字符串表示形式,您需要覆盖ToString的{​​{1}}方法:

System.Object

这将输出class Person { public string FirstName { get; set; } public string LastName { get; set; } public Person(string fName, string lName) { FirstName = fName; LastName = lName; } public override void ToString() { return FirstName + " " + LastName; } } // in your main method Person p = new Person("Albert", "Einstein"); Console.WriteLine(p.ToString());

答案 5 :(得分:1)

假设您尝试为类的每个实例分配一个唯一的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评论。这与他的想法完全相同。