ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 3174

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Ключевое слово this

В отличие от других аргументов, текущий объект в список аргументов функции не попадает, а значит, программист не назначает ему никакого имени. Однако С# не остав­ ляет этот объект безымянным и присваивает ему не слишком впечатляющее имя t h i s , которое может пригодиться в ситуациях, когда вам нужно непосредственно обратиться к текущему объекту.

t h i s — ключевое слово С#, так что оно не может использоваться в программе ни для какой иной цели, кроме описываемой.

Итак, можно переписать рассматривавшийся выше пример следующим образом:

public

c l a s s S t u d e n t

 

(

 

 

 

p u b l i c

s t r i n g

s F i r s t N a m e ;

 

p u b l i c

s t r i n g

s L a s t N a m e ;

 

p u b l i c v o i d S e t N a m e ( s t r i n g s F i r s t N a m e ,

s t r i n g s L a s t N a m e )

{

/ / Я в н а я с с ы л к а н а " т е к у щ и й / / к л ю ч е в о г о с л о в а t h i s

t h i s . S e t F i r s t N a m e ( s F i r s t N a m e )

о б ъ е к т " с п р и м е н е н и е м

;

t h i s . S e t L a s t N a m e ( s L a s t N a m e ) ;

 

p u b l i c

v o i d

S e t F i r s t N a m e ( s t r i n g

s N a m e )

t h i s . s F i r s t N a m e = s N a m e ;

 

p u b l i c

v o i d

S e t L a s t N a m e ( s t r i n g

s N a m e )

t h i s . s L a s t N a m e = s N a m e ;

 

Обратите внимание на явное добавление ключевого слова t h i s . Добавление t h i s к ссылкам на члены не привносит ничего нового, поскольку наличие t h i s подразумевается и так. Однако когда M a i n () делает показанный ниже вызов, t h i s означает s t u d e n t l как в функции SetName ( ) , так и в любом другом методе, который может быть вызван:

studentl . S e t N a m e ( " J o h n " , " S m i t h " ) ;

Когда this используется явно

Обычно явно использовать t h i s не требуется, так как компилятор достаточно разу­ мен, чтобы разобраться в ситуации. Однако имеются две распространенные ситуации, когда это следует делать. Например, ключевое слово t h i s может потребоваться при инициализации членов данных:

class P e r s o n

 

 

(

 

 

 

public

s t r i n g s N a m e ;

 

public

i n t

n I D ;

 

public

v o i d

I n i t ( s t r i n g s N a m e ,

i n t n I D )

Глава 8. Методы класса

185


{

t h i s . s N a m e = s N a m e ; / / И м е н а а р г у м е н т о в т е ж е , / / ч т о и м е н а ч л е н о в - д а н н ы х

t h i s . n I D = n I D ;

}

}

Аргументы метода I n i t () носят имена s N a m e и n I D , которые совпадают с имев ми соответствующих членов-данных. Это повышает удобочитаемость, поскольку сра видно, в какой переменной какой аргумент следует сохранить. Единственная проблем! том, что имя s N a m e имеется как в списке аргументов, так и среди членов-данных. Таи

ситуация оказывается слишком сложной для компилятора.

 

 

Добавление t h i s проясняет ситуацию, четко определяя, что именно подразумевая

под

s N a m e .

В I n i t ()

имя

s N a m e

обозначает

аргумент функции, в то

время и

t h i s . s N a m e — член объекта.

 

 

 

 

 

 

 

Ключевое слово t h i s

требуется также при сохранении текущего объек

 

для последующего применения или использования в некоторой друп

 

функции. Рассмотрим следующую демонстрационную программу Ref а

 

e n c i n g T h i s E x p 1 i с i t l y :

 

 

 

/ /

R e f e r e n c i n g T h i s E x p l i c i t l y

- п р о г р а м м а д е м о н с т р и р у е т

я в н о е

/ / и с п о л ь з о в а н и е

t h i s

 

 

 

 

 

 

u s i n g S y s t e m ;

 

 

 

 

 

 

 

n a m e s p a c e

R e f e r e n c i n g T h i s E x p 1 i с i t l y

 

 

 

{

 

 

 

 

 

 

 

 

 

p u b l i c

c l a s s P r o g r a m

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

p u b l i c

s t a t i c

v o i d

M a i n ( s t r i n g [ ]

s t r i n g s )

 

 

{

 

 

 

 

 

 

 

 

 

/ /

С о з д а н и е с т у д е н т а

 

 

 

 

 

S t u d e n t s t u d e n t = n e w S t u d e n t ( ) ;

 

 

 

s t u d e n t . I n i t ( " S t e p h e n D a v i s " ,

1 2 3 4 ) ;

 

 

' / / В н е с е н и е к у р с а в с п и с о к

 

 

 

 

C o n s o l e . W r i t e L i n e ( " В н е с е н и е в с п и с о к S t e p h e n D a v i s " +

 

 

 

 

" к у р с а B i o l o g y

1 0 1 " ) ;

 

 

s t u d e n t . E n r o l l ( " B i o l o g y

1 0 1 " ) ;

 

 

 

 

/ / В ы в о д п р о с л у ш и в а е м о г о к у р с а

 

 

 

 

C o n s o l e . W r i t e L i n e ( " И н ф о р м а ц и я

о с т у д е н т е : " ) ;

 

 

s t u d e n t . D i s p l a y C o u r s e ( ) ;

 

 

 

 

/ / О ж и д а е м п о д т в е р ж д е н и я п о л ь з о в а т е л я

 

 

C o n s o l e . W r i t e L i n e ( " Н а ж м и т е < E n t e r > д л я " +

 

 

 

 

 

" з а в е р ш е н и я п р о г р а м м ы . . . " ) ;

 

 

C o n s o l e . R e a d ( ) ;

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

/ / S t u d e n t - к л а с с ,

о п и с ы в а ю щ и й с т у д е н т а

 

p u b l i c

c l a s s S t u d e n t

 

 

 

 

 

 

186

Часть III. Объектно-основанное программировав


// Все студенты имеют имя и идентификатор

p u b l ic

s t r i n g

s N a m e ;

public

i n t

n I D ;

// Курс,

прослушиваемый студентом

C o u r s e l n s t a n c e c o u r s e l n s t a n c e ;

// I n i t

- инициализация объекта

p u b l i c v o i d I n i t ( s t r i n g s N a m e ,

i n t n I D )

{

 

t h i s . s N a m e t h i s . n I D

=s N a m e ;

=n I D ;

c o u r s e l n s t a n c e = n u l l ;

}

 

 

 

// E n r o l l

- добавление в

список

public

v o i d

E n r o l l ( s t r i n g

s C o u r s e l D )

{

 

 

 

c o u r s e l n s t a n c e = n e w C o u r s e l n s t a n c e ( ) ;

c o u r s e l n s t a n c e . I n i t ( t h i s , s C o u r s e l D ) ;

// Вывод имени студента и прослушиваемых курсов

public

v o i d

D i s p l a y - C o u r s e

( )

{

 

 

 

C o n s o l e . W r i t e L i n e ( s N a m e ) ;

c o u r s e l n s t a n c e . D i s p l a y () ;

// C o u r s e l n s t a n c e - объединение информации о студенте и

// прослушиваемом курсе

public

c l a s s C o u r s e l n s t a n c e

{

 

 

p u b l i c

S t u d e n t

s t u d e n t ;

p u b l i c

s t r i n g

s C o u r s e l D ;

// I n i t -

связь

студента

и курса

p u b l i c v o i d

I n i t ( S t u d e n t

s t u d e n t , s t r i n g s C o u r s e l D )

(

 

 

 

t h i s . s t u d e n t

= s t u d e n t ;

t h i s . s C o u r s e l D = s C o u r s e l D ;

// D i s p l a y

- вывод имени курса

p u b l i c v o i d

D i s p l a y ( )

{

C o n s o l e . W r i t e L i n e ( s C o u r s e l D ) ;

km 8. Методы класса

187


В этой программе в объекте S t u d e n t имеются поля для имени и идентк студента и один экземпляр курса (да, студент не очень ретивый...). Функция создает экземпляр s t u d e n t , после чего вызывает функцию I n i t () для его к зации. В этот момент ссылка c o u r s e l n s t a n c e равна n u l l , поскольку студен назначен ни один курс.

Метод E n r o l l () назначает студенту курс путем инициализации ссылю s e l n s t a n c e новым объектом. Однако метод C o u r s e l n s t a n c e . I n i t ( ) пол земпляр класса S t u d e n t в качестве первого аргумента. Какой экземпляр дол) передан? Очевидно, что вы должны передать текущий объект класса S t u d e n именно тот, ссылкой на который является t h i s .

Что делать при отсутствии this

Смешивать статические функции классов и нестатические методы объектов не из лучших, но тем не менее С# и здесь может прийти на помощь.

Чтобы понять, в чем состоит суть проблемы, давайте рассмотрим щий исходный текст:

/ / M i x i n g F u n c t i o n s A n d M e t h o d s - с о в м е щ е н и е ф у н к ц и й к л а с с а и / / м е т о д о в о б ъ е к т о в м о ж е т п р и в е с т и к п р о б л е м а м

u s i n g S y s t e m ;

n a m e s p a c e M i x i n g F u n c t i o n s A n d M e t h o d s

{

p u b l i c c l a s s S t u d e n t

{

p u b l i c

s t r i n g

p u b l i c

s t r i n g

s F i r s t N a m e ; s L a s t N a m e ;

/ / I n i t S t u d e n t - и н и ц и а л и з а ц и я о б ъ е к т а s t u d e n t

p u b l i c v o i d I n i t S t u d e n t ( s t r i n g s F i r s t N a m e , s t r i n g s L a s t N a m e )

t h i s . s F i r s t N a m e = s F i r s t N a m e ; t h i s . s L a s t N a m e = s L a s t N a m e ;

/ / O u t p u t B a n n e r - в ы в о д н а ч а л ь н о й с т р о к и p u b l i c s t a t i c v o i d O u t p u t B a n n e r ( )

C o n s o l e . W r i t e L i n e ( " Н и к а к и х х и т р о с т е й : " ) ;

/ / C o n s o l e . W r i t e L i n e ( ? к а к о й о б ъ е к т и с п о л ь з у е т с я ? ) ;

p u b l i c v o i d O u t p u t B a n n e r A n d N a m e ( )

/ / И с п о л ь з у е т с я / / н е п е р е д а ю т с я O u t p u t B a n n e r ( ) ;

к л а с с S t u d e n t , н о с т а т и ч е с к о м у м е т о д у н и к а к и е о б ъ е к т ы

188

Часть III. Объектно-основанное программном

/ / Я в н а я п е р е д а ч а о б ъ е к т а O u t p u t N a m e ( t h i s ) ;

}

/ / O u t p u t N a m e p u b l i c s t a t i c

- в ы в о д и м е н и с т у д е н т а

v o i d O u t p u t N a m e ( S t u d e n t s t u d e n t )

{

/ / З д е с ь о б ъ е к т у к а з а н я в н о

 

C o n s o l e . W r i t e L i n e ( " И м я с т у д е н т а -

{о}",

s t u d e n t . T o N a m e S t r i n g ( ) ) ;

}

I I T o N a m e S t r i n g - п о л у ч е н и е и м е н и с т у д е н т а p u b l i c s t r i n g T o N a m e S t r i n g ( )

{

/ / З д е с ь т е к у щ и й о б ъ е к т у к а з а н н е я в н о ; м о ж н о / / и с п о л ь з о в а т ь t h i s :

// r e t u r n t h i s . s F i r s t N a m e + " " + t h i s . s L a s t N a m e ; r e t u r n s F i r s t N a m e + " " + s L a s t N a m e ;

}

}

p u b l i c c l a s s P r o g r a m

 

{

 

p u b l i c s t a t i c v o i d M a i n ( s t r i n g [ ]

a r g s )

{

S t u d e n t s t u d e n t = n e w S t u d e n t ( ) ;

s t u d e n t . I n i t S t u d e n t ( " M a d e l e i n e " , " C a t h e r " ) ; / / В ы в о д з а г о л о в к а и и м е н и

S t u d e n t . O u t p u t B a n n e r ( ) ;

S t u d e n t . O u t p u t N a m e ( s t u d e n t ) ; C o n s o l e . W r i t e L i n e ( ) ;

/ / В ы в о д з а г о л о в к а и и м е н и е щ е р а з s t u d e n t . O u t p u t B a n n e r A n d N a m e ( ) ;

/ / О ж и д а е м п о д т в е р ж д е н и я п о л ь з о в а т е л я

C o n s o l e . W r i t e L i n e ( " Н а ж м и т е < E n t e r > д л я " +

" з а в е р ш е н и я п р о г р а м м ы . . . " ) ;

C o n s o l e . R e a d ( ) ;

Следует начать с конца программы, с функции M a i n ( ) , чтобы вы лучше разглядели имеющиеся проблемы. Программа начинается с создания объекта класса S t u d e n t и инициализации его имени. Затем она хочет всего лишь вывести имя студента с не­ большим заголовком.

Функция M a i n () вначале выводит заголовок и сообщение с использованием стати­ ческих функций. Программа вызывает функцию O u t p u t B a n n e r () для вывода строки заголовка и O u t p u t N a m e () для вывода имени студента. Функция O u t p u t B a n n e r ()

Глава 8. Методы класса

189