static
Ключевое слово может быть немного трудно для новичков , чтобы понять. Его основная цель состоит в том, чтобы идентифицировать члена класса как принадлежащего не к какому-либо одному экземпляру класса, а вместо этого к самому классу.
Не вдаваясь в подробности, C # (и Java) жестко реализуют объектно-ориентированный идеал, согласно которому весь код и данные должны принадлежать объекту, и, следовательно, ограничены по объему, видимости и времени жизни. Это, как правило, лучшая практика, когда применяется фундаментальный принцип объекта, представляющего какую-то реальную вещь. Однако, это не всегда; иногда вам нужна функция или переменная, к которой вы можете получить доступ из любого места в коде, без необходимости передавать ссылку на объект, содержащий ее, и с гарантией того, что данные, которые вы просматриваете или изменяете, - это то , что все иначе имеет дело, а не копия этого, принадлежащая другому экземпляру объекта.
Такое поведение было доступно в C и C ++ в форме «глобальной» функции или переменной, которая не была инкапсулирована в объекте. Таким образом, в качестве компромисса C # и Java поддерживают «статическую область видимости», промежуточную точку между действительно глобальным кодом без родительского объекта и членами экземпляра с ограниченной областью действия.
Любой «элемент кода» (функция, свойство, поле), объявленный как, static
входит в область действия с первой строки функции программы main()
и не покидает ее, пока main()
функция не завершится. Говоря простым языком, статический член существует и может использоваться, пока работает программа. Кроме того, статические члены вызываются путем вызова их как членов самого типа, а не членов какого-либо одного экземпляра этого типа:
public class Foo
{
public int MyInt {get;set;} //this is an "instance member"
public static int MyStaticInt {get;set;} //this is a "static member"
}
...
var myFoo = new Foo();
myFoo.MyInt = 5; //valid
myFoo.MyStaticInt = 5; //invalid; MyStaticInt doesn't belong to any one Foo
Foo.MyInt = 5; //invalid; MyInt only has meaning in the context of an instance
Foo.MyStaticInt = 2; //valid
Это делает статические члены видимыми для любого кода, который знает тип, независимо от того, знают ли они о каком-либо его экземпляре.
Чтобы ответить на ваш вопрос, основное преимущество маркировки чего-либо как статического состоит в том, что оно становится видимым везде, где известен сам тип, независимо от того, имеет ли потребительский код или может получить экземпляр содержащего его объекта. Есть также небольшое преимущество в производительности; Поскольку метод находится в статической области видимости, он может получить доступ только к другим статическим элементам (того же класса или других) и ко всему, что передается в качестве параметра. Следовательно, среда выполнения не должна разрешать какую-либо ссылку на текущий экземпляр содержащего объекта, как это обычно должно быть для метода экземпляра, чтобы предоставлять информацию о состоянии, зависящую от контекста.
Целые классы также могут быть помечены как статические; тем самым вы сообщаете компилятору, что объявление класса будет состоять исключительно из статических членов и, следовательно, не может быть создано. Это простой способ убедиться, что в памяти есть одна и только одна копия объекта; сделать класс и все в нем статичным. Однако очень редко это лучшее решение для такой необходимости. В ситуации, когда требуется ровно одна копия набора данных, вместо этого обычно выступает «синглтон»; это нестатический класс, который использует статический метод доступа и непубличный конструктор, чтобы обеспечить доступ к одному его экземпляру. Теоретически, синглтон обеспечивает почти те же преимущества полностью статического класса, но с добавленной возможностью использовать этот класс объектно-ориентированным способом.