C # инкрементные статические переменные при реализации - PullRequest
1 голос
/ 15 ноября 2011

У меня есть объект bankAccount, который я хотел бы увеличить с помощью конструктора. Цель состоит в том, чтобы увеличить его с каждым новым объектом, создаваемым классом.

Примечание: я переопределил ToString () для отображения accountType и accountNumber;

Вот мой код:

public class SavingsAccount
{
    private static int accountNumber = 1000;
    private bool active;
    private decimal balance;

    public SavingsAccount(bool active, decimal balance, string accountType)
    {
        accountNumber++;
        this.active = active;
        this.balance = balance;
        this.accountType = accountType;
    }
}

Почему, когда я подключаю это к главному, вот так:

class Program
{
    static void Main(string[] args)
    {
        SavingsAccount potato = new SavingsAccount(true, 100.0m, "Savings");
        SavingsAccount magician = new SavingsAccount(true, 200.0m, "Savings");
        Console.WriteLine(potato.ToString());
        Console.WriteLine(magician.ToString());
    }
}

Вывод, который я получаю, не увеличивается по отдельности, т.е.

savings 1001
savings 1002

но вместо этого я получаю:

savings 1002
savings 1002

Как мне сделать так, чтобы оно было первым, а не вторым?

Ответы [ 6 ]

7 голосов
/ 15 ноября 2011

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

public class SavingsAccount
{
    private static int accountNumber = 1000;
    private bool active;
    private decimal balance;
    private int myAccountNumber;

    public SavingsAccount(bool active, decimal balance, string accountType)
    {
        myAccountNumber = ++accountNumber;
        this.active = active;
        this.balance = balance;
        this.accountType = accountType;
    }
}

class Program
{
    static void Main(string[] args)
    {
        SavingsAccount potato = new SavingsAccount(true, 100.0m, "Savings");
        SavingsAccount magician = new SavingsAccount(true, 200.0m, "Savings");
        Console.WriteLine(potato.ToString());
        Console.WriteLine(magician.ToString());
    }
}

А затем в вашей перегрузке ToString () вы должны напечатать myAccountNumber вместо статической переменной.

3 голосов
/ 15 ноября 2011

Потому что это статическая переменная.Он используется всеми экземплярами класса.Вам нужно сохранить увеличенное значение в переменной экземпляра.

public class SavingsAccount
{
    private static int accountNumberCounter = 1000;
    private int accountNumber;
    private bool active;
    private decimal balance;

    public BankAccount(bool active, decimal balance, string accountType)
    {
        accountNumberCounter++;
        this.accountNumber = accountNumberCounter;

        this.active = active;
        this.balance = balance;
        this.accountType = accountType;
    }

    public string ToString() 
    {
        return String.Format("{0} {1}", accountType, accountNumber);
    }
}
0 голосов
/ 15 ноября 2011

вы можете попробовать

        SavingsAccount potato = new SavingsAccount(true, 100.0m, "Savings");
        Console.WriteLine(potato.ToString());
        SavingsAccount magician = new SavingsAccount(true, 200.0m, "Savings");
        Console.WriteLine(magician.ToString());

тогда вы можете получить, что хотите.

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

0 голосов
/ 15 ноября 2011

Попробуйте это:

public class SavingsAccount
{
    private static int accountNumberMarker = 1000;
    private int accountNumber;
    private bool active;
    private decimal balance;

    public SavingsAccount(bool active, decimal balance, string accountType)
    {
        accountNumber = ++accountNumberMarker;
        this.active = active;
        this.balance = balance;
        this.accountType = accountType;
    }
}
0 голосов
/ 15 ноября 2011

Вы объявили переменную account как статическую, что означает, что она создается на уровне класса, а не на уровне экземпляра. Поэтому, когда вы делаете приращение, это происходит два раза для одной переменной.

Возможный способ достичь желаемого - вставить команду печати между ними.

0 голосов
/ 15 ноября 2011

Поскольку статические данные используются всеми членами класса?

Вам нужна статическая переменная, как у вас сейчас, для глобального числа, которое вы можете увеличивать, но вам также нужна частная переменная, специфичная для этой учетной записи.,Следовательно, вы должны добавить это:

private int thisAccountNumber;

... к определению класса и изменить существующую строку в конструкторе следующим образом:

thisAccountNumber = accountNumber++;

Затем используйте thisAccountNumber каквы будете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...