Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Применение ключевого слова static





Если член класса объявляется как static, то он становится доступным до создания любых объектов своего класса и без ссылки на какой-нибудь объект. С помощью ключевого слова static можно объявлять как переменные, так и методы. Наиболее характерным примером члена типа static служит метод Main(), который объявляется таковым потому, что он должен вызываться операционной системой в самом начале выполняемой программы.

Для того чтобы воспользоваться членом типа static за пределами класса, достаточно указать имя этого класса с оператором-точкой. Но создавать объект для этого не нужно. В действительности член типа static оказывается доступным не по ссылке на объект, а по имени своего класса. Так, если требуется присвоить значение 10 переменной count типа static, являющейся членом класса Timer, то для этой цели можно воспользоваться следующей строкой кода.

Timer.count = 10;

Аналогичным образом можно вызвать метод типа static, используя имя класса и оператор-точку.

Метод типа static отличается от обычного метода тем, что его можно вызывать по имени его класса, не создавая экземпляр объекта этого класса. Пример такого вызова уже приводился ранее. Это был метод Sqrt()

типа static, относящийся к классу System.Math из стандартной библиотеки

классов С#.

//использовать модификатор static

using System;

class StaticDemo

{

//переменная типа static

public static int Val = 100;

//метод типа static

public static int ValDiv2()

{

return Val / 2;

}

}

class SDemo

{

static void Main()

{

Console.WriteLine("Исходное значение переменно "

+ "StaticDemo.Val равно " + StaticDemo.Val);

StaticDemo.Val = 8;

Console.WriteLine("Текущее значение переменной"

+ " StaticDemo.Val равно " + StaticDemo.Val);

Console.WriteLine("StaticDemo.ValDiv2(): " + StaticDemo.ValDiv2());

}

}

В методе типа static должна отсутствовать ссылка this, поскольку такой ме тод не выполняется относительно какого-либо объекта.

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

Аналогичные ограничения накладываются на данные типа static. Для метода типа static непосредственно доступными оказываются только другие данные типа static, определенные в его классе. Он, в частности, не может оперировать переменной экземпляра своего класса, поскольку у него отсутствуют объекты, которыми он мог бы оперировать class StaticError

{

public int Denom = 3; // обычная переменная экземпляра

public static int Val = 1024; // статическая переменная

/* Ошибка! Непосредственный доступ к нестатической

переменной из статического метода недопустим. */

static int ValDivDenom()

{

return Val / Denom; // не подлежит компиляции!

}

}

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

using System;

class AnotherStaticError

{

// Нестатический метод.

void NonStaticMeth()

{

Console.WriteLine("В методе NonStaticMeth().");

}

/* Ошибка! Непосредственный вызов нестатического

метода из статического метода недопустим. */

static void staticMeth()

{

NonStaticMeth(); // не подлежит компиляции!

}

}

Например, приведенный ниже фрагмент кода считается совершенно верным.

using System;

class MyClass

{

// Нестатический метод.

void NonStaticMeth()

{

Console.WriteLine("В методе NonStaticMeth().");

}

/* Нестатический метод может быть вызван из

статического метода по ссылке на объект. */

public static void staticMeth(MyClass ob)

{

ob.NonStaticMeth(); // все верно!

}

}

class a

{

static void Main()

{

MyClass ob=new MyClass();

MyClass.staticMeth(ob);

}

}

Поля типа static не зависят от конкретного объекта, и поэтому они удобны для хранения информации, применимой ко всему классу.

//использовать поле типа static для подсчета экземпляров сущестующих обьектов

using System;

class CountInst

{

static int count = 0;

//инкрементировать подсчет, когда создается обьект.

public CountInst()

{

count++;

}

//декрементировать подсчет, когда уничтожается обьект

~CountInst()

{

Console.WriteLine("Текущий подсчет: "+count);

count--;

}

public static int GetCount()

{

return count;

}

}

class CountDemo

{

static void Main()

{

CountInst ob;

for (int i = 0; i < 10; i++)

{

ob = new CountInst();

Console.WriteLine("Текущий подсчет: " + CountInst.GetCount());

}

}

}

//использовать статическую фабрику класса

using System;

class MyClass

{

int a, b;

//создать фабрику для класса MyClass

static public MyClass Factory(int i, int j)

{

MyClass t = new MyClass();

t.a = i;

t.b = j;

return t;//возвратить обьект

}

public void Show()

{

Console.WriteLine("a и b: " + a + " " + b);

}

}

class MakeObjects

{

static void Main()

{

int i, j;

//сформировать обьекты, используя фабрику

for (i = 0, j = 10; i < 10; i++, j--)

{

MyClass ob = MyClass.Factory(i, j);//создать обьект

ob.Show();

}

Console.WriteLine();

}

}

Date: 2015-09-02; view: 949; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.011 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию