<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Рынок аккаунтов, продажа аккаунтов Samp, Steam, cleo</title>
		<link>https://black-market.do.am/</link>
		<description>Форум</description>
		<lastBuildDate>Sun, 17 Mar 2013 08:43:57 GMT</lastBuildDate>
		<generator>uCoz Web-Service</generator>
		<atom:link href="https://black-market.do.am/forum/rss" rel="self" type="application/rss+xml" />
		
		<item>
			<title>Учим C#: №10</title>
			<link>https://black-market.do.am/forum/81-672-1</link>
			<pubDate>Sun, 17 Mar 2013 08:43:57 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://black-market.do.am/forum/81&quot;&gt;C++/C/С# Программирование&lt;/a&gt;&lt;br /&gt;Автор темы: Twit&lt;br /&gt;Автор последнего сообщения: Twit&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>Атрибуты. Красивое слово, не так ли? Что такое атрибуты в C#? Они позволяют добавлять в код описательную информацию, которая может определять действия периода компиляции, периода выполнения, или даже ограничение/предоставление некоторых возможностей какого-либо члена в период выполнения. Атрибуты могут определять информацию, относящуюся к классу, структуре, методу и другим синтаксически-концептуальным элементам. Указываются перед элементом в квадратных скобках, вот таким образом:  &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;using System.Runtime.InteropServices; &lt;br /&gt; .............. &lt;br /&gt; .............. &lt;br /&gt; [DllImport(&quot;user32.dll&quot;)] &lt;br /&gt; static extern int MessageBoxA(int hWnd,string msg,string caption,int type);&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Так импортируются функции из динамических библиотек, хотя в некоторых книгах, это называется экспортированием. К чему бы это? Этот атрибут, по своей концепции, определяет действия периода выполнения. А сам он определен в пространстве имен System.Runtime.InteropServices.  &lt;br /&gt; Можно использовать встроенные атрибуты C#, можно создавать новые. Любой атрибут – это класс, наследованный от класса System.Attribute. Теперь давайте создадим реальный конкретный атрибут, который будет определять, например, адрес URL: &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;using System; &lt;br /&gt; using Sc=System.Console; &lt;br /&gt;&lt;br /&gt; public class URLAttribute:Attribute &lt;br /&gt; { &lt;br /&gt; public URLAttribute(string url) &lt;br /&gt; { &lt;br /&gt; this.URL=url; &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; protected string uRL; &lt;br /&gt;&lt;br /&gt; public string URL &lt;br /&gt; { &lt;br /&gt; get{return uRL;} &lt;br /&gt; set{uRL=value;} &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; [URLAttribute(&quot;www.xakep.ru&quot;)] &lt;br /&gt; class HackerLink &lt;br /&gt; { &lt;br /&gt;&lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; class Application &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; Type type=typeof(HackerLink); &lt;br /&gt; foreach(Attribute attr in type.GetCustomAttributes(false)) &lt;br /&gt; { &lt;br /&gt; URLAttribute urlAttr=attr as URLAttribute; &lt;br /&gt; if(null!=urlAttr) &lt;br /&gt; { &lt;br /&gt; Sc.WriteLine(&quot;Target Link Is &quot;+urlAttr.URL); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Из чего же состоит сам атрибут? &lt;br /&gt; 1) Защищенная строковая переменная URL, хранящая сам адрес; &lt;br /&gt; 2) Свойство URL, управляющее и контактирующее со строковой переменной; &lt;br /&gt; 3) Конструктор, устанавливающий адрес, заданный в аргументе. &lt;br /&gt;&lt;br /&gt; Далее мы прикрепили созданный атрибут к классу HackerLink, задали ссылку на наш любимый сайтец. Теперь давайте рассмотрим метод Main(). Здесь используется отражение (Reflection). Отражение позволяет динамически определять сведения и данные о типах в проге. В первой строке мы создаем объект типа Type, определяющий тип объекта, при этом используем оператор typeof, который в данном контексте присваивает переменной type значение HackerLink. После этого объект находится в нашем распоряжении. Далее просматриваем все атрибуты, и если какой-то из них удается привести к URLAttribute, то выводим на экран строку с линком. Че-то тут новенькое кажись... А! Оператор as... Так вот... &lt;br /&gt;&lt;br /&gt; Оператор as производит попытку приведения типов данных. Попытка может быть как успешной, так и безуспешной. В этой проге продемонстрирована работа с атрибутами класса. Существуют и другие разновидности атрибутов. Рассмотрим основные встроенные атрибуты C#.  Атрибут Obsolete служит для того, чтобы отметить фрагмент кода, например метод, как устаревший. Имеет один параметр – строка сообщения, которое выведется при компиляции. Атрибут Transactionable определяет способность метода участвовать в транзакциях. Атрибут Conditional служит для создания условных методов, т.е. методов которые выполняются только тогда, когда параметр атрибута является символьной константой, определенной директивой #define. Это довольно так и интересный атрибут, так что рассмотрим следующий листинг. &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;#define FINAL &lt;br /&gt;&lt;br /&gt; using Sc=System.Console; &lt;br /&gt;&lt;br /&gt; class Test &lt;br /&gt; { &lt;br /&gt; [Conditional (“TRIAL”)] &lt;br /&gt; public void Remind() &lt;br /&gt; { &lt;br /&gt; Sc.WriteLine(“Please don’t forget to register your version of ... ” ); &lt;br /&gt; Sc.ReadLine(); &lt;br /&gt; Sc.WriteLine(“Press Enter if u’re sure that u’ll not forget!!!”); &lt;br /&gt; Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; [Conditional (“FINAL”)]  &lt;br /&gt; public void Hello() &lt;br /&gt; { &lt;br /&gt; Sc.WriteLine(“Hi! Registered user!”); &lt;br /&gt; Sc.WriteLine(“Thank u very much for using this nice prog!”); &lt;br /&gt; Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Как все догадались, первый метод не будет работать, даже если к нему обратиться, а вот если обратится ко второму, то он даже нас поблагодарит еще. Этот прием вполне подходит для создания различия между шарой и зарегистрированной прогой, хотя само по себе это мало чем поможет.  &lt;br /&gt; В следующей статье будет рассмотрена обработка исключительных ситуаций, а потом уже будем автоматизировать IE, покрутим баннеры... Просто покажу, как это можно делать на С#.</content:encoded>
			<category>C++/C/С# Программирование</category>
			<dc:creator>Twit</dc:creator>
			<guid>https://black-market.do.am/forum/81-672-1</guid>
		</item>
		<item>
			<title>Учим C#: №9</title>
			<link>https://black-market.do.am/forum/81-671-1</link>
			<pubDate>Sun, 17 Mar 2013 08:43:37 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://black-market.do.am/forum/81&quot;&gt;C++/C/С# Программирование&lt;/a&gt;&lt;br /&gt;Автор темы: Twit&lt;br /&gt;Автор последнего сообщения: Twit&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>Каждый наш учебный листинг начинается с using, т.е. определения видимых пространств имен. Можем ли мы создавать свои пространства имен? Почему бы и нет? Давайте копнем, как этот механизм устроен... Для создания используется ключевое слово namespace. Внутри него могут содержаться классы, структуры и т.д. И все они будут видимы в своем пространстве имен. Чтобы не писать много раз название пространства имен, мы пользуемся директивой using. Как и весь C#, это предельно просто:) &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;namespace Units &lt;br /&gt; { &lt;br /&gt; class CPU &lt;br /&gt; { &lt;br /&gt; public char ID; &lt;br /&gt; public int freq; &lt;br /&gt; public int CACHE; &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; class Application &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; Units.CPU object1=new Units.CPU(); &lt;br /&gt; object1.ID=&apos;A&apos;; &lt;br /&gt; object1.freq=1700; &lt;br /&gt; object1.CACHE=256; &lt;br /&gt; System.Console.WriteLine(&quot;Made by &quot;+object1.ID); &lt;br /&gt; System.Console.WriteLine(&quot;Frequence is&quot;+object1.freq+&quot;Mhz&quot;); &lt;br /&gt; System.Console.WriteLine(&quot;CACHE has &quot;+object1.CACHE+&quot;Kb&quot;); &lt;br /&gt; System.Console.ReadLine(); &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Класс CPU виден в пространстве имен Units, и для создания объекта приходится набирать: &lt;br /&gt;&lt;br /&gt; Units.CPU object1=new Units.CPU(); &lt;br /&gt;&lt;br /&gt; От этого мы можем избавиться при помощи директивы using, в начале исходника пишем: &lt;br /&gt;&lt;br /&gt; using Units; &lt;br /&gt;&lt;br /&gt; и можем смело создавать объект так: &lt;br /&gt;&lt;br /&gt; CPU object1=new CPU(); &lt;br /&gt;&lt;br /&gt; Директиву using можно использовать и с другой целью – создание псевдоимен. Во многих листингах вы видели: &lt;br /&gt;&lt;br /&gt; using Sc=System.Console; &lt;br /&gt;&lt;br /&gt; Здесь Sc – псевдоимя, под которым видно пространство имен System.Console. В таком контексте справа от знака ‘=’ может быть пространство имен или класс. Все, typedef нам ни к чему. Хотя когда-нибудь, как-нибудь, где-нибудь да пригодится, забывать не стоит. &lt;br /&gt;&lt;br /&gt; Далее мы рассмотрим более специфичные элементы языка – делегаты и события. Делегатом в C# называется объект, содержащий ссылку на метод. Делегаты аналогичны указателям на функции в классических языках. На более низком уровне, делегат содержит адрес метода в памяти, этот адрес также называют точкой входа метода. Делегаты могут содержать ссылки на методы объектов или на статические методы класса. Статические методы могут быть вызваны, даже если не создан объект класса, для их объявления применяется ключевое слово static, следующее за модификатором доступа. Для объявления делегатов используется ключевое слово delegate. Делегат может содержать только ссылку на метод, возвращаемый тип и список аргументов которого совпадают с объявлением делегата. &lt;br /&gt;&lt;br /&gt; Вот общий формат объявления делегата: &lt;br /&gt;&lt;br /&gt; delegate тип имя(список_аргументов); &lt;br /&gt;&lt;br /&gt; Затем следует создать объект делегата, следующим образом: &lt;br /&gt;&lt;br /&gt; имяДелегата имяОбъекта = new имяДелегата (имяМетода); &lt;br /&gt;&lt;br /&gt; А вот теперь действительно интересное -&gt; делегат может содержать как одну, так и несколько ссылок на разные методы. И реализуется это очень просто – операторы ‘+=’ и ‘-=’. Их формат: &lt;br /&gt;&lt;br /&gt; имяОбъектаДелегата +=имяДобавочногоДелегата; &lt;br /&gt; имяОбъектаДелегата -=имяУдаляемогоДелегата; &lt;br /&gt;&lt;br /&gt; Так создаются многоадресные делегаты. Нужен ли пример? Ну давайте сварганим. &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;using Sc=System.Console; &lt;br /&gt;&lt;br /&gt; delegate void IO();//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;объявляем делегат&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;class Matrix//&lt;/span&gt; &lt;span style=&quot;color:#FF0000&quot;&gt;класс матрицы&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; private int[,] element=new int[4,4]; &lt;br /&gt;&lt;br /&gt; public int GetValue(int ii,int jj) &lt;br /&gt; {return element[ii,jj];}  &lt;br /&gt;&lt;br /&gt; public void Scan() &lt;br /&gt; { &lt;br /&gt; int i,j,ii; &lt;br /&gt; for(i=0;i&lt;4;i++) &lt;br /&gt; { &lt;br /&gt; string str1; &lt;br /&gt; ii=i+1; &lt;br /&gt; Sc.WriteLine(&quot;Enter string #&quot;+ii); &lt;br /&gt; for(j=0;j&lt;4;j++) &lt;br /&gt; { &lt;br /&gt; Sc.Write(&quot;Enter value for element[&quot;+i+&quot;,&quot;+j+&quot;](then press  &lt;br /&gt;&lt;br /&gt; Enter)=&gt;&quot;); &lt;br /&gt; str1=Sc.ReadLine(); &lt;br /&gt; element[i,j]=int.Parse(str1); &lt;br /&gt; } &lt;br /&gt; Sc.WriteLine(); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; public void Print()//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;вывод всей матрицы&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; int i,j;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;переменные для циклов&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;for(i=0;i&lt;4;i++) &lt;br /&gt; { &lt;br /&gt; for(j=0;j&lt;4;j++) &lt;br /&gt; { &lt;br /&gt; Sc.Write(&quot; &quot;+GetValue(i,j)); &lt;br /&gt; } &lt;br /&gt; Sc.WriteLine(); &lt;br /&gt; }Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; class Application &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;создаем объект класса&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;Matrix matrix1=new Matrix(); &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;создаем объекты делегатов&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;IO Io=new IO(matrix1.Scan); &lt;br /&gt; IO Out=new IO(matrix1.Print); &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;добавляем новый метод&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;к последовательности ссылок&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;Io+=Out; &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;вызываем делегат&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;Io(); &lt;br /&gt; }  &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Следует обратить внимание на то, что для добавления метода к исполняемой цепочке делегата необходимо создать новый делегат, содержащий ссылку на этот метод, а затем прибавить новый делегат к старому. Для удаления делегата из цепочки его надо просто вычесть. Просто, не так ли? Делегаты позволяют выбирать метод на этапе выполнения программы в зависимости от той или иной ситуации. На основе делегатов создаются события и устанавливаются обработчики событий. Что же такое событие? Его можно рассмотреть, как сигнал о каком-либо действии, изменении... Ну а эти события созданы для того чтобы их обрабатывать. Обработкой событий занимаются специальные методы – обработчики. Как было сказано ранее, делегаты могут быть многоадресными, а значит и одно событие может иметь несколько обработчиков. Но как же с ними работать? C# предусматривает ключевое слово event для определения событий. Обычно события определяются как открытые члены класса. Давайте разберемся, как использовать этот механизм на примере простенькой проги. Создадим класс Number, главным членом которого будет являться целочисленная переменная, которая не может быть равна нулю. И если пользователь вводит 0, то происходит событие ввода нуля, которое нам надо, типа, обработать. А обработаем мы его так – просто выведем сообщение об ошибке. Итак, вникнем в код... &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;using Sc=System.Console; &lt;br /&gt;&lt;br /&gt; delegate void Handle();//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;это делегат для нашего события&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;class Number &lt;br /&gt; { &lt;br /&gt; private int num; &lt;br /&gt;&lt;br /&gt; private bool Verify(int n)//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;проверка на 0&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; if(n!=0) return true; &lt;br /&gt; else return false; &lt;br /&gt; }  &lt;br /&gt;&lt;br /&gt; public Number(){num=1;} &lt;br /&gt;&lt;br /&gt; public Number(int n) &lt;br /&gt; {if(n!=0) num=n;} &lt;br /&gt;&lt;br /&gt; public event Handle isZero;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;а это и есть событие&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public void ZeroMsg()//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;сообщение 1&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{Sc.WriteLine(&quot;0 can&apos;t be a number!&quot;);} &lt;br /&gt;&lt;br /&gt; public void ErrorMsg()//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;сообщение 2&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; Sc.WriteLine(&quot;Critical Error!&quot;); &lt;br /&gt; Sc.WriteLine(&quot;The program will be shut down!&quot;); &lt;br /&gt; Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; public void Input()//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;ввод значения&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; string str; &lt;br /&gt; bool v; &lt;br /&gt; int n; &lt;br /&gt;&lt;br /&gt; Sc.Write(&quot;Enter number:&quot;); &lt;br /&gt; str=Sc.ReadLine(); &lt;br /&gt; n=int.Parse(str); &lt;br /&gt; v=Verify(n); &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;если 0, то “запускаем” событие&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;if(v==false) isZero(); &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;иначе все нормально&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;else  &lt;br /&gt; { &lt;br /&gt; num=n; &lt;br /&gt; Sc.WriteLine(&quot;This one is OK!&quot;); &lt;br /&gt; Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; class Application &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; Number ob=new Number(); &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;добавляем новые обработчики&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;ob.isZero+=new Handle(ob.ZeroMsg); &lt;br /&gt; ob.isZero+=new Handle(ob.ErrorMsg); &lt;br /&gt;&lt;br /&gt; ob.Input();  &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; В принципе, событие – это объект делегата. Физически этот объект делегата содержит ссылки на обработчики события. События, обрабатываемые более чем одним обработчиком, называются широковещательными. Для их поддержки рекомендуется определять делегат с пустым (void) типом возвращаемого значения. События и их обработка открывают новые горизонты во многих сферах ИТ, эти знания нам отлично помогут в написании “автоматизаторов” приложений.</content:encoded>
			<category>C++/C/С# Программирование</category>
			<dc:creator>Twit</dc:creator>
			<guid>https://black-market.do.am/forum/81-671-1</guid>
		</item>
		<item>
			<title>Учим C#: №8</title>
			<link>https://black-market.do.am/forum/81-670-1</link>
			<pubDate>Sun, 17 Mar 2013 08:43:00 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://black-market.do.am/forum/81&quot;&gt;C++/C/С# Программирование&lt;/a&gt;&lt;br /&gt;Автор темы: Twit&lt;br /&gt;Автор последнего сообщения: Twit&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>Классы в C# могут содержать и такие элементы, как свойства. Эти члены являются очень важными и довольно часто используются. По сути, свойства - это данные, отображающие какие-либо особенности, опции, а лучше их смысл понимать дословно. Если вы хотите стать программистом .Net, вы обязаны знать этот механизм и владеть им в совершенстве. Но и тут не надо иметь семи пядей во лбу, как всегда, все очень просто. Свойство - это динамическое поле, для которого определены методы доступа, обычно они объявляются с модификатором доступа public, т.е. открытыми, т.к. обычно свойства изменяются вне объекта. Свойства целесообразно использовать вместо обычных переменных там, где, в соответствии со значением переменной, должны изменять свое значение и другие члены класса. Т.е., благодаря свойствам, нам не придется переписывать код изменения заново, или, что еще хуже, повторно вызывать конструкторы. Внешне синтаксис свойств похож на синтаксис индексаторов. Используются методы доступа с такими же именами, точно так же без аргументов. Общий вид: &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public тип имя &lt;br /&gt; { &lt;br /&gt; get &lt;br /&gt; {возврат_значения;} &lt;br /&gt; set &lt;br /&gt; {проверка; &lt;br /&gt; установка_значения; &lt;br /&gt; обновление_других_членов; &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; И, наконец, маленький примерчик рационального использования свойств. Определим свойство IsBoxed логического типа для класса, описывающего проц. &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;using Sc=System.Console; &lt;br /&gt;&lt;br /&gt; class CPU &lt;br /&gt; { &lt;br /&gt; private string name; &lt;br /&gt; private int freq; &lt;br /&gt; private bool isboxed; &lt;br /&gt; private bool needcooler; &lt;br /&gt;&lt;br /&gt; public CPU(string n,int f) &lt;br /&gt; { &lt;br /&gt; name=n; &lt;br /&gt; freq=f; &lt;br /&gt; }  &lt;br /&gt;&lt;br /&gt; public bool IsBoxed &lt;br /&gt; { &lt;br /&gt; get{return isboxed;} &lt;br /&gt; set &lt;br /&gt; { &lt;br /&gt; isboxed=value; &lt;br /&gt; if(value==true) needcooler=false; &lt;br /&gt; else needcooler=true; &lt;br /&gt; } &lt;br /&gt; }  &lt;br /&gt;&lt;br /&gt; public void Print()  &lt;br /&gt; {  &lt;br /&gt; Sc.WriteLine(&quot;This is &quot;+name);  &lt;br /&gt; Sc.WriteLine(&quot;Frequency is &quot;+freq);  &lt;br /&gt; if(needcooler==true)  &lt;br /&gt; Sc.WriteLine(&quot;It needs a cooler!&quot;);  &lt;br /&gt; else Sc.WriteLine(&quot;It is boxed.&quot;);  &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; class Application &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; CPU Pentium=new CPU(&quot;Pentium&quot;,2000); &lt;br /&gt; CPU Athlon=new CPU(&quot;Athlon&quot;,2000); &lt;br /&gt; Pentium.IsBoxed=true; &lt;br /&gt; Athlon.IsBoxed=false; &lt;br /&gt; Sc.WriteLine(&quot;The first CPU:&quot;); &lt;br /&gt; Pentium.Print(); &lt;br /&gt; Sc.WriteLine(); &lt;br /&gt; Sc.WriteLine(&quot;The second CPU:&quot;); &lt;br /&gt; Athlon.Print(); &lt;br /&gt; Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Я хочу остановиться на следующем моменте -&gt; мы определили закрытый член-переменную isboxed и открытое свойство IsBoxed. Так вот, в isboxed хранится значение, определяющее тип упаковки проца, в то время, как свойство IsBoxed работает с этой переменной и с некоторыми другими по надобности. В этом примере мы определили конструктор с двумя параметрами, т.е. конструктор, устанавливающий значения двух перменных-членов, а остальные инициализируются при установке значения свойства. Такой прием носит название отложенной инициализации и имеет немалое значение в оптимизации.</content:encoded>
			<category>C++/C/С# Программирование</category>
			<dc:creator>Twit</dc:creator>
			<guid>https://black-market.do.am/forum/81-670-1</guid>
		</item>
		<item>
			<title>Учим C#: №7</title>
			<link>https://black-market.do.am/forum/81-669-1</link>
			<pubDate>Sun, 17 Mar 2013 08:42:31 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://black-market.do.am/forum/81&quot;&gt;C++/C/С# Программирование&lt;/a&gt;&lt;br /&gt;Автор темы: Twit&lt;br /&gt;Автор последнего сообщения: Twit&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>Сегодня я хотел бы рассказать о других, пропущенных членах классов, т.к. время уже пришло. В прошлой статье я говорил о перегрузке операторов. Существует специальный оператор, предназначенный для индексирования массива - []. И его нельзя перегрузить. Хотя нет, можно, но при выполнении следующего условия: перегружать его только для тех объектов, сущностью которых является массив каких-либо элементов. И адресовать этот индексатор будет не различные элементы массива объектов, а какой-либо массив, являющийся членом объекта. &lt;br /&gt; Далее приведен общий формат определения одномерного индексатора. &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public возвращаемый_тип this[int index] &lt;br /&gt; { &lt;br /&gt; get{тело_метода_чтения;} &lt;br /&gt; set{тел_ метода_установки;} &lt;br /&gt; }&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt; Чтоб было понятнее, определим индексатор для нашего класса Matrix... &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;using Sc=System.Console; &lt;br /&gt;&lt;br /&gt; class Matrix//&lt;/span&gt; &lt;span style=&quot;color:#FF0000&quot;&gt;класс матрицы&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; private int[,] element=new int[4,4]; &lt;br /&gt;&lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-------Ну-а-теперь-время-----&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-------определить-индексатор-&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public int this[int i,int j] &lt;br /&gt; { &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;Метод доступа для чтения&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;get &lt;br /&gt; { &lt;br /&gt; return element[i,j];  &lt;br /&gt; } &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;Метод доступа для установки&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;set &lt;br /&gt; { &lt;br /&gt; element[i,j]=value; &lt;br /&gt; } &lt;br /&gt; }  &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; class Application &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; Matrix matrix1=new Matrix(); &lt;br /&gt; int i,j;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;для цикла&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;Установим разные значения&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;элементов матрицы при помощи&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;определенного индексатора&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;for(i=0;i&lt;4;i++)  &lt;br /&gt; { &lt;br /&gt; for(j=0;j&lt;4;j++) &lt;br /&gt; {  &lt;br /&gt; matrix1[i,j]=i+j; &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;Теперь точно таким же способом&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;сделаем вывод на консоль&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;for(i=0;i&lt;4;i++) &lt;br /&gt; { &lt;br /&gt; for(j=0;j&lt;4;j++) Sc.Write(&quot; &quot;+matrix1[i,j]); &lt;br /&gt; Sc.WriteLine(); &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; Sc.Write(&quot;Нажмите ENTER для выхода.&quot;); &lt;br /&gt; Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Теперь немного слов. Здесь в теле метода set вы должны были обратить внимание, что переменная с именем value нигде не определена. В этом случае value является ключевым словом, указывающим неявно на значение выражения справа от оператора присваивания. get и set также являются ключевыми словами, они являются специальными методами. Если рассмотреть, например, такую строку: &lt;br /&gt;&lt;br /&gt; matrix1[i,j]=matrix2[j,i]; &lt;br /&gt;&lt;br /&gt; то вызывается метод get объекта matrix1 и метод set объекта, а value указывает на значение, возвращаемое методом чтения объекта слева. Вроде просто и красиво, а кое-где даже полезно.</content:encoded>
			<category>C++/C/С# Программирование</category>
			<dc:creator>Twit</dc:creator>
			<guid>https://black-market.do.am/forum/81-669-1</guid>
		</item>
		<item>
			<title>Учим C#: №6</title>
			<link>https://black-market.do.am/forum/81-668-1</link>
			<pubDate>Sun, 17 Mar 2013 08:41:51 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://black-market.do.am/forum/81&quot;&gt;C++/C/С# Программирование&lt;/a&gt;&lt;br /&gt;Автор темы: Twit&lt;br /&gt;Автор последнего сообщения: Twit&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>Перегрузка операторов позволяет определить воздействие операторов на объекты, т.е., благодаря перегрузке операторов, мы можем применять их к объектам. В принципе, перегрузка оператора осуществляется специальным методом. Метод перегруженного операторов должен объявляться как public static. Операторы бывают унарные и бинарные. Унарные операторы работают с одним операндом, а бинарные - с двумя. Для указания перегрузки операторов используется ключевое слово operator. В зависимости от количества операндов, различают две общие формы операторных методов. Вот и они: &lt;br /&gt;&lt;br /&gt; public static возвращаемый_тип operator #(тип_операнда операнд) &lt;br /&gt; { &lt;br /&gt; //тело метода унарного оператора &lt;br /&gt; } &lt;br /&gt; public static возвращаемый_тип operator #(тип_операнда1 операнд1, тип_операнда2 операнд2) &lt;br /&gt; { &lt;br /&gt; //тело метода бинарного оператора &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; Теперь некоторые ограничения на перегрузку операторов: &lt;br /&gt; - приоритет операторов не меняется (в C# приоритет операторов можно считать таким же, как и в C/C++); &lt;br /&gt; - нельзя менять определенное в языке для конкретного оператора количество операндов; &lt;br /&gt; - тело метода перегружаемого оператора должно определять действия оператора, по отношению к объекту/объектам текущего класса. &lt;br /&gt; - операторы сравнения (кроме равенства) надо определять по два, т.е., если есть &apos;&gt;&apos;, то должно быть и &apos;&lt;&apos;; &lt;br /&gt; - нельзя перегружать операторы сравнения &lt;br /&gt;&lt;br /&gt; И, наконец, перегрузим несколько операторов для нашего класса Matrix. В нем я буду использовать условный оператор if(выражение){блок1;}else{блок2;}. Для тех, кто с ним не знаком, объясняю... Если выражение в круглых скобках принимает значение истины, то выполняется блок1, иначе - блок2, следующий за else. Все просто! &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;Этуот пример можно было бы сделать красивее,&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;с динамическим распределением, но некоторым&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;это пока будет сложно&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;using Sc=System.Console; &lt;br /&gt;&lt;br /&gt; class Matrix//&lt;/span&gt; &lt;span style=&quot;color:#FF0000&quot;&gt;класс матрицы&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-Объявим-закрытый-член-класса----------&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-Массив-10x10-целочисленных-переменных-&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-Элементов-матрицы---------------------&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;int[,] element=new int[4,4]; &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;----Конструктор-по-умолчанию---------&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public Matrix() &lt;br /&gt; { &lt;br /&gt; int i,j; &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;цикл для прохода по строкам&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;for(i=0;i&lt;4;i++) &lt;br /&gt; { //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;цикл для прохода по элементам строки&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;for(j=0;j&lt;4;j++) &lt;br /&gt; { //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;установка в 0 каждого элемента&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;element[i,j]=0; &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-теперь-определим-методы-присваивания-и---&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-получения-значения-определенному-элементу-&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public void SetValue(int line,int row,int value) &lt;br /&gt; { &lt;br /&gt; element[line,row]=value; &lt;br /&gt; } &lt;br /&gt; public int GetValue(int line,int row) &lt;br /&gt; { &lt;br /&gt; return element[line,row]; &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-определим-перегруженный-метод-вывода-&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public void Print()//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;вывод всей матрицы&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; int i,j;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;переменные для циклов&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;for(i=0;i&lt;4;i++) &lt;br /&gt; { &lt;br /&gt; for(j=0;j&lt;4;j++) &lt;br /&gt; { &lt;br /&gt; Sc.Write(&quot; &quot;+GetValue(i,j)); &lt;br /&gt; } &lt;br /&gt; Sc.WriteLine(); &lt;br /&gt; }Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; public void Print(int line)//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;вывод строки&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; int j; &lt;br /&gt; for(j=0;j&lt;4;j++) &lt;br /&gt; { &lt;br /&gt; Sc.Write(&quot; &quot;+GetValue(line,j)); &lt;br /&gt; } &lt;br /&gt; Sc.WriteLine(); &lt;br /&gt; Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; public void Print(int line,int row)//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;вывод элемента&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; Sc.WriteLine(&quot;Element[&quot;+line+&quot;,&quot;+row+&quot;]=&quot;+GetValue(line,row)); &lt;br /&gt; } &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-и-наконец-метод-ввода-всех-элементов-&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public void Scan() &lt;br /&gt; { &lt;br /&gt; int i,j,ii; &lt;br /&gt; for(i=0;i&lt;4;i++) &lt;br /&gt; { &lt;br /&gt; string str1; &lt;br /&gt; ii=i+1; &lt;br /&gt; Sc.WriteLine(&quot;Enter string #&quot;+ii); &lt;br /&gt; for(j=0;j&lt;4;j++) &lt;br /&gt; { &lt;br /&gt; Sc.Write(&quot;Enter value for element[&quot;+i+&quot;,&quot;+j+&quot;](then press Enter)=&gt;&quot;); &lt;br /&gt; str1=Sc.ReadLine(); &lt;br /&gt; element[i,j]=int.Parse(str1); &lt;br /&gt; } &lt;br /&gt; Sc.WriteLine(); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; public int Sum()//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;счет суммы всех элементов&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; int sum=0; &lt;br /&gt; int i,j; &lt;br /&gt; for(i=0;i&lt;4;i++) &lt;br /&gt; { &lt;br /&gt; for(j=0;j&lt;4;j++) sum=sum+element[i,j]; &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;или sum+=element[i,j];&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;} &lt;br /&gt; return sum; &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;А вот и они - операторы&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public static Matrix operator ++(Matrix m) &lt;br /&gt; {//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;унарный оператор инкремента&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;int i,j; &lt;br /&gt; for(i=0;i&lt;4;i++) &lt;br /&gt; { &lt;br /&gt; for(j=0;j&lt;4;j++) m.element[i,j]++; &lt;br /&gt; } &lt;br /&gt; return m; &lt;br /&gt; } &lt;br /&gt; public static Matrix operator +(Matrix m1,Matrix m2) &lt;br /&gt; {//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;бинарный оператор сложения&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;Matrix mresult=new Matrix(); &lt;br /&gt; int i,j; &lt;br /&gt; for(i=0;i&lt;4;i++) &lt;br /&gt; { &lt;br /&gt; for(j=0;j&lt;4;j++) mresult.element[i,j]=m1.element[i,j]+m2.element[i,j]; &lt;br /&gt; } &lt;br /&gt; return mresult;  &lt;br /&gt; } &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;операторы сравнения возвращают значения&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;типа bool (1 или 0)&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;часто используются в выражениях&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;условных операторов&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public static bool operator &gt;(Matrix m1,Matrix m2) &lt;br /&gt; {  &lt;br /&gt; if(m1.Sum()&gt;m2.Sum()) return true; &lt;br /&gt; else return false; &lt;br /&gt; } &lt;br /&gt; public static bool operator &lt;(Matrix m1,Matrix m2) &lt;br /&gt; {  &lt;br /&gt; if(m1.Sum()&lt;m2.Sum()) return true; &lt;br /&gt; else return false; &lt;br /&gt; }  &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; class Application &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; Matrix matrix1=new Matrix(); &lt;br /&gt; Matrix matrix2=new Matrix(); &lt;br /&gt; Matrix matrix3=new Matrix(); &lt;br /&gt; Sc.WriteLine(&quot;Input 1st matrix:&quot;); &lt;br /&gt; matrix1.Scan();matrix1++; &lt;br /&gt; Sc.WriteLine(&quot;1st matrix incremented:&quot;); &lt;br /&gt; matrix1.Print(); &lt;br /&gt; Sc.WriteLine(&quot;input 2nd matrix:&quot;); &lt;br /&gt; matrix2.Scan(); &lt;br /&gt; matrix3=matrix1+matrix2; &lt;br /&gt; Sc.WriteLine(&quot;matrix1 + matrix2 is&quot;); &lt;br /&gt; matrix3.Print(); &lt;br /&gt; if(matrix3&gt;matrix2) Sc.WriteLine(&quot;matrix3 is bigger&quot;); &lt;br /&gt; else Sc.WriteLine(&quot;matrix3 is not bigger&quot;); &lt;br /&gt; Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt; Чтобы перегрузить операторы &apos;==&apos; и &apos;!=&apos; необходимо переопределить методы Equals() и GetHashCode() базового класса Object (или типа object). Для полного счастья, сделаем уже и это. Но, для начала, я расскажу немного о упаковке/распаковке. Все классы автоматически наследуют фундаментальный класс Object. Следовательно, любой тип или класс можно привести к типу object. Возможна и обратная процедура. Приведение объекта к объекту базового типа object и называется упаковкой. Распаковка - это обратная процедура. В следующем примере мы воспользуемся распаковкой в переопределении метода Equals(object o). Критерий равенства матриц - равенство сумм всех элементов обеих матриц. Просто добавляем следующие методы в наш класс Matrix... &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public override int GetHashCode() &lt;br /&gt; { &lt;br /&gt; return 100; &lt;br /&gt; } &lt;br /&gt; public override bool Equals(object o) &lt;br /&gt; { &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;unpack it now&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;Matrix matr=(Matrix)o; &lt;br /&gt; if(Sum()==matr.Sum()) return true; &lt;br /&gt; else return false; &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; public static bool operator ==(Matrix m1,Matrix m2) &lt;br /&gt; {  &lt;br /&gt; if(m1.Sum()==m2.Sum()) return true; &lt;br /&gt; else return false; &lt;br /&gt; }  &lt;br /&gt; public static bool operator !=(Matrix m1,Matrix m2) &lt;br /&gt; {  &lt;br /&gt; if(m1.Sum()!=m2.Sum()) return true; &lt;br /&gt; else return false; &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt; И следующие строки в конец метода Main()... &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;if(matrix1==matrix2) Sc.WriteLine(&quot;matrix1=matrix2&quot;); &lt;br /&gt; else Sc.WriteLine(&quot;matrix1!=matrix2&quot;); &lt;br /&gt; Sc.ReadLine();&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Далее комментировать эту прогу я не вижу смысла. Командная строка, csc имя_файла &amp; GO! Ну, создавать классы умеем, интерфейсы - умеем, умеем наследовать, умеем перегружать операторы и методы, умеем пользоваться объектами, создавать новые типы данных, если вы, конечно, прочитали все мои статьи. Можно, сказать, что теперь и ты знаешь основы объектно-ориентированного программирования, Нео!</content:encoded>
			<category>C++/C/С# Программирование</category>
			<dc:creator>Twit</dc:creator>
			<guid>https://black-market.do.am/forum/81-668-1</guid>
		</item>
		<item>
			<title>Учим C#: №5</title>
			<link>https://black-market.do.am/forum/81-667-1</link>
			<pubDate>Sun, 17 Mar 2013 08:40:54 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://black-market.do.am/forum/81&quot;&gt;C++/C/С# Программирование&lt;/a&gt;&lt;br /&gt;Автор темы: Twit&lt;br /&gt;Автор последнего сообщения: Twit&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>Перегрузка. &lt;br /&gt;&lt;br /&gt; Методы &lt;br /&gt;&lt;br /&gt; Некоторые более опытные ребята уже усекли перегрузку методов в листингах предыдущих статей. Какие же методы мы перегружали? Мы уже перегружали конструкторы. И перегружали мы их по количеству параметров. В большинстве примеров присутствуют конструктор по умолчанию, т.е. без параметров, и конструктор с параметрами. Методы можно перегрузить по количеству параметров, а также по типам аргументов. Благодаря перегрузке методов, объект может вести себя по-разному, в зависимости от способа вызова метода. Приведем пример класса с перегруженными методами. Количество форм метода условимся называть его степенью перегрузки. Приведем пример класса с перегруженными методами (кто не знаком с массивами, сейчас будем знакомить, массив - это набор элементов одного типа). &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;Этуот пример можно было бы сделать красивее,&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;с динамическим распределением, но некоторым&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;это пока будет сложно&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;using Sc=System.Console; &lt;br /&gt;&lt;br /&gt; class Matrix//&lt;/span&gt; &lt;span style=&quot;color:#FF0000&quot;&gt;класс матрицы&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-Объявим-закрытый-член-класса----------&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-Массив-10x10-целочисленных-переменных-&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-Элементов-матрицы---------------------&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;private int[,] element=new int[4,4]; &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;----Конструктор-по-умолчанию---------&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public Matrix() &lt;br /&gt; { &lt;br /&gt; int i,j; &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;цикл для прохода по строкам&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;for(i=0;i&lt;4;i++) &lt;br /&gt; { //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;цикл для прохода по элементам строки&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;for(j=0;j&lt;4;j++) &lt;br /&gt; { //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;установка в 0 каждого элемента&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;element[i,j]=0; &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;----Конструктор-с-3мя-параметрами------&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-строка-столбец-и-значение-------------&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-устанавливает-в-определенное-значение-&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-определенный-элемент-а-остальные-в-0--&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public Matrix(int line,int row,int value):this() &lt;br /&gt; { &lt;br /&gt; element[line,row]=value; &lt;br /&gt; } &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;----Конструктор-копирования-------&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-создает-объект-на-основе-объекта-&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public Matrix(Matrix ob1) &lt;br /&gt; { &lt;br /&gt; int i,j; &lt;br /&gt; for(i=0;i&lt;4;i++) &lt;br /&gt; { &lt;br /&gt; for(j=0;j&lt;4;j++) &lt;br /&gt; { &lt;br /&gt; element[i,j]=ob1.element[i,j]; &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-теперь-определим-методы-присваивания-и---&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-получения-значения-определенному-элементу-&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public void SetValue(int line,int row,int value) &lt;br /&gt; { &lt;br /&gt; element[line,row]=value; &lt;br /&gt; } &lt;br /&gt; public int GetValue(int line,int row) &lt;br /&gt; { &lt;br /&gt; return element[line,row]; &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-определим-перегруженный-метод-вывода-&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public void Print()//вывод всей матрицы &lt;br /&gt; { &lt;br /&gt; int i,j;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;переменные для циклов&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;for(i=0;i&lt;4;i++) &lt;br /&gt; { &lt;br /&gt; for(j=0;j&lt;4;j++) &lt;br /&gt; { &lt;br /&gt; Sc.Write(&quot; &quot;+GetValue(i,j)); &lt;br /&gt; } &lt;br /&gt; Sc.WriteLine(); &lt;br /&gt; }Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; public void Print(int line)//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;вывод строки&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; int j; &lt;br /&gt; for(j=0;j&lt;4;j++) &lt;br /&gt; { &lt;br /&gt; Sc.Write(&quot; &quot;+GetValue(line,j)); &lt;br /&gt; } &lt;br /&gt; Sc.WriteLine(); &lt;br /&gt; Sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; public void Print(int line,int row)//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;вывод элемента&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; Sc.WriteLine(&quot;Element[&quot;+line+&quot;,&quot;+row+&quot;]=&quot;+GetValue(line,row)); &lt;br /&gt; } &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;-и-наконец-метод-ввода-всех-элементов-&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public void Scan() &lt;br /&gt; { &lt;br /&gt; int i,j,ii; &lt;br /&gt; for(i=0;i&lt;4;i++) &lt;br /&gt; { &lt;br /&gt; string str1; &lt;br /&gt; ii=i+1; &lt;br /&gt; Sc.WriteLine(&quot;Enter string #&quot;+ii); &lt;br /&gt; for(j=0;j&lt;4;j++) &lt;br /&gt; { &lt;br /&gt; Sc.Write(&quot;Enter value for element[&quot;+i+&quot;,&quot;+j+&quot;](then press Enter)=&gt;&quot;); &lt;br /&gt; str1=Sc.ReadLine(); &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;C# не позволяет считывать численные данные&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;непосредственно &quot;в переменные&quot;.&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;считываем их в строку, затем &quot;парсим&quot;.&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;читай после листинга&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;element[i,j]=int.Parse(str1); &lt;br /&gt; } &lt;br /&gt; Sc.WriteLine(); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; class Application &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; Matrix matrix1=new Matrix(); &lt;br /&gt; Matrix matrix2=new Matrix(3,3,3); &lt;br /&gt; matrix1.Scan(); &lt;br /&gt; Matrix matrix1_copy=new Matrix(matrix1); &lt;br /&gt;&lt;br /&gt; Sc.Write(&quot;Matrix2-&gt;&quot;); &lt;br /&gt; matrix2.Print(3,3);//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;вывод одного элемента&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;Sc.WriteLine(); &lt;br /&gt; Sc.WriteLine(&quot;The very first line of matrix1:&quot;); &lt;br /&gt; matrix1.Print(0);//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;вывод нулевой строки&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;Sc.WriteLine(&quot;&amp; finally the full matrix1_copy&quot;); &lt;br /&gt; matrix1_copy.Print();//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;вывод всей матрицы&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;} &lt;br /&gt; }&lt;/span&gt;  &lt;br /&gt; Каждый тип, как я уже сказал - это класс. В каждом классе численного типа определен метод Parse(string str), который преобразует переданную ему строку в число и возвращает это число. Тип, возвращаемый методом, идентичен типу, описанному в классе. Обращение к методу производится следующим образом: &lt;br /&gt; псевдо_имя_типа.Parse(строка); &lt;br /&gt; Где псевдо_имя_типа - это просто название типа в C#. Вообще, честно говоря, применение консольного режима ограничено. А теперь о проге. В ней перегружены два метода. Степень перегрузки обоих методов равна 3. Итак, чтобы перегрузить метод, его достаточно просто повторно описать. Список параметров у каждой формы метода должен быть уникальным. Перегрузка методов - это неотъемлемая часть полиморфизма. При вызове метода выполняется та его форма, аргументы которой подходят под заданные. С методами все. Теперь об операторах.</content:encoded>
			<category>C++/C/С# Программирование</category>
			<dc:creator>Twit</dc:creator>
			<guid>https://black-market.do.am/forum/81-667-1</guid>
		</item>
		<item>
			<title>Учим C#: №4</title>
			<link>https://black-market.do.am/forum/81-666-1</link>
			<pubDate>Sun, 17 Mar 2013 08:39:59 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://black-market.do.am/forum/81&quot;&gt;C++/C/С# Программирование&lt;/a&gt;&lt;br /&gt;Автор темы: Twit&lt;br /&gt;Автор последнего сообщения: Twit&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>&lt;span style=&quot;color:#008000&quot;&gt;using sc=System.Console; &lt;br /&gt;&lt;br /&gt; abstract class Stone //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;это будет базовый класс&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; protected float weight;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;protected можно смело&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;protected int color;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;использовать в абстрактных классах&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;т.к. они в любом случае наследуемы.&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public Stone(){weight=0;color=0;}//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;конструктор&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public Stone(float w,int c) //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;конструктор&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; weigth=w; &lt;br /&gt; color=c; &lt;br /&gt; } &lt;br /&gt; public abstract void Print(); //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;абстрактный метод вывода&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;} &lt;br /&gt; class Diamond:Stone //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;это производный класс&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; private double price; &lt;br /&gt; public Diamond(){price=0;} &lt;br /&gt; public Diamond(float ww,int cc,double pp):base(ww,cc) &lt;br /&gt; {price=pp;} &lt;br /&gt; public override void Print() //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;метод вывода.&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//o&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;verride говорит компилятору о том,&lt;/span&gt;   &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;что код наследованного метода&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;будет переопределен.&lt;/span&gt;   &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; sc.WriteLine(&quot;The weight is &quot;+weight); &lt;br /&gt; sc.WriteLine(&quot;The color number is &quot;+color);  &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;ключевое слово base позволяет получить&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;доступ и к закрытым членам базового класса&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;имеет смысл ссылки на базовый класс&lt;/span&gt;   &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;sc.WriteLine(&quot;The price is &quot;+price); &lt;br /&gt; sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; class Prog &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; Diamond ob1=new Diamond(10,4,99.99); &lt;br /&gt; ob1.Print(); &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt; В .Net Framework имеется специальный класс - Object. А еще точнее - System.Object. Этот класс является базовым для всех стандартных классов. Любой тип в C# - это, по сути, класс. Поэтому мы до сих пор не рассмотрели типы, а вот мучаемся тут с этими концепциями и реализациями. Зато потом будет понятнее архитектура. Я, например, в свое время пожалел, что сначала знакомился с типами. Да, но что-то я не о том. Object это фундаментальный класс. Он определяет минимальный набор методов для объекта. Практически, все классы .Net Framework наследуют этот класс, и этот момент очень важен. Итак, класс System.Object определяет шесть открытых методов: &lt;br /&gt;&lt;br /&gt; public virtual bool Equals(object object) &lt;br /&gt; Этот метод определяет равенство вызывающего и передаваемого экземпляров.  &lt;br /&gt;&lt;br /&gt; public static bool Equals(object ob1,object ob2) &lt;br /&gt; Этот метод определяет равенство объектов ob1 и ob2, передаваемых в качестве параметров. Метод Equals() перегружен, т.к. для него определено два разных контекста.  &lt;br /&gt;&lt;br /&gt; public virtual int GetHashCode() &lt;br /&gt; Этот метод возвращает хэш-код, соответствующий вызывающему объекту. Применяется в алгоритмах, использующих хэши для доступа к экземплярам. &lt;br /&gt;&lt;br /&gt; public Type GetType() &lt;br /&gt; Этот метод возвращает тип объекта. &lt;br /&gt;&lt;br /&gt; public static bool ReferenceEquals(object ob1,object ob2) &lt;br /&gt; Этот метод определяет равенство ссылок ob1 и ob2, т.е. ссылаются ли они на один экземпляр. &lt;br /&gt;&lt;br /&gt; public virtual string ToString()  &lt;br /&gt; Этот метод возвращает строку с описанием объекта. &lt;br /&gt;&lt;br /&gt; И два закрытых: &lt;br /&gt;&lt;br /&gt; protected void Finalyze() &lt;br /&gt; Вызывается перед сборкой мусора. В принципе, можно не использовать. Не следует помещать в выполняемый код. Обычно вызывается деструктором. &lt;br /&gt;&lt;br /&gt; protected object MemberwiseClone() &lt;br /&gt; Один старый опытный кодер сказал мне, что этот метод используется для копирования объектов, при котором не копируется объект, а копируются его члены. Если честно, то я ему не верю, т.к. метод возвращает значение типа object. Этот метод скорее создает копию объекта, содержащую ссылки на другие объекты. С этой штукой я пока не экспериментировал и за базар не отвечаю. Как-нибудь, я разберусь с этим, напишу. &lt;br /&gt;&lt;br /&gt; Теперь можно переходить к интерфейсам с чистой душой. Интерфейсами в C# принято называть структуры, содержащие прототипы методов. Интерфейс, как и абстрактный класс не может являться базой для создания объектов. Синтаксис интерфейса похож на синтаксис абстрактного класса, но интерфейс не может содержать переменные-члены и тела методов, строго прототипы. А во всем остальном, можно считать их одной и той же сущностью. Все методы интерфейса являются виртуальными. Для создания интерфейсов в C# используется ключевое слово interface. Ниже приведен общий вид интерфейса и его наследования:  &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public interface имя_интерфейса //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;определение интерфейса&lt;/span&gt;   &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; тип_1 метод_1(список_параметров_1); //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;прототип_1&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;........................................................... &lt;br /&gt; тип_n метод_n(список_параметров_n); //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;прототип_n&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;} &lt;br /&gt;&lt;br /&gt; class имя_класса:имя_интерфейса  &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;наследование интерфейса классом&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;тело класса&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;}&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Примечание: при переопределении методов интерфейса ключевое слово override использовать не надо.  &lt;br /&gt;&lt;br /&gt; Если мы создаем объект типа класса, то нам приходится работать с ссылкой на него, что накладывает некоторое дополнительное время обработки. В С++ структура и класс v почти одно и то же, за исключением разницы в доступе по умолчанию и некоторых синтаксических аспектов. В C# структура синтаксически схожа с классом, может инициализироваться также, как и класс, но она имеет тип значения, а не ссылки, как класс. Это обеспечивает повышение эффективности. Итак, когда следует использовать структуры? Их следует использовать в том случае, если объект не обладает особой сложностью и большими объемами. Иначе говоря, структуры следует использовать для создания более простых объектов. Но синтаксически они мало чем отличаются. Для создания структуры используется старое доброе ключевое слово struct. Но теперь структура определяет тип данных, а не тип структуры, как в С++, и необходимость в использовании typedef отпадает. Вообще C# освобождает кодера от всяких таких мелочей, и не только мелочей, работа стала легче... Но это не значит, что это язык для ламеров... Структура в C# не может определять деструкторы, также не может определять конструторы по умолчанию (без параметров). &lt;br /&gt; Итак, ключевое слово class определяет тип ссылки, а struct v тип значения. Пример структуры я приводить не буду, т.к. сейчас это уже предельно просто. &lt;br /&gt;&lt;br /&gt; Теперь, наверное, последняя структура данных - перечисления. В C# под перечислением понимают некоторый упорядоченный набор целочисленных констант. Для создания используется ключевое слово enum. Рассмотрим следующий пример: &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;enum CodeMen{gates,torwald,straustrup,ritchie,kernigan};&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; доступ к элементам производится как и в случае с классом, но им автоматически присваиваются такие значения: &lt;br /&gt;&lt;br /&gt; CodeMen.gates =0 &lt;br /&gt; CodeMen.torwald =1 &lt;br /&gt; CodeMen.straustrup =2 &lt;br /&gt; CodeMen.ritchie =3 &lt;br /&gt; CodeMen.kernigan =4 &lt;br /&gt;&lt;br /&gt; Т.е. они индексируются. Если мы хотим обрабатывать перечисление в цикле, то управляющая переменная должна иметь тип данного перечисления и менять свое значение от значения первого элемента к значению последнего элемента, или наоборот. Обычно перечисления объявляются внутри тела класса. По дефолту, перечисления основываются на типе int, но тип можно указать явно так: &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;enum CodeMen:ulong{gates,torwald,straustrup,ritchie,kernigan};&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Теперь все члены перечисления будут иметь значение типа ulong. Это может быть любой другой целочисленный тип, кроме char.  &lt;br /&gt;&lt;br /&gt; В принципе, теперь вы знаете основы объектно-ориентированной модели C#.  &lt;br /&gt;&lt;br /&gt; В завершении я хочу привести фундаментальные типы C# с именами классов, которые отвечают за их обработку.  &lt;br /&gt; &lt;img src=&quot;http://www.xakep.ru/post/17887/csc3.gif&quot; border=&quot;0&quot; alt=&quot;&quot;/&gt; &lt;br /&gt; Приведение типов осуществляется, как в С++. Покажем это на следующем примере: &lt;br /&gt; .... &lt;br /&gt; int k=10; &lt;br /&gt; object ob1; &lt;br /&gt; ob1=(object)k; &lt;br /&gt; //приведение значения типа int типу object.  &lt;br /&gt; ....  &lt;br /&gt;&lt;br /&gt; И, наконец, немного о полиморфизме. Полиморфизм обеспечивается использованием интерфейсов. Хотя, в принципе, полиморфизм можно создать и без интерфейса, но это считается неправильно, типа, если есть - юзай! Я считаю, что на этом не стоит сейчас останавливаться, вы это еще не раз увидите в моих, и не только моих примерах.  &lt;br /&gt;&lt;br /&gt; Теперь почти все самое нудное позади, далее пойдут вещи новые и более интересные. В следующей статье будет описана перегрузка методов и операторов (только это, пожалуй, нам не ново), некоторые классы .Net Framework, а также некоторые принципы автоматизации работы программ при помощи того же волшебного .Net. Скоро вы узнаете, почему он волшебный!</content:encoded>
			<category>C++/C/С# Программирование</category>
			<dc:creator>Twit</dc:creator>
			<guid>https://black-market.do.am/forum/81-666-1</guid>
		</item>
		<item>
			<title>Учим C#: №3</title>
			<link>https://black-market.do.am/forum/81-665-1</link>
			<pubDate>Sun, 17 Mar 2013 08:38:38 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://black-market.do.am/forum/81&quot;&gt;C++/C/С# Программирование&lt;/a&gt;&lt;br /&gt;Автор темы: Twit&lt;br /&gt;Автор последнего сообщения: Twit&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>Язык программирования считается объектно-ориентированным, если в нем реализованы механизм классов и объектов, а также три важных свойства (я их считаю возможностями): &lt;br /&gt; &lt;ul&gt;&lt;li&gt;Инкапсуляция - это возможность скрыть некоторые члены класса от пользователя. Например, предотвратить вмешательство пользователя во внутреннюю структуру класса, предотвратить ошибки, которые могут возникнуть в результате изменений пользователя и т.д.  &lt;br /&gt; &lt;li&gt;Наследование - это возможность создания производных классов на основе базовых классов, которые также называют классами-предками. Существуют такие классы, объекты которых не могут быть созданы, т.к. эти классы необходимо доопределить. Такие классы называются абстрактными и могут быть только предками, причем, в производном классе должны быть определены тела (код) методов, являющихся абстрактными (т.е. только прототип) в базовом классе. Методы, определенные виртуальными в базовом классе, могут быть переопределены. Метод, определенный абстрактным, автоматически становится виртуальным. Абстрактный класс может отражать некоторые общие свойства и методы для разных типов объектов, его можно назвать интерфейсом; но в С# принято называть интерфейсами немного другое - интерфейс содержит только прототипы методов без тел и не содержит переменных-членов. Другими словами, интерфейс определяет, что делать, но не определяет, как делать. Интерфейс также может быть унаследован производным классом. Абстрактные классы и интерфейсы несут некоторую фундаментальную неполную информацию об объекте. &lt;br /&gt; &lt;li&gt;Полиморфизм - это возможность одинакового обращения к методам объектов разного типа. Использование одного интерфейса в качестве предка для нескольких классов порождает полиморфизм. &lt;br /&gt; &lt;/ul&gt; &lt;br /&gt; Инкапсуляция в С# достигается за счет применения модификаторов доступа public, private &amp; protected, internal. Как в С++, не так ли? Да, но...  &lt;br /&gt; В С++ мы писали так: &lt;br /&gt;&lt;br /&gt; private: &lt;br /&gt; закрытые члены;//не доступны клиенту &lt;br /&gt; protected: &lt;br /&gt; защищенные от клиента, но доступные производному классу члены; &lt;br /&gt; public: &lt;br /&gt; открытые члены;//доступны клиенту &lt;br /&gt;&lt;br /&gt; А в C# вот как: &lt;br /&gt;&lt;br /&gt; private член1; &lt;br /&gt; public член2; &lt;br /&gt; protected член3; &lt;br /&gt; .....  &lt;br /&gt;&lt;br /&gt; Т.е. уровень доступа указывается явно для каждого члена. Если это функции (методы), то перед именем указывается тип возвращаемого значения, после имени в круглых скобках указывается список аргументов, перед типом может стоять некоторое ключевое слово.  &lt;br /&gt; Модификатор internal - нечто среднее между public и protected, в зависимости от того, где находится код. Это достаточно специфичный модификатор доступа. Член становится видимым только в пределах текущей единицы компиляции. Я считаю, что в написании прог им можно не пользоваться, но его знание может пригодиться в анализе других прог. Хотя, я намереваюсь все же его затронуть в своих статьях. &lt;br /&gt; Об инкапсуляции все самое основное вы должны были понять, остальное это вопрос энтузиазма.  &lt;br /&gt; Наследование реализуется довольно просто. Приведем пример: &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;using sc=System.Console; &lt;br /&gt;&lt;br /&gt; class Stone //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;это будет базовый класс&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; protected float weight;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;использован модификатор&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;protected int color;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;protected в целях наследования.&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public Stone(){weight=0;color=0;}//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;конструктор&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public Stone(float w,int c) //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;конструктор с параметрами&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; weight=w;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;присваивание значений&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;color=c; &lt;br /&gt; } &lt;br /&gt; public void Print() //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;метод вывода&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; sc.WriteLine(&quot;The weight is &quot;+weight); &lt;br /&gt; sc.WriteLine(&quot;The color number is &quot;+color); &lt;br /&gt; sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; class Diamond:Stone //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;это производный класс&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; private double price;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;не доступно вне класса&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public Diamond(){price=0;} &lt;br /&gt; public Diamond(float ww,int cc,double pp):base(ww,cc) &lt;br /&gt; {price=pp;}//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;вызов конструктора базового класса и дополнение его своим опреациями&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;new public void Print() //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;метод вывода.&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;new скрывает метод&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;базового класса с таким же именем.&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;не следует путать с выделением памяти&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; base.Print(); //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;ключевое слово base позволяет получить&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;доступ к члену базового класса&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;sc.WriteLine(&quot;The price is &quot;+price); &lt;br /&gt; sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; class Prog &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; Diamond ob1=new Diamond(10,4,99.99); &lt;br /&gt; ob1.Print(); &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt; Итак, есть класс, описывающий камень и созданный на его основе класс, описывающий бриллиант. Конструктор с параметрами производного класса сначала запускает аналогичный конструктор базового класса, передавая ему нужные значения, затем производит свои действия: &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public Diamond(float ww,int cc,decimal pp):base(ww,cc) &lt;br /&gt; {price=pp;}&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Здесь осуществляется вызов конструктора с параметрами базового класса. При этом базовому конструктору передаются аргументы, заданные в вызове производного конструктора. В таком контексте ключевое слово base имеет смысл ссылки на конструктор базового класса. &lt;br /&gt; Наследование можно предотвратить, определив класс как sealed. Это ключевое слово указывает, что данный класс не может быть предком. Если мы определим класс Stone в нашей проге таким образом: &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;sealed class Stone &lt;br /&gt; { &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; то производный класс Diamond не унаследует члены базового класса.  &lt;br /&gt;&lt;br /&gt; А теперь немного переделаем нашу прогу: &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;using sc=System.Console; &lt;br /&gt;&lt;br /&gt; class Stone //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;это будет базовый класс&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; protected float weight; &lt;br /&gt; protected int color; &lt;br /&gt; public Stone(){weight=0;color=0;}//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;конструктор&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public Stone(float w,int c) //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;конструктор&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; weight=w; &lt;br /&gt; color=c; &lt;br /&gt; } &lt;br /&gt; public virtual void Print() //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;виртуальный метод вывода&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; sc.WriteLine(&quot;The weight is &quot;+weight); &lt;br /&gt; sc.WriteLine(&quot;The color number is &quot;+color); &lt;br /&gt; sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; class Diamond:Stone //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;это производный класс&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; new int color;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;закроем переменную базового класса&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;private double price; &lt;br /&gt; public Diamond(){price=0;} &lt;br /&gt; public Diamond(float ww,int cc,double pp):base(ww,cc) &lt;br /&gt; {price=pp;} &lt;br /&gt; public override void Print() //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;метод вывода.&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;override говорит компилятору о том,&lt;/span&gt;   &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;что код наследованного метода&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;будет переопределен.&lt;/span&gt;   &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; sc.WriteLine(&quot;The weight is &quot;+base.weight); &lt;br /&gt; sc.WriteLine(&quot;The color number is &quot;+base.color);  &lt;br /&gt; //&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;ключевое слово base позволяет получить доступ&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;и к членам базового класса, закрытым из-за&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;объявления новой переменной с таким же именем.&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;base имеет смысл ссылки на базовый класс.&lt;/span&gt;   &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;sc.WriteLine(&quot;The price is &quot;+price); &lt;br /&gt; sc.ReadLine(); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; class Prog &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; Diamond ob1=new Diamond(10,4,99.99); &lt;br /&gt; ob1.Print(); &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt; Теперь мы познакомились с виртуальными функциями. Тут же я хочу отметить ключевые слова this и base. И то,  и другое имеет смысл ссылки на объект. Но разница в том, что this ссылается на текущий объект текущего класса (того класса, типом которого является сам объект), а base ссылается на объект базового класса (предка). Если не понятно,  &lt;br /&gt; &lt;ul&gt;&lt;li&gt;this - полноценный объект, с которым мы работаем; &lt;br /&gt; &lt;li&gt;base - объект базового класса-предка. &lt;br /&gt; &lt;/ul&gt; &lt;br /&gt; Абстрактные классы. Как много страха выражают эти два слова для начинающего кодера! Но, на самом деле, бояться здесь нечего. Как уже отмечалось, абстрактный класс - это класс, объект которого нельзя создать, может нести некоторую часть теоретической информации об объекте. Но зачем они нужны? На базе абстрактных классов можно создавать новые производные классы, на основе которых можно будет создавать объекты. Для создания абстрактного класса в C# используется ключевое слово abstract. Абстрактным можно определить и метод, используя все то же ключевое слово. Как уже было отмечено, абстрактный метод автоматически становится виртуальным. Итак, пример...</content:encoded>
			<category>C++/C/С# Программирование</category>
			<dc:creator>Twit</dc:creator>
			<guid>https://black-market.do.am/forum/81-665-1</guid>
		</item>
		<item>
			<title>Учим C#: №2</title>
			<link>https://black-market.do.am/forum/81-664-1</link>
			<pubDate>Sun, 17 Mar 2013 08:37:14 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://black-market.do.am/forum/81&quot;&gt;C++/C/С# Программирование&lt;/a&gt;&lt;br /&gt;Автор темы: Twit&lt;br /&gt;Автор последнего сообщения: Twit&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>Основной структурой объектно-ориентрованного программирования является класс. Классы – это кирпичики, из которых состоит любая программа на С#. Конечно же классы – это основа С#. Поэтому я их рассматриваю в первую очередь, хотя многие считают, что надо начинать с типов данных и операторов.  &lt;br /&gt; &lt;b&gt;Без знания классов и основных концепций ООП невозможно создать действительно !качественного! приложения в С#.&lt;/b&gt; &lt;br /&gt; В классе определяются данные и код, обрабатывающий эти данные. Активный процесс С#-программы происходит внутри класса. Класс является определением составляющих объекта. Переменная типа класса называется объектом, то есть объект – это экземпляр класса. Под инициализацией объекта понимается инициализация переменных в объекте. Как и в C++, инициализация объекта выполняется специальной функцией – конструктором. Класс может иметь несколько конструкторов, но об этом попозже. Функции-методы и данные, составляющие класс называют членами класса. &lt;br /&gt; Итак, класс – это описание объекта (за исключением одного момента, который вы вскоре уловите). Я думаю, понятно, что данные содержатся в переменных объекта, а код – в функциях-методах. В С# применяется следующая классификация членов класса: &lt;br /&gt; &lt;ul&gt;&lt;li&gt;переменные; &lt;br /&gt; &lt;li&gt;статические переменные; &lt;br /&gt; &lt;li&gt;константы; &lt;br /&gt; &lt;li&gt;конструкторы; &lt;br /&gt; &lt;li&gt;деструкторы; &lt;br /&gt; &lt;li&gt;методы; &lt;br /&gt; &lt;li&gt;операторы; &lt;br /&gt; &lt;li&gt;свойства; &lt;br /&gt; &lt;li&gt;индексаторы; &lt;br /&gt; &lt;li&gt;события; &lt;br /&gt; &lt;/ul&gt; &lt;br /&gt; Определение класса начинается, как и в С++, с ключевого слова class. Например, &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;class example //example – это имя класса &lt;br /&gt; { &lt;br /&gt; //-----------Объявление-переменных------------- &lt;br /&gt; private int version; //эта переменная доступна только для членов класса &lt;br /&gt; public int amount; //а эта открыта для кода, находящегося вне данного класса &lt;br /&gt; //-----------Объявление-методов------------------- &lt;br /&gt; public int get_version()// &lt;br /&gt; { &lt;br /&gt; //тело метода (код) &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; “public” &amp; “private” называются идентификаторами доступа.  &lt;br /&gt;&lt;br /&gt; А теперь напишем прогу... &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;using System; &lt;br /&gt;&lt;br /&gt; class CPU //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;этот класс описывает&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;характеристики проца&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public char ID; //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;идентификатор производителя&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//(I-&gt;Intel, A-&gt;AMD) &lt;br /&gt; public int freq; //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;рабочая частота проца (Mhz)&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public int CACHE; //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;размер кэша (Kb)&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;} &lt;br /&gt;&lt;br /&gt; class Application &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; CPU object1 = new CPU();//&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;создание объекта класса CPU&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;object1.ID = ’A’; &lt;br /&gt; object1.freq = 1700; &lt;br /&gt; object1.CACHE = 256; &lt;br /&gt; Console.WriteLine (“Made by “+object1.ID); &lt;br /&gt; Console.WriteLine (“Frequence is”+object1.freq+”Mhz”); &lt;br /&gt; Console.WriteLine (“CACHE has “+object1.CACHE+”Kb”); &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Откомпилировав и запустив данную прогу, вы должны увидеть, за каким беспонтовым тазиком я работаю...  &lt;br /&gt;&lt;br /&gt; В классе CPU мы определили основные характеристики процессора в качестве одной символьной и двух целочисленных переменных.  &lt;br /&gt;&lt;br /&gt; Как создается объект в C#? Можно выделить 2 этапа (на примере вышеприведенного кода): &lt;br /&gt;&lt;br /&gt; 1) Объявление переменной object1 типа CPU. Но переменная не является объектом, как, например, в С++, а только ссылается на него. &lt;br /&gt;&lt;br /&gt; 2) Оператор new создает физическую реализацию объекта, т.е. динамически выделяет память под объект, на который теперь получает ссылку переменная. Если мы наберем, к примеру, CPU object2 = object1; мы не создадим нового объекта, мы создадим новую ссылку на старый объект. &lt;br /&gt;&lt;br /&gt; Смысл оператора присваивания в первой строке метода Main() заключается в том, что переменная получает значение адреса объекта в памяти. Можно создавать несколько ссылок на один объект, приравнивая новые к первой и т.д. &lt;br /&gt;&lt;br /&gt; &lt;b&gt;В C# память, занимаемая объектом, должна выделяться строго динамически!&lt;/b&gt; &lt;br /&gt;&lt;br /&gt; Теперь поговорим о конструкторах и деструкторах. Это специальные методы, отвечающие за инициализацию и удаление объектов соответственно. Конструктор в С# похож на конструктор в С++. И там и там конструкторы и деструкторы не имеют возвращаемого значения. Добавим к нашему классу 2 конструктора: &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;class CPU //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;этот класс описывает&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;характеристики проца&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public char ID; //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;идентификатор производителя&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//(I-&gt;Intel, A-&gt;AMD) &lt;br /&gt; public int freq; //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;рабочая частота проца (Mhz)&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public int CACHE; //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;размер кэша (Kb)&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public CPU() //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;конструктор по умолчанию&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; ID = 0;freq = 0;CACHE = 0;//&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;установка в 0 значений&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;всех переменных-членов&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;} &lt;br /&gt; public CPU(char ID_,int freq_,int CACHE_) &lt;br /&gt; { //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;конструктор с тремя параметрами -&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;значениями для переменных&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;ID = ID_; &lt;br /&gt; freq = freq_; &lt;br /&gt; CACHE = CACHE_; &lt;br /&gt; }  &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; В конструкторах чаще всего описывают динамическое выделение памяти и задание начальных значений некоторых переменных. Показано два конструктора – по умолчанию и с параметрами. Существуют и другие разновидности конструкторов, но это как-нибудь потом, а то перегруз инфы пойдет. Конструктор в классе должен быть объявлен открытым, т.е. public. &lt;br /&gt; Еще одно нововведение С# - механизм сборки мусора. Итак, оператор new динамически выделяет память под объект. Но “...памяти никогда не бывает много...” (так говорит мой препод по Центральным Устройствам) и ее надо освобождать после использования. В С++ мы это делали оператором delete. Сейчас память освобождается сама тогда, когда объект больше не используется, т.е. тогда, когда отсутствуют обращения к нему. Память освобождается при необходимости. Сборка мусора производится только тогда, когда она может быть выполнена эффективно, например, для нескольких объектов одновременно. Деструктор же может использоваться для гарантии удаления. Можно его использовать для осведомления пользователя о деятельности нового чудо-механизма. Деструктор, как и конструктор, имеет такое же имя, как и класс, но перед ним ставится знак ‘~’. А теперь, типа фокус... &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;class CPU //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;этот класс описывает&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;характеристики проца&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public char ID; //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;идентификатор производителя&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//(I-&gt;Intel, A-&gt;AMD) &lt;br /&gt; public int freq; //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;рабочая частота проца (Mhz)&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public int CACHE; //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;размер кэша (Kb)&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;public CPU() //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;конструктор по умолчанию&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; ID = 0;freq = 0;CACHE = 0;//&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;установка в 0 значений&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;всех переменных-членов&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;} &lt;br /&gt; public CPU(char ID_,int freq_,int CACHE_) &lt;br /&gt; { //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;конструктор с тремя параметрами -&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;значениями для переменных&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;ID = ID_; &lt;br /&gt; freq = freq_; &lt;br /&gt; CACHE = CACHE_; &lt;br /&gt; }  &lt;br /&gt; } &lt;br /&gt; public void CreateNewObject(char ID__,int freq__, int CACHE__) &lt;br /&gt; { &lt;br /&gt; CPU ob = new CPU(ID__,freq__,CACHE__); //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;это используем&lt;/span&gt;  &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;для создание объектов&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;} &lt;br /&gt; ~CPU() //&lt;/span&gt;&lt;span style=&quot;color:#ff0000&quot;&gt;деструктор&lt;/span&gt; &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;{ &lt;br /&gt; System.Console.WriteLine(“Сгорел твой проц!!!”); &lt;br /&gt; } &lt;br /&gt; } &lt;br /&gt; //-------------------- &lt;br /&gt; class Application &lt;br /&gt; { &lt;br /&gt; public static void Main() &lt;br /&gt; { &lt;br /&gt; int i; &lt;br /&gt; CPU object = new CPU();  &lt;br /&gt; for(i=0;i&lt;500000;i++) object.CreateNewObject(‘A’,1700,i); &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt; &lt;br /&gt;&lt;br /&gt; Итак, мы создали множество объектов методом CreateNewObject() в цикле for. Со временем они перестают быть используемыми и удаляются, причем группами. На экране должны появляться сообщения от деструктора. Чаще всего деструктор генерирует сообщения об удалении объекта, т.е. для осведомления пользователя. Сообщения деструкторов могут выводится, например, в Status Bar’e. &lt;br /&gt;&lt;br /&gt; Еще я хочу сказать пару слов о методах, и на сегодня все... Метод является одной из двух основных составляющих класса. Итак, что такое метод? Это ни что иное, как старая добрая сишная функция, являющаяся членом класса. Кто не знаком с функциями, советую взять любой учебник по С или С++ и посмотреть. Метод содержит в себе определенный код, последовательность операций, может возвращать значение при помощи оператора return: &lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;return значение;&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt; Метод может возвращать значение любого типа, имеющегося в языке. Пример я пока не привожу. Их потом будет более чем достаточно. &lt;br /&gt;&lt;br /&gt; А вот вам сувенирчик – &lt;a class=&quot;link&quot; href=&quot;http://u.to/YLESAw&quot; title=&quot;http://msdn.microsoft.com/netframework/downloads/howtoget.asp&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ссылка на .Net Framework SDK&lt;/a&gt;, содержащий компиляторы и другие инструменты для создания .Net-приложений. Весит около 132 Мб, но оно того стоит... Советую скачать. Не советую качать без Getright или подобной проги. Можно компилировать программы на С#, не имея MS Visual Studio на семи дисках. &lt;br /&gt;&lt;br /&gt; И еще одно... Если вы считаете, что мои статьи короткие, просьба написать об этом в мнениях. &lt;br /&gt;&lt;br /&gt; Следующая глава раскроет другие новые аспекты объектно-ориентированной модели C#. Это очень объемная тема, за один раз ее сложно рассмотреть и преподнести. Да и не зачем так мозги нагружать, мы же не в универе! Еще хочу включить в следующую статью перегрузку операторов и ключевое слово this. Но пока не обещаю. Я считаю, что чем меньше доза информации, тем больше прикола, и она лучше усваивается. Я хочу, чтоб читатели наслаждались чтением, а не грузились. Поэтому такие вот короткие статейки. Если я не прав, оставляйте свои мнения...  &lt;br /&gt;&lt;br /&gt; Некоторые типы членов класса, как события, свойства и т.д. будут рассмотрены непосредственно перед первым использованием, когда уровень сложности статей и знаний читателей повысится, т.е. немного позже.</content:encoded>
			<category>C++/C/С# Программирование</category>
			<dc:creator>Twit</dc:creator>
			<guid>https://black-market.do.am/forum/81-664-1</guid>
		</item>
		<item>
			<title>Учим C#: №1</title>
			<link>https://black-market.do.am/forum/81-663-1</link>
			<pubDate>Sun, 17 Mar 2013 08:36:33 GMT</pubDate>
			<description>Форум: &lt;a href=&quot;https://black-market.do.am/forum/81&quot;&gt;C++/C/С# Программирование&lt;/a&gt;&lt;br /&gt;Автор темы: Twit&lt;br /&gt;Автор последнего сообщения: Twit&lt;br /&gt;Количество ответов: 0</description>
			<content:encoded>Язык С после своего появления завоевал сердца многих кодеров. Программирование развивалось, задачи усложнялись тем самым увеличивая размер кода. Возникла необходимость в новом подходе к программированию... &lt;br /&gt; Возникает новое направление – объектно-ориентированное программирование. Его особенность заключается в использовании виртуальных функций и классов, что увеличивает гибкость динамической организации программы в виде отдельных модулей; а также активное преднамеренное использование таких свойств как наследование, полиморфизм, инкапсуляция. Разработан объектно-ориентированный язык программирования C++, соответствующий практически всем аспектам данного направления. Данный язык является основным во многих операционных системах, и почти вся нами горячо любимая Windows (почему почти? - потому что без ASMa никак в системном программировании). Короче в С++ писали почти все (и чуть меньше пишут сейчас). Также широко используется сочетание его с другими языками. Проги в С/C++ компилируются в бинарные исполняемые файлы или в бинарные динамические библиотеки (dll).  &lt;br /&gt; Но как известно многим нам – программистам и юзерам, существует один страшный монстр в этом компьютерном мире, и называет он себя гордо – Microsoft. Базару нет - он управляем, и управляет им отважный праотец миллионов дыр в своих операционках, его дырявое величество, Билл Гейтс, мать его так! Решил Билл удивить мир и сказал своим апостолам: &lt;br /&gt; - Вот С++ - хорошая концепция, а мы мутим, типа, самую лучшую реализацию этой концепции под самую глючную, самую дырявую, короче, самую конченную операционную систему во всем этом, из-за наших систем, неидеальном мире! Мы гребанные молодцы!!! Надо создавать свой язык программирования и заставим пользоваться им всех владельцев новых версий Visual C++ 7. Вот это будет тема, типа! &lt;br /&gt; И то ли он что-то недосказал, то ли апостолы что-то прослушали... Сделали, в общем, вещь толковую. А назвать ее решили C#. Я считаю, красивый понт. А Билл, сам того не желая, сделал в своей жизни хоть что-то толковое, а не очередную покупку у лохов прав на DOS или подписывание контрактов с IBM, где последняя расписывается в том, что является лохушкой! C# имеет двух родителей – это С++ и Java, легко учится при наличии небольшого опыта хоть в одном из этих двух языков. В последние годы много шуму наделал язык JAVA от Sun Microsystems. Его можно назвать внуком С++. Программы JAVA компилируются не в бинарный исполняемый файл, как в С/C++, а в так называемый байт-код, выполняемый виртуальной машиной JAVA. Так был решен вопрос о переносимости. Но, по мнению Microsoft, у JAVA ест один серьезный недостаток – отсутствие прямой поддержки Windows. Код JAVA не совместим с кодом C/C++, но синтаксис явно заимствован из С++, но конечно есть некоторые изменения. &lt;br /&gt;&lt;br /&gt; &lt;i&gt;Интересный факт: &lt;br /&gt; Язык программирования JAVA – это детище Sun Microsystems, можно сказать, гордость этой компании. Хотя еще какие-то 2 недели назад моя матушка скачивала Java Virtual Machine(среду выполнения JAVA-приложений) с сайта Microsoft. Однако, по решению суда от 3.02.2003, зловещий производитель Windows не имеет прав на распространеие JVM.&lt;/i&gt;  &lt;br /&gt;&lt;br /&gt; И вот тут Microsoft решает внести свою лепту... В конце 90х разрабатывается язык С# для создания кода Net Framework. В 2000 году появляется первая бета-версия. Мне не известно, на чем сделан Net Framework, но это не мешает мне рассказать о том, что это и зачем надо. &lt;br /&gt; Итак, Net Framework – это среда, в которой могут выполняться программно-независимые приложения. В данной среде поддерживается совместная работа в приложении разных языков программирования. Net Framework определяет библиотеки классов, используемых в C#. Любая примитивная программа C# основана на использовании библиотек классов Net Framework. И, пожалуй, самое главное – Net Framework не ограничивается Windows! Я не знаю, существует ли реализация данной среды под другие системы, но уверяю вас, что скоро это все будет.  &lt;br /&gt; Net Framework содержит в себе не зависящую от языка среду выполнения. Программы C# не компилируются в бинарный исполняемый файл, а компилируются в промежуточный язык (MS Intermediate Language, MSIL). MSIL можно назвать переносным ассемблером, но это псевдо-ассемблер. Среда переводит MSIL в машинный исполняемый код, который в последствии и выполняется. То есть, Net Framework содержит интерпретатор MSIL. А кто сказал, что интерпретаторы плохи? Я с ним не согласен (ну без базару, небольшой проигрыш во времени при запуске), и вот мой аргумент: интерпретируемость – это идеальное решение проблем переносимости прог. В это же время не возникает никаких ошибок при переносе (если же конечно не глючная версия Net Framework :-) ). Кто знаком с PERL, вспомните, как просто переносятся скрипты в разные ОС.  &lt;br /&gt; По традиции, сейчас мы вместе напишем первую прогу на С# - “Hello World!!!”. Если вы являетесь счастливым обладателем MS Studio Net, можете набрать прогу в файле с расширением .сs (пусть его имя Hello.cs), затем в командой строке набираете csc Hello.cs в директории содержащей исходник. В результате получается файл Hello.exe, и запустится он только при наличии Net Framework. &lt;br /&gt;&lt;br /&gt; Листинг: &lt;br /&gt; &lt;span style=&quot;color:#008000&quot;&gt;using System; //Это называется определением пространства имен, об этом я буду говорить  &lt;br /&gt; //позже  &lt;br /&gt; class Hello //Определение класса &lt;br /&gt; {  &lt;br /&gt;&lt;br /&gt; public static void Main() //любая C#-программа начинается с вызова функции Main() &lt;br /&gt; { &lt;br /&gt; Console.WriteLine(“Hello World!!!”);//метод вывода строки класса Console &lt;br /&gt; } &lt;br /&gt; }&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt; ИТОГ... В вышеприведенном листинге ярко видны 2 отличия от С++: &lt;br /&gt; &lt;ul&gt;&lt;li&gt;мы определили пространство имен, использовав новое ключевое слово’using’, которого в С++ не было; &lt;br /&gt; &lt;li&gt;функция Main() содержится прямо в классе, как в JAVA; &lt;br /&gt; &lt;/ul&gt; &lt;br /&gt; А вот еще одно не очень яркое: &lt;br /&gt; &lt;ul&gt;&lt;li&gt;в С++ для вывода строки в консольном режиме, мы использовали оператор cout (в принципе, это целый класс) из iostream.h. &lt;br /&gt; &lt;/ul&gt; &lt;br /&gt; Несмотря на все, С# не утрачивает возможности использования динамических библиотек. Успешно комбинируется с ASP.net. Кроме разработки обычных приложений C# может быть использован для автоматизации работы программ, в частности офисных приложений Microsoft, а также других важных направлениях информационных технологий и сферах деятельности человека. С# имеет нововведение, тип decimal, используемый в финансовых вычислениях. Об этих и других возможностях этого концептуально нового языка я расскажу позже, в следующих статьях. &lt;br /&gt; Объектно-ориентированная модель C# куда более совершенна модели C++. Об этом пойдет речь в следующей статье.  &lt;br /&gt; I’ll be back!!! See ya!</content:encoded>
			<category>C++/C/С# Программирование</category>
			<dc:creator>Twit</dc:creator>
			<guid>https://black-market.do.am/forum/81-663-1</guid>
		</item>
	</channel>
</rss>