C#-从其他类中的另一个类访问方法?
我最近开始了学习C#的旅程,所以我绝不是一个专家。 无论如何,我试图创建一个面向对象的计算器,但我遇到了一个问题,似乎我无法从某些类中的其他类访问方法。我没有得到错误代码,但当我放下断点并调试应用程序时,变量的值为0 如果我从DisplayUserData中删除该方法并将代码粘贴到主程序文件中,那么它运行良好。DisplayUserData类似乎无法传递变量或从其他类检索变量,这是为什么 哦,还有,请原谅那些可怕的方法、类和变量名 这是我的主要程序文件:C#-从其他类中的另一个类访问方法?,c#,class,C#,Class,我最近开始了学习C#的旅程,所以我绝不是一个专家。 无论如何,我试图创建一个面向对象的计算器,但我遇到了一个问题,似乎我无法从某些类中的其他类访问方法。我没有得到错误代码,但当我放下断点并调试应用程序时,变量的值为0 如果我从DisplayUserData中删除该方法并将代码粘贴到主程序文件中,那么它运行良好。DisplayUserData类似乎无法传递变量或从其他类检索变量,这是为什么 哦,还有,请原谅那些可怕的方法、类和变量名 这是我的主要程序文件: namespace Calculator
namespace Calculator
{
class Program
{
static void Main(string[] args)
{
GetUserInput userInput = new GetUserInput();
Calculator calculator = new Calculator();
DisplayUserData displayUserCalculation = new DisplayUserData();
userInput.MethodOfCalculation();
userInput.UserNumberInput();
displayUserCalculation.DisplayCalculatedUserData();
}
}
}
后跟我的GetUserInput类:
namespace Calculator
{
public class GetUserInput
{
public char Choice;
public decimal ValueOne;
public decimal ValueTwo;
public void MethodOfCalculation()
{
Console.WriteLine("Welcome to Calculator v.1!");
Console.WriteLine("Please choose a method of calculation below.");
Console.WriteLine("1: Addition");
Console.WriteLine("2: Subtraction");
Console.Write("Your choice: ");
Choice = Console.ReadKey().KeyChar;
}
public void UserNumberInput()
{
Console.Clear();
Console.WriteLine("Please enter two numbers for calculation!");
Console.Write("Number One: ");
ValueOne = Convert.ToDecimal(Console.ReadLine());
Console.Write("Number Two: ");
ValueTwo = Convert.ToDecimal(Console.ReadLine());
}
}
}
和计算器类:
namespace Calculator
{
public class Calculator
{
public decimal CalculateUserInput(char userChoice, decimal valueOne, decimal valueTwo)
{
decimal calculatedValue = 0;
switch (userChoice)
{
case '1':
calculatedValue = valueOne + valueTwo;
break;
case '2':
calculatedValue = valueOne - valueTwo;
break;
}
return calculatedValue;
}
}
}
最后是DisplayUserData类:
namespace Calculator
{
class DisplayUserData
{
GetUserInput _userInput = new GetUserInput();
Calculator _calculator = new Calculator();
public void DisplayCalculatedUserData()
{
decimal calculatedValue = _calculator.CalculateUserInput(_userInput.Choice, _userInput.ValueOne, _userInput.ValueTwo);
switch (_userInput.Choice)
{
case '1':
Console.WriteLine("Addition: " + _userInput.ValueOne + " + " + _userInput.ValueTwo + " = " + calculatedValue);
break;
case '2':
Console.WriteLine("Subtraction: " + _userInput.ValueOne + " - " + _userInput.ValueTwo + " = " + calculatedValue);
break;
}
}
}
}
您正在
DisplayUserData
类中创建UserInput
和Calculator
类的新版本(实例)。因为您使用的是新实例,所以这些实例无法访问主方法中使用的实例中包含的数据。不要在类中创建新实例,而是通过构造函数将现有实例传递给类以供使用
namespace Calculator
{
class DisplayUserData
{
private readonly GetUserInput _userInput;
private readonly Calculator _calculator;
DisplayUserData(GetUserInput userInput, Calculator calculator)
{
_userInput = userInput;
_calculator = calculator;
}
public void DisplayCalculatedUserData()
{
decimal calculatedValue = _calculator.CalculateUserInput(_userInput.Choice, _userInput.ValueOne, _userInput.ValueTwo);
switch (_userInput.Choice)
{
case '1':
Console.WriteLine("Addition: " + _userInput.ValueOne + " + " + _userInput.ValueTwo + " = " + calculatedValue);
break;
case '2':
Console.WriteLine("Subtraction: " + _userInput.ValueOne + " - " + _userInput.ValueTwo + " = " + calculatedValue);
break;
}
}
}
}
那就称它为
displayUserCalculation.DisplayCalculatedUserData(userInput, calculator);
DisplayUserData类引用的Calculator和GetUserInput类与程序引用的类不同。您应该像这样将相同的实例传递给DisplayUserData
class DisplayUserData
{
readonly GetUserInput _userInput;
readonly Calculator _calculator;
public DisplayUserData(Calculator calculator, GetUserInput userInput)
{
_calculator = calculator;
_userInput = userInput;
}
public void DisplayCalculatedUserData()
{
...
}
}
该计划将是:
class Program
{
static void Main(string[] args)
{
GetUserInput userInput = new GetUserInput();
Calculator calculator = new Calculator();
DisplayUserData displayUserCalculation = new DisplayUserData(calculator, userInput);
userInput.MethodOfCalculation();
userInput.UserNumberInput();
displayUserCalculation.DisplayCalculatedUserData();
}
}
感谢您花时间回复。不过,只有一个问题,这部分代码现在做了什么<代码>只读GetUserInput\u userInput;只读计算器\u计算器代码>我在那里定义了什么?例如,我只熟悉
Calculator\u Calculator=new Calculator()代码>我是否定义了类及其内容的整个副本?如果我没有弄错的话,那段代码只是引用了对象而没有创建它的新实例?然后当我们在主程序中创建DisplayUserData的对象时,我们给它赋值?我们是不是把课程的全部内容都传了一遍?是的,这是正确的。您只需存储对计算器和GetUserInput类的引用(包含其当前状态和内容)。这样,依赖对象(DisplayUserData)就可以访问这些对象的正确实例。