是否可以初始化一个自动返回其自身类型的种子的对象?

时间:2011-10-18 09:30:29

标签: c# model constructor

例如,我正在尝试初始化一个新人

var me = new Person();

但我只是想知道初始化是否可以自动返回种子?

我正在尝试将它添加到构造函数中,但我不知道如何?

public class Person
{
   public Person Person(){ return ...}
}
好吧,那确实不行。任何人都可以向我解释为什么它不起作用,如果有另一种方法可以做到这一点?

我可以进行对象初始化,但我只是想知道这是否可能?

4 个答案:

答案 0 :(得分:2)

你可以创建一个静态方法(工厂)

var seededPerson = Person.CreateNew();

public class Person
{
  private Person() {}

  public static Person CreateNew()
  {
    return new Person() { Seed = 123; };
  }
}

答案 1 :(得分:2)

构造函数初始化当前(新分配的)实例;而已。它无法返回任何东西。听起来你只想要一个工厂方法:

public class Person
{
   public static Person Create(){ return ...}
}

答案 2 :(得分:1)

public class Person
{
    protected Person()
    {
    }

    public static Person BuildPerson(out int seed)
    {
        var person = new Person();
        seed = RuntimeHelpers.GetHashCode(person);
        return person;
    }
}
你是说这个意思吗?使用基于静态方法的“代理”构造函数?

public class Person
{
    public Person(out int seed)
    {
        seed = RuntimeHelpers.GetHashCode(this);
    }
}

带有out参数的构造函数?

作为旁注,RuntimeHelpers.GetHashCode(object)返回对象的伪唯一ID。伪唯一因为这些数字可以被.NET重用。总是给出独特ID的更好的“实现”将是:

public class Person
{
    private static int seed;

    public Person(out int seed)
    {
        seed = Interlocked.Increment(ref Person.seed);
    }
}

使用Interlocked.Increment使构造函数线程安全。

答案 3 :(得分:1)

来自你的评论:

  

自动为变量添加值(在本例中为“me”)并填充实例化对象..即:拥有Person.Name =“Joe”等...没有我手动进行对象初始化或什么不...基本上我希望模型/类在我实例化后立即创建自己的数据..

只需向无参数构造函数添加实现:

public class Person
{
    public Person()
    {
        this.Name = "Joe";
    }

    public string Name { get; set; }
}

当您致电var me = new Person();时,Name已填充"Joe"

构造函数的更多用法

如果您希望能够更快地自定义名称,则可以向该构造函数添加参数,或添加带参数的其他构造函数:

public class Person
{
    public Person()
        : this("Joe") // Calls the other constructor that takes a name...
    {
    }

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

    public string Name { get; set; }
}

var me = new Person(); // Joe
var you = new Person("You");

在最新的.Net中,您还可以使用这些参数的默认值来缩短代码:

public class Person
{
    public Person(string name = "Joe") // Will be "Joe" unless you say otherwise
    {
        this.Name = name;
    }

    public string Name { get; set; }
}

var me = new Person(); // Joe
var you = new Person("You");