Вложенный класс в C#
Я пытаюсь изучить вложенный класс в C#. Прочитав много документов и изучив изумленные взгляды, я все еще не понял, когда использовать вложенные классы. Но насколько я понимаю, я сделал небольшую примерную программу. Я вставляю свой код ниже. Эта вложенная программа класса реализована в правильной логике?, Для чего на самом деле используется вложенный класс? а также у меня возникли сомнения в этой программе, и я указал это сомнение в программе. Пожалуйста, помогите мне...
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Bank bankObj = new Bank();
bankObj.CreateAccount();
bankObj.ShowMyAccountNumber();
}
}
class Bank
{
static int accountNumber; // here if I just declare this as int accountNumber without static it showing an error in the CreatePersonalAccount(int accNo) method's first line ie accountNumber = accNo; as "Cannot access a non-static member of outer type." What actually this error mean ?
public class BankAccountSection
{
public bool CreatePersonalAccount(int accNo)
{
accountNumber = accNo;
return true;
}
}
public void CreateAccount()
{
bool result = new BankAccountSection().CreatePersonalAccount(10001);
}
public void ShowMyAccountNumber()
{
MessageBox.Show(accountNumber.ToString());
}
}
4 ответа
Вложенные классы обычно используются для небольших служебных классов, которые не используются вне охватывающего (внешнего) класса. По этой причине вложенные классы обычно private
, (Для этого есть даже правило FxCop.)
Ваш код
В вашем случае вложенный класс BankAccountSection
не очень полезен, так как сам по себе не имеет состояния. CreatePersonalAccount
может также быть просто методом внешнего класса.
относительно static int accountNumber;
: Это сделает accountNumber
общее поле для всех объектов Банка, которое наносит ущерб всей цели. Не делай этого. Если вам действительно нужно установить поле Bank
объект внутри внутреннего класса, вам нужно передать ссылку на Bank
объект для внутреннего класса. (Это отличается от Java, где такая ссылка доступна автоматически при некоторых обстоятельствах.) В вашем конкретном случае просто избавьтесь от внутреннего класса.
Примеры для законных случаев использования
- У вас есть большой алгоритм внутри метода. Вы понимаете, что выделение этого алгоритма в его собственный класс с использованием множества небольших методов и переменных экземпляра повысит читабельность. Поскольку алгоритм очень специфичен и, вероятно, бесполезен для других классов, вы помещаете алгоритм во внутренний класс. Таким образом, вы избегаете загромождения внешнего класса переменными экземпляра, используемыми только этим алгоритмом.
- Вы создаете структуру данных List, которая внутренне реализована как связанный список. Поскольку вы не открываете узлы списка для внешнего мира, вы делаете узлы внутренним классом.
Связанные с:
Во-первых, это не вложенный класс, это просто два класса в одном файле.
Теперь, даже если бы это был вложенный класс, это, вероятно, было бы примером того, когда НЕ использовать вложенные классы. Вы должны определенно отделить свою логику от логики GUI.
Я действительно не думаю, что вы все равно должны использовать вложенные классы, по моему мнению, их трудно поддерживать, но я могу ошибаться. Если бы мне действительно нужно было использовать вложенные классы, я бы сделал это только тогда, когда дочерний класс тесно связан.
Ошибка в том, что вы не можете получить доступ к члену нестатического класса без его объекта. если вы это сделаете, то он должен быть объявлен статическим.
Вы, кажется, думаете, что вложенные классы в C# ведут себя так же, как в Java. Другими словами, если вложенный класс не объявлен как статический, он будет использовать экземпляр включающего класса. В C# это не так. В C# такого понятия не существует - все вложенные классы неявно статичны.
Вот почему вы не можете получить доступ accountNumber
из вложенного класса, если это поле не объявлено как статическое. (Так как вложенный класс не имеет доступа к какому-либо конкретному экземпляру) Идомным решением этой проблемы в C# является передача экземпляра включающего класса во вложенный класс (предположительно, путем передачи this
через аргумент конструктора при его создании).