C#无法从不同于实例化方法的方法访问类实例

时间:2019-02-21 18:22:34

标签: c#

我遇到的问题可能是一个相当明显的问题,但对c#和一般编码来说是新问题。我在网上环顾四周,但找不到任何可以帮助我的东西。这是我为遇到的情况准备的演示代码。

class Program
{
    class Person                             //The class
    {
        public string jobTitle = "Cashier";    

        public void Greet()                    
        {
            Console.WriteLine("Hi, im bob.");
        }
    }

    public static void Main(string[] args)   //Method it was instantiated in
    {
        Person Bob = new Person();
        Bob.Greet();

    }

    public static void OtherMethod()      //Method I want to access it in
    {
        Bob.Greet();
        Console.WriteLine(Bob.jobTitle);  //"'Bob' does not exist in the current context"
    }
}

这对我来说是一个严重的问题,因为我正在处理具有很多类的东西,并且我不得不使用临时变量将类数据从Main()传递到另一个方法的参数中。另外,所有尝试访问的数据都不是静态的。我可以在Main()中访问它。

我只想知道我是否在这里错过了什么?

3 个答案:

答案 0 :(得分:3)

在类内部(Person类中的Program类中没有类)

如果您需要在同一课程中访问Bob,请检查下面的代码

public class Person                            
{
    public string jobTitle = "Cashier";    

    public void Greet()                
    {
        Console.WriteLine("Hi, im bob.");
    }
}

public static class Program
{
    private Person _bob;
    public static void Main(string[] args)   
    {
        _bob = new Person();
        _bob.Greet();
        OtherMethod();

    }

    public static void OtherMethod()      
    {
        _bob.Greet();
        Console.WriteLine(_bob.jobTitle);  
    }
}

答案 1 :(得分:3)

  

我遇到的问题可能很明显,但是我是C#和一般编码的新手。

这是一个显而易见的问题,但这也是初学者常见的问题;我们曾经都是初学者!

  

我在网上四处张望,但找不到任何可以帮助我的东西。

您可能会从更加专注的学习过程中受益,而不仅仅是浏览互联网并希望获得最好的学习。考虑投资购买一本好书。

  

我被迫使用临时变量将Main()中的类数据转换为另一种方法的参数

如果不走极端,那是正常的,很好的。。极端地讲,您所描述的模式称为“流水数据”,因为您最终会在方法之间“游荡”数据。

为避免流失数据而竭尽全力的程序员最终陷入了另一种困境:依赖全局状态

没有一种“永远正确”的神奇方法。但是,人们普遍认为,方法的操作和返回值应主要取决于其参数;请记住,“ this”在逻辑上是一个参数。

让我们看看您的代码,并在您还是个初学者的时候就养成不良习惯

class Program
{
    class Person                    
    {

嵌套类在C#中是合法的,但最常用于类型为其他类型的实现详细信息的高级方案中。 将此分为两个非嵌套类

class Person                    
{ ... }

class Program
{ ... }

让我们看看人物:

class Person //The class

请勿留下任何说明显而易见的注释。 class Person显然是一门课;您不必再说一遍。我的指导方针是编写清楚的代码,这样就不需要注释解释做什么。使用注释来解释为什么必须存在代码

{
    public string jobTitle = "Cashier";    

公共字段是C#中不好的编程习惯。使用公共属性,然后使用CaseItLikeThis。在C#7中,这非常简洁:

    public string JobTitle => "Cashier";    

在早期版本的C#中,您会说

    public string JobTitle { get { return "Cashier"; } }

继续前进:

    public void Greet()                    
    {
        Console.WriteLine("Hi, im bob.");
    }
}

优秀的程序员甚至会关注最小的细节。

        Console.WriteLine("Hi, I'm Bob.");

好的,Person就可以了。

您实际上在问的Program问题是OtherMethod看不到局部变量Bob -应该将其重命名为bob;局部变量为casedLikeThis

通常可以通过三种方式解决该问题。

  1. 传递bob作为参数;使OtherMethodPerson作为形式参数。

  2. bob设为私有静态字段。在Main中分配字段,然后从OtherMethod中使用它。

  3. bob设为私有实例字段。创建一个new Program(),分配一个bob字段,并将OtherMethod设置为 instance 方法。然后,您可以从this.bob访问OtherMethod

我对您的建议是:用三种方式编写程序。这将是一个好习惯。

答案 2 :(得分:0)

您的问题是范围和上下文的问题。首先从编程开始就会遇到这些问题。

指出为什么无法通过第二种方法访问Bob:

class Program
{
    class Person                             //The class
    {
        public string jobTitle = "Cashier";    

        public void Greet()                    
        {
            Console.WriteLine("Hi, im bob.");
        }
    }

    public static void Main(string[] args)   //Method it was instantiated in
    { 
        // Bob is instantiated local to the main method
        Person Bob = new Person();
        Bob.Greet();
        //You didn't call OtherMethod() here
    }

    public static void OtherMethod()      //Method I want to access it in
    {
        // Since Bob was not passed in as a parameter or accessible via a global var, here you dont have access to it.  access it
        Bob.Greet();
        Console.WriteLine(Bob.jobTitle);  //"'Bob' does not exist in the current context"
    }
}

这里,以您的示例为基础,该版本可以正常工作:

class Program
    {
         static Person GlobalBob;  // must be static because we are instantiating it inside a static method

        class Person
        {
            public string jobTitle = "Cashier";

            public void Greet()
            {
                Console.WriteLine("Hi, im bob.");
            }
        }

        public static void Main(string[] args)   //Method it was instantiated in
        {
            GlobalBob = new Person();
            GlobalBob.Greet();
            OtherMethod();                       //Call your OtherMethod here otherwise it's not gonna be executed

        }

        public static void OtherMethod()      //Method I want to access it in
        {
            GlobalBob.Greet();
            Console.WriteLine(GlobalBob.jobTitle);  //Here we have access to GlobalBob 
            Console.ReadLine(); //Wait for you to press a key so you can read the output !
        }
    }

希望有帮助!