BebeSaiyan Ответов: 1

Как накопить значение в другом классе с помощью C#?


Привет! Я знаю, что это будет основной вопрос для вас, но я пытаюсь создать код, в котором класс под названием "Program2" передавал бы значение классу под названием "Holder", а Holder предполагал бы накапливать значение, передаваемое Program2. И как только я получу значение от Держателя, оно должно быть добавлено на 1. Надеюсь, в этом есть смысл. Чтобы лучше понять мои цели для этого кода, я включу текущий вывод и желаемый вывод. Я также включил фактический код для Program2 и Holder ниже. Обратите внимание, что я действительно Новичок в кодировании, поэтому, пожалуйста, оголитесь с моими объяснениями и терминологией кодирования.

Мой вывод прямо сейчас таков:
**********Первая Петля**********
Тотальный диктант: 3
Это выход, полученный из класса держателя: 3
Общий цикл пройден 1-й раз: 4

**********второй цикл**********
Это выход, полученный из класса держателя: 3
Общий цикл пройден 1-й раз: 4

То, что я хочу, чтобы результат был таким:
**********Первая Петля**********
Тотальный диктант: 3
Это выход, полученный из класса держателя: 3
Общий цикл пройден 1-й раз: 4

**********второй цикл**********
Это выход, полученный из класса держателя: 6
Общий цикл пройден 1-й раз: 7

Как вы можете видеть из моего желаемого вывода, я хочу, чтобы второй цикл добавлял/накапливал количество циклов, которые производит цикл foreach. И, надеюсь, он будет просто продолжать накапливать значение по мере прохождения третьего или четвертого цикла.

Что я уже пробовал:

Ниже приведен код для Program2:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestCode
{
class Program2
{
    private static int x = 0;
     static void Main()
    {
        int[] array = new int[] { 1,2,3};
        foreach (int element in array)
        {
            x++;
        }

        Console.WriteLine("**********First Loop**********");
        Console.WriteLine("Total loop: {0}", x);
        Holder h1 = new Holder();
        h1.setValue(x);
        h1.display();
        Console.WriteLine("Total loop passed 1st time: {0}",h1.getValue());

        SecondLoop();

        Console.ReadKey();          
    }

    public static void SecondLoop()
    {
        Console.WriteLine();
        Console.WriteLine("**********Second Loop**********");
        Holder h1 = new Holder();
        h1.setValue(x);
        h1.display();
        Console.WriteLine("Total loop passed 2nd time: {0}", h1.getValue());
    }

 }
 }


Вот код для держателя:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestCode
{
public class Holder
{
    private int x = 0;
    public Holder()
    {

    }

    public void setValue(int x1)
    {
        x = x1;
    }

    public int getValue()
    {
        return x+1;
    }

    public void display()
    {
        Console.WriteLine("This is the output produced from Holder Class: {0}",x);
    }

  }
 }


Не стесняйтесь предлагать лучшие альтернативы для этого, чтобы получить желаемый результат, о котором я упоминал выше. Это может быть совершенно другой подход, или вы можете в основном создать код, который я написал.

1 Ответов

Рейтинг:
8

OriginalGriff

Проблема в том, что вы используете два отдельных экземпляра Holder - вы создаете один в main и второй в SecondLoop. И поскольку они разные экземпляры, они имеют независимые значения-каждый из них имеет значение для себя. То же самое с автомобилями: если у вас есть машина, а у меня есть машина; вы кладете свой мобильный телефон в перчаточный ящик своей машины - вы не ожидаете найти его в перчаточном ящике моей машины, потому что мы "знаем", что каждый автомобиль является отдельным экземпляром класса автомобилей.
Вы можете сделать это - вот для чего существуют статические переменные, - но я подозреваю, что это не сработает даже тогда, потому что у вас есть метод setValue на держателе, и ваш код вызывает его в обоих случаях - так что код SecondLoop "выбросит" значение, накопленное в main.

Что бы я сделал, так это передал экземпляр Holder из main в SecondLoop в качестве параметра.
И я бы также немного изменил его, чтобы поместить инкремент в класс Holder:

public class Holder
{
    private int _X = 0;
    public int X
    {
        get { return _X; }
        set { _X = value; }
    }
    public int Inc(int inc = 1)
    {
        _X += inc;
        return _X;
    }
    public void display()
    {
        Console.WriteLine("This is the output produced from Holder Class: {0}", _X);
    }
}


BebeSaiyan

Я заменил свой код в Holder в вашем решении, но почему он дает мне массу ошибок? как, например, public X, X не существует в текущем контексте, на самом деле почти все не существует в текущем контексте. Кроме того, он дает мне недействительный токен |_.

OriginalGriff

Не знаю, что там произошло - возможно, у меня проблемы с пальцами, - но я все исправил.

BebeSaiyan

я его тоже починил. public X должен быть public int X

OriginalGriff

Ага! Полный мозговой пердеж с моей стороны там...: O

BebeSaiyan

Сейчас все работает.