tra ля-ля
» test
улюлю =)
tru лю лю
а вообще то интересное правило убирать ники если в течение 30 дней нечего не постишь. лучше бы заходы считали
опять 25
oops i did it again (c)
Проверка
До рэ ми фа сль ля си до
Цитата:
До рэ ми фа сль ля си до
sfd
qwerty
просто тестик
фигня
:eye:
:fie:
:roof:
another test
Добавлено
one more
Добавлено
one more
Цитата:
Добавлено
one more
еуыенаываываываы
Test
Цитата:
Test
gvfdg
unix mozilla test
#moderation mode чу! я слышу пушек гром!
просто тест
а вот еще один тест
зелёный текст?
test
Ausw
?
?
ддд
ддд
mmm
ддд
mmm
vfgvfgv
Добавлено
dcdfcdf
Добавлено
dcdfcdf
DoktorZ
http://www.ttdown.com/SoftDown.asp?ID=10073
http://ftp.ttdown.com:1234/S/Y/SysTrayX%20v3.51%20Retail.rar
http://www.0daycn.net/0daycn.asp?id=vNNGwswvvdHHoGOoNscOGYH&key=smdown
http://www.0daycn.net/0daycn.asp?id=vNNGwswvvdHHoGOoNscOGYH&key=scdown
http://www.0daycn.net/0daycn.asp?id=vNNGwswvvdHHoGOoNscOGYH&key=jtdown
http://www.0daycn.net/0daycn.asp?id=vNNGwswvvdHHoGOoNscOGYH&key=ltdown
http://scdown.0daycn.net:196/ssgsx351-2003-5-22.rar
http://ltdown.0daycn.net:81/ssgsx351-2003-5-22.rar
http://jtdown.0daycn.net:1998/ssgsx351-2003-5-22.rar
http://scdown.fixdown.net:196/down/keydown2003/ssgsx351-2003-5-22.rar
http://ltdown.fixdown.net:81/keydown2003/ssgsx351-2003-5-22.rar
http://scdown.0daycn.net:152/ssgsx351-2003-5-22.rar
http://ltdown.0daycn.net:89/ssgsx351-2003-5-22.rar
http://jtdown.0daycn.net:1998/ssgsx351-2003-5-22.rar
http://scdown.fixdown.net:152/down/keydown2003/ssgsx351-2003-5-22.rar
http://ltdown.fixdown.net:89/keydown2003/ssgsx351-2003-5-22.rar
http://lt.fixdown.com/fixdown/download1.asp?id=vNNGwswvvdHHoGOoNvcGvsf&soft=scdown
http://lt.fixdown.com/fixdown/download1.asp?id=vNNGwswvvdHHoGOoNvcGvsf&soft=ltdown
http://lt.fixdown.com/fixdown/download1.asp?id=vNNGwswvvdHHoGOoNvcGvsf&soft=smdown
http://ftp.ttdown.com:1234/S/Y/SysTrayX%20v3.51%20Retail.rar
http://www.0daycn.net/0daycn.asp?id=vNNGwswvvdHHoGOoNscOGYH&key=smdown
http://www.0daycn.net/0daycn.asp?id=vNNGwswvvdHHoGOoNscOGYH&key=scdown
http://www.0daycn.net/0daycn.asp?id=vNNGwswvvdHHoGOoNscOGYH&key=jtdown
http://www.0daycn.net/0daycn.asp?id=vNNGwswvvdHHoGOoNscOGYH&key=ltdown
http://scdown.0daycn.net:196/ssgsx351-2003-5-22.rar
http://ltdown.0daycn.net:81/ssgsx351-2003-5-22.rar
http://jtdown.0daycn.net:1998/ssgsx351-2003-5-22.rar
http://scdown.fixdown.net:196/down/keydown2003/ssgsx351-2003-5-22.rar
http://ltdown.fixdown.net:81/keydown2003/ssgsx351-2003-5-22.rar
http://scdown.0daycn.net:152/ssgsx351-2003-5-22.rar
http://ltdown.0daycn.net:89/ssgsx351-2003-5-22.rar
http://jtdown.0daycn.net:1998/ssgsx351-2003-5-22.rar
http://scdown.fixdown.net:152/down/keydown2003/ssgsx351-2003-5-22.rar
http://ltdown.fixdown.net:89/keydown2003/ssgsx351-2003-5-22.rar
http://lt.fixdown.com/fixdown/download1.asp?id=vNNGwswvvdHHoGOoNvcGvsf&soft=scdown
http://lt.fixdown.com/fixdown/download1.asp?id=vNNGwswvvdHHoGOoNvcGvsf&soft=ltdown
http://lt.fixdown.com/fixdown/download1.asp?id=vNNGwswvvdHHoGOoNvcGvsf&soft=smdown
b]Неформальное введение в объектно-ориентированное программирование на платформе .NET Framework[/b]
Продолжение. Начало в КГ №№ 13, 14, 16 .
Прежде чем мы начнем создавать базовые классы “сущностей”, задействованных в нашем алгоритме, нам предварительно необходимо разобраться с тем, какие возможности для этого нам предоставляет язык C#. Поэтому задвиньте пока на дальнюю полку мой пример с варкой кофе. В ближайшие несколько статей мы к нему не вернемся. Вместо этого мы с вами совершим небольшую экскурсию, осмотрев с высоты птичьего полета реализацию объектно-ориентированной парадигмы в языке C#. Пример же с варкой кофе нам снова понадобится по окончании этой обзорной экскурсии. К этому моменту мы с вами сможем, уже во всеоружии, решить поставленные его алгоритмом задачи.
Важное примечание! Прежде чем вы приступите к набивке текстов примеров из этой или последующих моих статей, учтите, что язык C# является регистрозависимым. Console.WriteLine и coNsoLe.wRiteLIne для него — совершенно разные команды. Набирая текст примеров, всегда обращайте внимание на правильность регистра в названиях классов и методов.
Рассказывая вам о классовой модели C#, я предполагаю, что вы уже знакомы с базовыми операторами C-образных языков. Если это не так, поищите где-нибудь книжку по этой теме. Если я сейчас начну вам подробно рассказывать о том, как работают операторы for(;;;){} или if(){}, я никогда не доберусь до конца этого цикла статей. В C# эти операторы описываются и функционируют точно так же, как и в других распространенных языках, за некоторыми исключениями и дополнениями.
Изменения в языке
Операторы цикла for, while и foreach
Операторы цикла for и while унаследованы от C-подобных языков без каких-либо заметных изменений. Вы можете использовать все те “выкрутасы”, к которым привыкли и в C, и в C++. Из нововведений появился новый оператор foreach(X in Y), пришедший в язык из Visual Basic. Он предназначен для перебора всех объектов в какой-либо коллекции (списке). Что такое “коллекция”, я пока не смогу вам объяснить, ведь мы с вами еще даже не изучили, что такое класс. Пока я вам лишь замечу, что коллекция — это набор из некоторого количества объектов одного или разных типов, и foreach перебирает их все по одному. Одним из примеров такого набора является обычный массив.
Оператор выбора if
В реализации if появилось одно весьма существенное нововведение. Код вида int x=0; if(x){}else{} больше не работает и приводит к ошибке времени компиляции. Для того чтобы все заработало, необходимо писать так: int x=0; if(x!=0){}else{}. Говоря другими словами, 0 теперь совсем не равняется false, а неравенство выражения нулю совсем не означает true. Компилятор отслеживает эту ошибку в тексте ваших программ и сразу на нее ругается.
Оператор выбора switch
Логика работы оператора switch также подверглась модификации. В С# вам не удатся провалиться сквозь метки выбора в операторе switch{case:;}. Вполне приемлемый для C++ код:
int a =3;
switch (a){
case 1:
x=true;
case 2:
y=false;
break;
}
вызовет в C# ошибку, так как каждый case должен заканчиваться своим оператором break. Исключение сделано лишь для секций case, не имеющих тела. То есть код:
int a =3;
switch (a){
case 1:
case 2:
y=false;
break;
}
вполне допустим.
На самом деле C# по сравнению с C++ имеет еще довольно много нюансов. Мы с ними познакомимся по мере рассмотрения примеров в этом цикле статей.
Типы данных
Теперь давайте поговорим о типах данных. В номере 12 (25 марта 2003 г.) нашей газеты уже публиковалась статья, озаглавленная “Linux и C#. Типы данных”. Первоначально я хотел сослаться на нее, затрагивая эту тему. Но, внимательно изучив статью и ничего не поняв из прочитанного там, я решил своими словами изложить ту информацию, которую пытался донести до читателя ее автор.
Говоря о типах данных в C#, следует сразу учесть тот нюанс, что язык поддерживает параллельно два разных набора типов данных. Во-первых, это набор типов данных самой среды Net Framework, а во-вторых — набор синонимов этих типов, записанных в нотации, привычной программистам на C или С++.
Потребовалось это, по всей видимости, вот зачем. Как я и писал в первой статье цикла, Net Framework — это единая среда выполнения для большого количества языков программирования. На данный момент под нее написано уже с добрый десяток компиляторов разных языков. Все они используют типы данных, естественные для программистов на этом конкретном языке. Во время компиляции программы эти нативные для конкретного языка типы данных приводятся к типам Net Framework. Получается, что и овцы целы, и волки сыты. Программистам не нужно изучать новые типы данных, а среда Net Framework замечательно работает со всеми языками одновременно, не заморачиваясь поддержкой всевозможных языковых фенечек на манер типа данных Real, принятого в Pascal, или его аналога Real16, пришедшего ему на смену в Delphi.
Язык С# позволяет работать как с естественными для C++-программиста типами данных, так и напрямую с типами, объявленными в Net Framework. Вы наверняка спросите меня, а какой из двух наборов типов данных лучше использовать в ваших программах? Да какой хотите! Я сам использую обе разновидности вперемешку, тяготея при этом к использованию типов Net Framework. Мне так проще переключаться в коде между VB.Net и С#. Нативные типы данных у этих двух языков разные, а типы Net Framework присутствуют в обоих языках.
Ниже я приведу вам небольшую табличку типов данных C# c указанием соответствующего им типа данных Net Framework.
Тип С# Тип Net Framework Назначение
Byte System.Byte 8-битное значения без знака
short System.Int16 16-битное значение со знаком
int System.Int32 32-битное значение со знаком
long System.Int64 64-битное значение со знаком
char System.Char Один 16-битный символ Unicode
float System.Single 32-битное значение с плавающей запятой
double System.Double 64-битное значение с плавающей запятой
bool System.Boolean Значение True или False (истина или ложь)
decimal System.Decimal 128-битное число с плавающей точкой
string System.String Cтрока Unicode символов
object System.Object Базовый тип для любых типов
Примечание: На самом деле в этой таблице я упустил еще несколько типов данных. Сделал я это намеренно. Дело в том, что эти типы данных применимы лишь к программам, написанным на C#. Их следует по возможности избегать, так как они делают невозможным использование вашего кода программистами, скажем, на VB.Net. Мне не хотелось бы приучать вас в своих статьях к неправильному стилю программирования. Если вы захотите с ними разобраться, то самостоятельно найдите дополнительную литературу. А это моя статья: о чем хочу — о том и рассказываю. Замечу лишь, что к таким “неправильным” типам относятся sbyte, ushort, uint, ulong. То есть “знаковые” варианты типов данных без знака и “беззнаковые” аналоги типов данных со знаком. Особого смысла в их использовании я не вижу.
Вернемся к моей таблице. Если вы уже знакомы с каким-либо языком программирования, то понимание назначения перечисленных в ней типов данных не должно вызвать у вас каких-либо трудностей. Отдельного пояснения требуют, пожалуй, только последние три типа данных — decimal, string и object.
decimal — это дробное число. Его следует использовать в тех случаях, когда для вас критична возможная потеря точности за счет ошибок округления. В Delphi имеется такой тип данных, как Currency. decimal — это еще более “точное” его подобие.
string — это привычная всем программистам строка, обладающая, однако, одним неочевидным свойством. Дело в том, что переменную типа string невозможно изменить! Например, вот совершенно банальный пример кода:
string s =”” ;// объявляем пустую строку
s=”One” ;// присваиваем ей значение “One”
s+=” and Two”;// добавляем в хвост строке “ and Two”
Так вот, этот код сначала создает строку s c пустым значением, затем уничтожает ее и на ее месте создает строку c содержимым “One”. Затем снова ее уничтожает и на ее месте создает строку с содержимым “One and Two”! Почему так сделано, можно гадать очень долго, а вот незнание этого нюанса приводит к тому, что ваши программы по обработке строк очень долго выполняются и поедают много памяти.
Поэтому, если в вашей программе используется строка, которая очень часто модифицируется, задействуйте для ее обработки объект System.Text.StringBuilder. Он специально предназначен для операций с часто модифицирующейся строкой. Описание методов объекта System.Text.StringBuilder выходит за рамки этой статьи (их довольно много). Посмотрите самостоятельно их описание в MSDN или прилагаемой к Net Framework документации.
У нас остался, пожалуй, самый интересный тип данных — object. В таблице я написал, что этот тип данных является базовым для всех других типов данных. На самом деле так оно и есть. Все встроенные типы данных в C# на самом деле являются объектами. Даже когда вы используете константу в своем коде, она также будет являться объектом, производным от System.Object. Попробуйте из любопытства откомпилировать такой код:
using System;
class App{
static void Main(){
Console.WriteLine(2.ToString());
}
}
Эта программа благополучно откомпилируется и выполнится, несмотря на довольно странно выглядящий вызов функции 2.ToString(). Дело в том, что константа 2 в моем примере — это полноценный объект, обладающий набором методов. Один из них — Object.ToString() — мы с вами и вызвали. И тип данных int, и тип данных string, и все остальные встроенные типы данных восходят в конце концов к типу object. Более того: даже когда вы создаете свой собственный тип данных (класс), он все равно будет иметь в предках object, хотите вы этого или нет. object — это основа для любого типа данных, созданного в среде Net Framework. Каким образом происходит это наследование, вы поймете, когда мы с вами разберемся с тем, как создаются и наследуются классы в C#. Вот, блин, извечная проблема “Курицы и яйца”! Все зависит от всего, и очень трудно подступиться к описанию языка “с самого начала”. Все связано со всем, и неизвестно, с какой точки начать повествование, чтобы постоянно не забегать вперед.
Ну ладно, мы отвлеклись. Итак, класс в C# описывается с помощью следующей лексической конструкции:
class имя_класса
{
}
Продолжение. Начало в КГ №№ 13, 14, 16 .
Прежде чем мы начнем создавать базовые классы “сущностей”, задействованных в нашем алгоритме, нам предварительно необходимо разобраться с тем, какие возможности для этого нам предоставляет язык C#. Поэтому задвиньте пока на дальнюю полку мой пример с варкой кофе. В ближайшие несколько статей мы к нему не вернемся. Вместо этого мы с вами совершим небольшую экскурсию, осмотрев с высоты птичьего полета реализацию объектно-ориентированной парадигмы в языке C#. Пример же с варкой кофе нам снова понадобится по окончании этой обзорной экскурсии. К этому моменту мы с вами сможем, уже во всеоружии, решить поставленные его алгоритмом задачи.
Важное примечание! Прежде чем вы приступите к набивке текстов примеров из этой или последующих моих статей, учтите, что язык C# является регистрозависимым. Console.WriteLine и coNsoLe.wRiteLIne для него — совершенно разные команды. Набирая текст примеров, всегда обращайте внимание на правильность регистра в названиях классов и методов.
Рассказывая вам о классовой модели C#, я предполагаю, что вы уже знакомы с базовыми операторами C-образных языков. Если это не так, поищите где-нибудь книжку по этой теме. Если я сейчас начну вам подробно рассказывать о том, как работают операторы for(;;;){} или if(){}, я никогда не доберусь до конца этого цикла статей. В C# эти операторы описываются и функционируют точно так же, как и в других распространенных языках, за некоторыми исключениями и дополнениями.
Изменения в языке
Операторы цикла for, while и foreach
Операторы цикла for и while унаследованы от C-подобных языков без каких-либо заметных изменений. Вы можете использовать все те “выкрутасы”, к которым привыкли и в C, и в C++. Из нововведений появился новый оператор foreach(X in Y), пришедший в язык из Visual Basic. Он предназначен для перебора всех объектов в какой-либо коллекции (списке). Что такое “коллекция”, я пока не смогу вам объяснить, ведь мы с вами еще даже не изучили, что такое класс. Пока я вам лишь замечу, что коллекция — это набор из некоторого количества объектов одного или разных типов, и foreach перебирает их все по одному. Одним из примеров такого набора является обычный массив.
Оператор выбора if
В реализации if появилось одно весьма существенное нововведение. Код вида int x=0; if(x){}else{} больше не работает и приводит к ошибке времени компиляции. Для того чтобы все заработало, необходимо писать так: int x=0; if(x!=0){}else{}. Говоря другими словами, 0 теперь совсем не равняется false, а неравенство выражения нулю совсем не означает true. Компилятор отслеживает эту ошибку в тексте ваших программ и сразу на нее ругается.
Оператор выбора switch
Логика работы оператора switch также подверглась модификации. В С# вам не удатся провалиться сквозь метки выбора в операторе switch{case:;}. Вполне приемлемый для C++ код:
int a =3;
switch (a){
case 1:
x=true;
case 2:
y=false;
break;
}
вызовет в C# ошибку, так как каждый case должен заканчиваться своим оператором break. Исключение сделано лишь для секций case, не имеющих тела. То есть код:
int a =3;
switch (a){
case 1:
case 2:
y=false;
break;
}
вполне допустим.
На самом деле C# по сравнению с C++ имеет еще довольно много нюансов. Мы с ними познакомимся по мере рассмотрения примеров в этом цикле статей.
Типы данных
Теперь давайте поговорим о типах данных. В номере 12 (25 марта 2003 г.) нашей газеты уже публиковалась статья, озаглавленная “Linux и C#. Типы данных”. Первоначально я хотел сослаться на нее, затрагивая эту тему. Но, внимательно изучив статью и ничего не поняв из прочитанного там, я решил своими словами изложить ту информацию, которую пытался донести до читателя ее автор.
Говоря о типах данных в C#, следует сразу учесть тот нюанс, что язык поддерживает параллельно два разных набора типов данных. Во-первых, это набор типов данных самой среды Net Framework, а во-вторых — набор синонимов этих типов, записанных в нотации, привычной программистам на C или С++.
Потребовалось это, по всей видимости, вот зачем. Как я и писал в первой статье цикла, Net Framework — это единая среда выполнения для большого количества языков программирования. На данный момент под нее написано уже с добрый десяток компиляторов разных языков. Все они используют типы данных, естественные для программистов на этом конкретном языке. Во время компиляции программы эти нативные для конкретного языка типы данных приводятся к типам Net Framework. Получается, что и овцы целы, и волки сыты. Программистам не нужно изучать новые типы данных, а среда Net Framework замечательно работает со всеми языками одновременно, не заморачиваясь поддержкой всевозможных языковых фенечек на манер типа данных Real, принятого в Pascal, или его аналога Real16, пришедшего ему на смену в Delphi.
Язык С# позволяет работать как с естественными для C++-программиста типами данных, так и напрямую с типами, объявленными в Net Framework. Вы наверняка спросите меня, а какой из двух наборов типов данных лучше использовать в ваших программах? Да какой хотите! Я сам использую обе разновидности вперемешку, тяготея при этом к использованию типов Net Framework. Мне так проще переключаться в коде между VB.Net и С#. Нативные типы данных у этих двух языков разные, а типы Net Framework присутствуют в обоих языках.
Ниже я приведу вам небольшую табличку типов данных C# c указанием соответствующего им типа данных Net Framework.
Тип С# Тип Net Framework Назначение
Byte System.Byte 8-битное значения без знака
short System.Int16 16-битное значение со знаком
int System.Int32 32-битное значение со знаком
long System.Int64 64-битное значение со знаком
char System.Char Один 16-битный символ Unicode
float System.Single 32-битное значение с плавающей запятой
double System.Double 64-битное значение с плавающей запятой
bool System.Boolean Значение True или False (истина или ложь)
decimal System.Decimal 128-битное число с плавающей точкой
string System.String Cтрока Unicode символов
object System.Object Базовый тип для любых типов
Примечание: На самом деле в этой таблице я упустил еще несколько типов данных. Сделал я это намеренно. Дело в том, что эти типы данных применимы лишь к программам, написанным на C#. Их следует по возможности избегать, так как они делают невозможным использование вашего кода программистами, скажем, на VB.Net. Мне не хотелось бы приучать вас в своих статьях к неправильному стилю программирования. Если вы захотите с ними разобраться, то самостоятельно найдите дополнительную литературу. А это моя статья: о чем хочу — о том и рассказываю. Замечу лишь, что к таким “неправильным” типам относятся sbyte, ushort, uint, ulong. То есть “знаковые” варианты типов данных без знака и “беззнаковые” аналоги типов данных со знаком. Особого смысла в их использовании я не вижу.
Вернемся к моей таблице. Если вы уже знакомы с каким-либо языком программирования, то понимание назначения перечисленных в ней типов данных не должно вызвать у вас каких-либо трудностей. Отдельного пояснения требуют, пожалуй, только последние три типа данных — decimal, string и object.
decimal — это дробное число. Его следует использовать в тех случаях, когда для вас критична возможная потеря точности за счет ошибок округления. В Delphi имеется такой тип данных, как Currency. decimal — это еще более “точное” его подобие.
string — это привычная всем программистам строка, обладающая, однако, одним неочевидным свойством. Дело в том, что переменную типа string невозможно изменить! Например, вот совершенно банальный пример кода:
string s =”” ;// объявляем пустую строку
s=”One” ;// присваиваем ей значение “One”
s+=” and Two”;// добавляем в хвост строке “ and Two”
Так вот, этот код сначала создает строку s c пустым значением, затем уничтожает ее и на ее месте создает строку c содержимым “One”. Затем снова ее уничтожает и на ее месте создает строку с содержимым “One and Two”! Почему так сделано, можно гадать очень долго, а вот незнание этого нюанса приводит к тому, что ваши программы по обработке строк очень долго выполняются и поедают много памяти.
Поэтому, если в вашей программе используется строка, которая очень часто модифицируется, задействуйте для ее обработки объект System.Text.StringBuilder. Он специально предназначен для операций с часто модифицирующейся строкой. Описание методов объекта System.Text.StringBuilder выходит за рамки этой статьи (их довольно много). Посмотрите самостоятельно их описание в MSDN или прилагаемой к Net Framework документации.
У нас остался, пожалуй, самый интересный тип данных — object. В таблице я написал, что этот тип данных является базовым для всех других типов данных. На самом деле так оно и есть. Все встроенные типы данных в C# на самом деле являются объектами. Даже когда вы используете константу в своем коде, она также будет являться объектом, производным от System.Object. Попробуйте из любопытства откомпилировать такой код:
using System;
class App{
static void Main(){
Console.WriteLine(2.ToString());
}
}
Эта программа благополучно откомпилируется и выполнится, несмотря на довольно странно выглядящий вызов функции 2.ToString(). Дело в том, что константа 2 в моем примере — это полноценный объект, обладающий набором методов. Один из них — Object.ToString() — мы с вами и вызвали. И тип данных int, и тип данных string, и все остальные встроенные типы данных восходят в конце концов к типу object. Более того: даже когда вы создаете свой собственный тип данных (класс), он все равно будет иметь в предках object, хотите вы этого или нет. object — это основа для любого типа данных, созданного в среде Net Framework. Каким образом происходит это наследование, вы поймете, когда мы с вами разберемся с тем, как создаются и наследуются классы в C#. Вот, блин, извечная проблема “Курицы и яйца”! Все зависит от всего, и очень трудно подступиться к описанию языка “с самого начала”. Все связано со всем, и неизвестно, с какой точки начать повествование, чтобы постоянно не забегать вперед.
Ну ладно, мы отвлеклись. Итак, класс в C# описывается с помощью следующей лексической конструкции:
class имя_класса
{
}
Предыдущая тема: Проверка кода вставки урла
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.