如何使一个方法中创建的类的实例可用于另一个对等方法?

时间:2010-10-02 10:47:32

标签: c# instance scoping

有没有办法根据用户想要创建多少个类对象?我能够做到这一点,但那个实例只能在创建它的方法下使用

    public void Create()
    {
        //create class objects here
    }

现在我无法在另一种方法中使用它,例如

    public void Use()
    {  
        //can't use class objects
    }

4 个答案:

答案 0 :(得分:1)

不停地问你关于你的设计决定,这里是一个直接的答案来演示使用一个领域的简单技巧:

public class MyMainClass {
    private List<MyOtherClass> _instances = new List<MyOtherClass>();

    private void Create(int number) {
        for (int i = 0; i < number; i++) {
            this._instances.Add(new MyOtherClass());
        }
    }

    private void Use() {
        // use the first instance I created
        MyOtherClass other = this._instances[0];

        other.DoSomething();
    }
    ...
}

_instances字段的范围限定为MyMainClass。这意味着它可用于它所属的类上的所有实例方法(非静态)。

至于你为什么要这样做,我会留给别人。

更新:Hemant在另一个答案中演示了另一种技术,其中Create方法将实例返回给调用者。然而,我决定坚持使用领域来展示更基本的技术。

答案 1 :(得分:1)

试试这个:

public MyObject[] Create()
{
    //create class objects here and return them
    return new[] {new MyObject(), new MyObject()};
}

//later
public void Use()
{  
    MyObject[] objs = Create();
    //use your objects as you like
}

答案 2 :(得分:0)

我认为你的意思是特定类的实例对象。请参阅here for an introduction to classes and instances

但实质上是:

public class SomeClass{
   int someData;
   void SetData(int data) {
     someData = data;
   }
   int GetData() {
      return data;
   }
}

//创建'SomeClass'的一些实例

var instance1 = new SomeClass(); var instance2 = new SomeClass();

instance1.SetData(2); isntance2.SetData(3);

答案 3 :(得分:0)

Create()中,你正在创建一个课程,但正如你所说的那样,不能在课堂外使用它。您需要做的第一件事是更改它以返回对象:

public SomeType Create()
{
  //code that creates the object here.
  //Lets say it gets put into a variable called ret
  return ret;
}
public void Use()
{
  SomeType st = Create();
  //use st here.
}

或者,代替使用调用Create的对象的方法,创建对象的方法可以将其作为参数传递给Use(SomeType st)

要对多个对象执行此操作,我们需要返回SomeType,而不是包含多个SomeType对象的对象。有时我们需要关于整个集合的某些属性和方法(例如,计数,在集合中前后移动的能力等)。在这种情况下,我们会根据需要返回一个数组,List<SomeType>HashSet<SomeType>或类似Dictionary<string, SomeType>

如果我们不需要对整个集合进行此类操作,那么返回IEnumerable<SomeType>更简单,更有效,public IEnumerable<SomeType> Create() { for(int i = 0; i != 10; ++i) { //code that creates the object here. //Lets say it gets put into a variable called ret yield return ret; } } public void Use() { foreach(SomeType st in Create()) { //use st here. } } 是一个允许人们通过一系列此类对象但不多的对象其他。 C#的语法正是为了做到这一点。假设我们要返回10个这样的对象:

yield

IEnumerable<SomeType>关键字很好地隐藏了{{1}}的很多复杂性,让您只需编写传递每个新对象的代码(复杂性仍然存在于生成的代码中,但不是您的问题)担心)。