Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从构造函数中的列表返回对象_C#_.net_Oop - Fatal编程技术网

C# 如何从构造函数中的列表返回对象

C# 如何从构造函数中的列表返回对象,c#,.net,oop,C#,.net,Oop,我已从列表中的数据库中检索到一个静态表。 如果有人使用ID调用该类的构造函数,则构造函数会在列表中找到该对象并复制所有值 public class MyClass { public int Id { get; set; } public string Text { get; set; } public MyClass(int instanzId) { MyClass myClass = CachedList().Find(T => T.Id

我已从列表中的数据库中检索到一个静态表。 如果有人使用ID调用该类的构造函数,则构造函数会在列表中找到该对象并复制所有值

public class MyClass
{
    public int Id { get; set; }
    public string Text { get; set; }

    public MyClass(int instanzId)
    {
        MyClass myClass = CachedList().Find(T => T.Id == instanzId);
        Id = myClass.Id;
        Text = myClass.Text;
    }
}
这将始终创建该对象的新实例。 是否可以直接从列表中返回对象? 像这样:

public class MyClass
{
    public int Id { get; set; }
    public string Text { get; set; }

    public MyClass(int instanzId)
    {
        this = CachedList().Find(T => T.Id == instanzId);
    }
}

我知道静态方法很简单,但如何在构造函数中实现呢?

不,不是通过构造函数。你可以通过一种方法来做。例如,工厂:

public MyClass FindOrCreate(int instanceId)
{
    MyClass obj = CachedList().Find(T => T.Id == instanzId);
    //create obj when it does not exist

    return obj;
}

不,不是通过构造函数。你可以通过一种方法来做。例如,工厂:

public MyClass FindOrCreate(int instanceId)
{
    MyClass obj = CachedList().Find(T => T.Id == instanzId);
    //create obj when it does not exist

    return obj;
}

将缓存包装到另一个轻量级类中:

  public class MyWrapClass {
    private MyClass m_Cache;

    public MyWrapClass() {
      m_Cache = CachedList().Find(T => T.Id == instanzId);
      ...
    }
    ...

    // implicit cast to MyClass if you want it 
    public static implicit operator MyClass(MyWrapClass value) {
      if (null == value)
        return null;
      else
        return value.m_Cache;
    }
  }

  ...
  // Or MyWrapClass test = new MyWrapClass();
  MyClass test = new MyWrapClass();

将缓存包装到另一个轻量级类中:

  public class MyWrapClass {
    private MyClass m_Cache;

    public MyWrapClass() {
      m_Cache = CachedList().Find(T => T.Id == instanzId);
      ...
    }
    ...

    // implicit cast to MyClass if you want it 
    public static implicit operator MyClass(MyWrapClass value) {
      if (null == value)
        return null;
      else
        return value.m_Cache;
    }
  }

  ...
  // Or MyWrapClass test = new MyWrapClass();
  MyClass test = new MyWrapClass();

您不能从构造函数返回任何值,也不能为“this”赋值。这将始终创建该对象的新实例。-当调用新的MyClass时,您希望得到什么?@DanielA.White:至少,不是在类构造函数中。在一个结构构造器中,你可以分配给这个…我会写任何我能想到的废话,让@JonSkeet纠正我@MichaelK,你之前说过暗示所有的值都被缓存了。使用工厂方法如何显示它是否被缓存?您不能从构造函数返回任何值,也不能为“this”赋值。这将始终创建该对象的新实例。-当调用新的MyClass时,您希望得到什么?@DanielA.White:至少,不是在类构造函数中。在一个结构构造器中,你可以分配给这个…我会写任何我能想到的废话,让@JonSkeet纠正我@MichaelK,你之前说过暗示所有的值都被缓存了。使用工厂方法如何显示它是否被缓存?@MichaelK,如果你不想创建新实例,这是你唯一的选择。不幸的是。我认为有比复制属性更好的方法。@MichaelK,如果你不想创建新实例,这是你唯一的选择。很遗憾。我认为有比复制房产更好的方法。除了清晰的wtf?读取MyClass测试时=新建MyWrapClass;几个月后,我真的很喜欢这次尝试的聪明。除了清晰的wtf?读取MyClass测试时=新建MyWrapClass;几个月后,我真的很喜欢这次尝试的聪明。