1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 32
Текст из файла (страница 32)
Программу моно также запустить и с использованием интерфейса Windows, дважды щелкнув наимени в окне или в Проводнике Windows.170Часть III. Объектно-основанное программироваРис. 7.4. Выполнение программы DisplayArguments. ехе из приглашения DOS приводит к выводу информации о ее аргументахКак показано на рис. 7.5, двойной щелчок на имени D i s p l a y A r g u m e n t s приводитк запуску программы без передачи ей аргументов.Puc.
7.5. В Проводнике Windows вы можете запустить программу посредством двойного щелчка на ее имениПеретаскивание и отпускание одного или нескольких файлов на пиктограмму D i s p l a y A r g u m e n t s . е х е в Проводнике Windows приводит к выполнению программы,аналогичному вводу в командной строке D i s p l a y A r g u m e n t sименафайлов.
Одновременное перетягивание и отпускание файлов a r g l . t x t и a r g 2 . t x t н а пиктограммуD i s p l a y A r g u m e n t s дает результат, показанный на рис. 7.6.Для того чтобы перетащить нескольконажмите клавишу <Ctrl> и выберитепоказано на рис. 7.6. Теперь нажмитефайлов и отпустите их на пиктограммуГлава 7. Функции функцийфайлов, выберите в списке первый файл,остальные требующиеся вам файлы, каккнопку мыши, перетяните все множествоприложения D i s p l a y A r g u m e n t s .171Puc. 7.6. Windows позволяет перетащить и отпустить файлы на пиктограмму консольного приложенияВывод программы D i s p l a y A r g u m e n t s в этом варианте запуска показан на рис.
7.7.Puc. 7.7. Перетаскивание файлов на пиктограмму приложения дает тотже эффект, что и указание их имен в командной строке172Часть III. Объектно-основанное программированиеОбратите внимание, что конкретный порядок передачи файлов приложениюпри использовании технологии перетаскивания не определен.Ф у н к ц и я W r i t e L i n e ()Вы могли заметить, что функция WriteLine (), использовавшаяся в рассматриваемых программах, представляет собой не более чем вызов функции класса Console:Console.WriteLine("Это — вызов ф у н к ц и и " ) ;Функция WriteLine () — одна из множества предопределенных функций, предоставляемых библиотекой .NET. Console — предопределенный класс, предназначенный для использования в консольных приложениях.Аргументом функции WriteLine (), применявшимся в примерах выше, являетсястрока string.
Оператор + позволяет программисту собрать эту строку из нескольких строк или строк и переменных встроенных типов, например, так:string s = "Маша";Console. WriteLine ("Меня зовут " + s +" и мне " + 3 + " г о д а " ) ;В результате вы увидите выведенную на экран строку "Меня зовут Маша и мнеЕв'года".Второй вид функции WriteLine () допускает наличие более гибкого множества аргументов, например:Console .WriteLine ("Меня зовут { о } и мне {l}"Маша", 3 ) ;года",Первый аргумент такого вызова называется форматной строкой.
В данном примерестрока "Маша" вставляется вместо символов {0} — ноль указывает на первый аргумент после командной строки. Целое число 3 вставляется в позицию, помеченную как{l}. Этот вид функции более эффективен, поскольку конкатенация строк не так проста, как это звучит, и не столь эффективна.Кроме того, в этом варианте в форматной строке может использоваться ряд управляющих элементов, которые указывают, как именно должны выводиться аргументы функции WriteLine (). Вы познакомитесь с ними в главе 9, "Работа со строками в С#".Передача аргументов в Visual Studio 2005Для того чтобы запустить программу в Visual Studio 2005, сначала удостоверьтесь,что она собрана без ошибок.
Выберите команду меню Builds Build имя программыи убедитесь в отсутствии в окне Output сообщений об ошибках. Корректное сообщениев этом окне должно выглядеть какBuild: 1 s u c c e e d e d , 0 f a i l e d , 0 s k i p p e dЕсли в окне Output вы видите что-то другое — ваша программа не запустится.Выполнить программу без передачи аргументов — дело одного щелчка. После того какпрограмма успешно собрана, выберите команду меню Debug^Start Debugging (или нажмите клавишу <F5>) или Debug^Start Without Debugging (клавиши <Ctrl+F5>) и получите желаемое.Глава 7. Функции функций173По умолчанию Visual Studio выполняет программу, не передавая ей аргументов. Ее:это не то, что вам нужно, вы должны указать Visual Studio, какие аргументы следуетредавать.
Для этого выполните такие шаги.1. Откройте окно Solution Explorer, для чего воспользуйтесь командой меш!V i e w : Solution Explorer.Окно Solution Explorer содержит описание вашего решения. Решение состоит изодного или нескольких проектов. Каждый проект описывает программу. Напрнмер, проект D i s p l a y A r g u m e n t s гласит, что P r o g r a m .
c s — один из файлевашей программы, и что ваша программа является консольным приложеннаяПроект также содержит описание других свойств, включая аргументы, испоизуемые при запуске программы D i s p l a y A r g u m e n t s из Visual Studio.2. Щелкните правой кнопкой мыши на DisplayArguments в Solution Eхplorer и выберите из раскрывающегося меню команду Properties, как показано на рис.
7.8.При этом перед вами появится окно вида, представленного на рис. 7.9, в которойможно указать множество различных настроек вашего проекта — только вот жлать этого без глубокого понимания, что именно вы настраиваете, ни в коем еличае не следует.Puc. 7.8. Обращение к свойствам проекта посредством щелчка правой кнопкой мыши в Solution Explorer3. На вкладке DisplayArguments выберите в списке вкладок в левой части]Debug.4. В поле Command Line Arguments группы Start Options введите аргументы,!которые вы хотите передать в программу при запуске ее из Visual Studio.174Часть III. Объектно-основанное программированиеPuc.
7.9. Введите аргументы программы в поле Command Line Argumentsна вкладке Debug5. Сохраните и закройте окно Properties, а затем выполните программу с помощьюкоманды меню Debug^Start.Как показано на рис. 7.10, Visual Studio откроет окно DOS с ожидаемым результатом выполнения программы.Puc. 7.10. Передача аргументов консольному приложению в Visual StudioГлава 7. Функции функцийЕдинственным отличием между выводом программы из Visual Studio 2005 и из Ямандной строки является отсутствие на экране строки с именем самой программы и siреданными ей аргументами.176Часть III. Объектно-основанное программированиеГлава 8Методы класса> Передача объекта в функцию> Преобразование функции класса в метод> Что такое t h i s> Генерация документацииосле статических функций, рассматривавшихся в главе 7, "Функции функций",мы перейдем к нестатическим методам класса.
Статические функции принадлежат всему классу, в то время как методы — экземплярам класса. Кстати, многие профаммисты предпочитают называть все одним словом -— либо методами, либо функциями,не делая того различия между ними, на которое обращено ваше внимание здесь. Однакоимеющееся отличие между статическими и нестатическими функциями очень важно.Ссылка на объект передается в функцию точно так же, как и переменная, принадлежащая типу-значению, с единственным отличием — объекты всегда передаются в функцию только по ссылке.Следующая маленькая программа продемонстрирует, каким образом можнопередать объект в функцию:// P a s s O b j e c tusing S y s t e m ;namespace{public}-демонстрацияпередачиобъектаPassObjectclasspublicStudentstringsName;}public c l a s s P r o g r a m(public s t a t i c v o i d M a i n ( s t r i n g [ ]{Studentstudent=newargs)Student();вфункцию// П р и с в а и в а е м имя путем н е п о с р е д с т в е н н о г о//полю о б ъ е к т аConsole.WriteLine("Сначала:");student.sName ="Madeleine";OutputName(student);обращенияк// Изменяем имя с и с п о л ь з о в а н и е м функцииConsole.WriteLine("Послеизменения:");SetName(student,"Willa");OutputName(student);//Ожидаем п о д т в е р ж д е н и япользователяConsole.WriteLine("Нажмите <Enter> для " +" з а в е р ш е н и я п р о г р а м м ы .
. . ") ;Console.Read();// OutputNamepublicstatic- Вывод имени с т у д е н т аvoid OutputName(Studentstudent){// Вывод т е к у щ е г о имени с т у д е н т аConsole.WriteLine("Student.sName=student.sName);{o}",}// SetName - и з м е н е н и е имени с т у д е н т аpublics t a t i c void SetName(Studentstudent,stringsName){student.sName}}=sName;}Программа создает объект s t u d e n t , в котором не содержится ничего, кроме име~Она сначала присваивает имя непосредственно и выводит его с помощью функции OutputName().Затем программа изменяет имя посредством функции S e t N a m e ( ) .
Поскольку всеобъекты в С# передаются в функции по ссылке, изменения, внесенные в объект studd e n t в функции, остаются и после возврата из нее. Когда функция M a i n () опять вьзывает функцию для вывода имени студента, последняя выводит измененное имя, что видно из вывода программы на экран:Сначала:Student.sName = MadeleineПосле изменения:Student.sName = Willa.Нажмите < E n t e r > для з а в е р ш е н и япрограммы.Обратите внимание, что при передаче ссылочного объекта в функцию ключевое слово r e f не используется. Функция, которой объект передается по ссылке, может посредством этой ссылки изменить только содержимое объекта, вне в состоянии присвоить новый объект, как показано в следующем фрагментисходного текста:178Часть III.
Объектно-основанное программированStudent s t u d e n t = n e w S t u d e n t ( ) ;student.Name = " M a d e l e i n e " ;OutputName ( s t u d e n t ) ;Console. W r i t e L i n e ( s t u d e n t . N a m e ) ;I // И с п р а в л е н н а яpublicstaticфункцияvoid//Всееще"Madeleine"O u t p u t N a m e () :OutputName (Studentstudent)}student=newstudent.NameStudent();=//////He п р и в о д и т к изменениюобъектаs t u d e n t внеOutputName()"Pam";}Класс представляет собой набор элементов, описывающий объект или концепцию реального мира. Например, класс V e h i c l e может содержать данные о максимальной скорости, максимальном разрешенном весе, количестве пассажирских мест и т.д. Однакотранспортное средство имеет и активные свойства: возможность тронуться с места, остановиться и т.п.
Эти действия можно описать функциями, работающими с даннымитранспортного средства. Эти функции представляют собой такую же часть класса V e h i cle, как и его члены-данные.Определение функций - статических членовНапример, вы можете переписать программу из предыдущего раздела немного иначе:// P a s s O b j e c t T o M e m b e r F u n c t i o n - д л я р а б о т ы// используется с т а т и ч е с к а я ф у н к ц и я - ч л е нUBing S y s t e m ;сполямиобъектаnamespace PassObjectMemberToFunction{publicclassStudent(publicstringsName;// OutputName - в ы в о д и м е н и с т у д е н т аpublicstatic void OutputName(Studentstudent){/ / Вывод т е к у щ е г о и м е н и с т у д е н т аConsole.WriteLine("Student.sName=student.sName);{o}",}// SetName - и з м е н я е м имя с т у д е н т аpublic s t a t i c v o i d S e t N a m e ( S t u d e n tГлава ft Методы классаstudent,179string{sName)s t u d e n t .