我遇到的问题可能是一个相当明显的问题,但对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()中访问它。
我只想知道我是否在这里错过了什么?
答案 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
。
通常可以通过三种方式解决该问题。
传递bob
作为参数;使OtherMethod
以Person
作为形式参数。
将bob
设为私有静态字段。在Main
中分配字段,然后从OtherMethod
中使用它。
将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 !
}
}
希望有帮助!