Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Класс Environment: получение сведений о компьютере





/ http://www.bogotobogo.com/CSharp/csharp_system_members.php

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

Namespace GetCompProp

{

Class Program

{

static void Main(string[] args)

{

Console.WriteLine("System.Environment Class");

Console.WriteLine();

ShowEnvDetails();

Console.ReadKey();

}

Static void ShowEnvDetails()

{

Foreach (string drv in Environment.GetLogicalDrives())

Console.WriteLine("Drive: {0}", drv);

Console.WriteLine("OS: {0}", Environment.OSVersion);

Console.WriteLine("# of processors: {0}",

Environment.ProcessorCount);

Console.WriteLine(".NET Version: {0}",

Environment.Version);

}

}

}

//System.Environment Class

//Drive: C:\

//Drive: D:\

//Drive: E:\

//Drive: F:\

//Drive: G:\

//OS: Microsoft Windows NT 5.1.2600 Service Pack 2

//# of processors: 4

//.NET Version: 2.0.50727.3053

// See more at: http://www.bogotobogo.com/CSharp/

// csharp_system_members.php#sthash.SKOM2zw7.dpuf


Чтение текстового файла

 

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

Прогульщиков 12,5 1992

Ленивый 23,5 1993

Красивая 9060,90 1994

 

Разделителем полей записи выбран пробел, но пробел в конце записи файла не допускается. Текстовый файл с символами кириллицы надо сохранить в кодировке Unicode:

File->Advanced Save Options->Encoding->Unicode (UTF-8...) - CodePage 65001

Файл проще всего разместить в каталоге debug проекта или использовать стандартный диалог по получению имени файла.

 
 

 
 

 
 

 
 

Стандартный диалог по выбору имени файла можно организовать так:

using System;

using System.IO; /* необходимо для использования Directory.GetCurrentDirectory()*/

//using System.Collections.Generic;

//using System.Linq;

//using System.Text;

//using System.ComponentModel;

//using System.Data;

//using System.Drawing;

using System.Windows.Forms; /* необходимо для использования OpenFileDialog */

Class Program

{

[STAThreadAttribute]// необходимо для использования OpenFileDialog

static void Main(string[] args)

{

OpenFileDialog openFileDialog1 = new OpenFileDialog();

openFileDialog1.DefaultExt = "txt";

openFileDialog1.Filter = "Text files (*.txt)|*.txt";

openFileDialog1.InitialDirectory =

Directory.GetCurrentDirectory();

if (openFileDialog1.ShowDialog() == DialogResult.OK)

{

/* читаем весь файл и выводим его содержимое в окно*

StreamReader sr = new

StreamReader(openFileDialog1.FileName);

MessageBox.Show(sr.ReadToEnd());

sr.Close();

}

}

}


Основы типов

Все типы — производные от System.Object

В CLR каждый объект прямо или косвенно является производным от System.Object. Это значит, что следующие определения типов идентичны:

 

// Тип, неявно производный от Object // Тип, явно производный от Object
class Employee { ... } class Employee: System.Object { ... }

 

Благодаря тому, что все типы в конечном счете являются производными от System.Object, любой объект любого типа гарантированно имеет минимальный набор методов. Открытые экземплярные методы класса System.Object перечислены в табл. 3.1.

 

Табл. 3.1. Открытые методы System.Object

Открытый метод Описание
Equals Возвращает true, если два объекта имеют одинаковые значения
GetHashCode Возвращает хеш-код для значения данного объекта. Этот метод следует переопределить, если объекты типа используются в качестве ключа в хеш-таблице. Очень неудачно, что этот метод определен в Object, потому что большинство типов не служат ключами в хеш-таблице; этот метод уместнее было бы определить в интерфейсе
ToString По умолчанию возвращает полное имя типа {this.GetType().FullName). На практике этот метод переопределяют, чтобы он возвращал объект String, содержащий состояние объекта в виде строки. Например, переопределенные методы для таких фундаментальных типов, как Boolean и Int32, возвращают значения объектов в строковом виде. Кроме того, переопределение метода часто применяют при отладке: вызов такого метода позволяет получить строку, содержащую значения полей объекта. Считается, что ToString «знает» о CultureInfo, связанном с вызывающим потоком
GetType Возвращает экземпляр объекта, производного от Туре, который идентифицирует тип объекта, вызвавшего GetType. Возвращаемый объект Туре может использоваться с классами, реализующими отражение для получения информации о типе в виде метаданных. Метод GetType невиртуальный, его нельзя переопределить, поэтому классу не удастся исказить сведения о своем типе. Таков механизм обеспечения безопасности типов.

 

Кроме того, типы, производные от System.Object, имеют доступ к защищенным методам (см. табл. 3.2).

Табл. 3.2. Защищенные методы System.Object

Защищенный метод Описание
MemberwiseClone Этот невиртуальный метод создает новый экземпляр типа и присваивает полям нового объекта соответствующие значения объекта this. Возвращается ссылка на созданный экземпляр
Finalize Этот виртуальный метод вызывается, когда сборщик мусора определяет, что объект является мусором, но до возвращения занятой объектом памяти в кучу. В типах, требующих очистки при сборке мусора, следует переопределить этот метод

 

Пример с константой:

Console.WriteLine("123.ToString()={0}", 123.ToString()); // 123

Console.WriteLine(" 123.GetType().FullName={0} ",

123.GetType().FullName); // 123.GetType().FullName=System.Int32

 

CLR требует, чтобы все объекты создавались с помощью оператора new (который порождает IL-команду newobj). Объект Employee создается так:

Employee e = new Employee("ConstructorParam1");

 

Оператор new делает следующее.

1. Вычисляет число байт, необходимых всем экземплярным полям типа и всем его базовым типам вплоть до и включая System.Object (в котором отсутствуют собственные экземплярные поля). Каждый объект кучи требует дополнительных членов, они называются указатель на объект-тип (type object pointer) и индекс блока синхронизации {SyncBlockIndex) и используются CLR для управления объектом. Байты этих дополнительных членов добавляются к байтам, необходимым для размещения самого объекта.

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

3. Инициализирует указатель на объект-тип и SyncBlockIndex.

4. Вызывает конструктор экземпляра типа с параметрами, указанными при вызове new (в предыдущем примере это строка «ConstructorParaml»). Хотя многие компиляторы помещают в конструктор вызов конструктора базового типа. Большинство компиляторов автоматически создает в конструкторе код вызова конструктора базового класса. Каждый конструктор выполняет инициализацию определенных в соответствующем типе полей. В частности, вызывается конструктор System.Object, но он ничего не делает и просто возвращает управление. Это легко проверить, загрузив в ILDasm.exe библиотеку MSCorLib.dll и изучив метод-конструктор типа System.Object.

 

Выполнив все эти операции, new возвращает ссылку (или указатель) на вновь созданный объект. В предыдущем примере кода эта ссылка сохраняется в переменной е типа Employee.

Кстати, у оператора new нет пары — оператора delete, то есть нет явного способа освобождения памяти, занятой объектом. Сборкой мусора занимается CLR, которая автоматически находит объекты, ставшие ненужными или недоступными, и освобождает занимаемую ими память.

Приведение типов

Одна из важнейших особенностей CLR — безопасность типов (type safety). В период выполнения тип объекта всегда известен CLR. Точно определить тип объекта позволяет GetType. Поскольку это невиртуальный метод, никакой тип не сможет сообщить о себе ложные сведения. Так, тип Employee не может переопределить метод GetType, чтобы тот вернул тип SpaceShuttle.

При разработке программ часто прибегают к приведению объекта к другим типам. CLR разрешает привести тип объекта к его собственному типу или любому из его базовых типов. Каждый язык программирования по-своему осуществляет приведение типов. Например, в С# нет специального синтаксиса для приведения типа объекта к его базовому типу, поскольку такое приведение считается безопасным неявным преобразованием. Однако для приведения типа к производному от него типу разработчик на С# должен ввести операцию явного приведения типов — неявное преобразование приведет к ошибке. Вот пример приведения к базовому и производному типам:

// Этот тип неявно наследует типу System.Object

Internal class Employee

{

...

}

Public sealed class Program

{

Public static void Main()

{

/* Приведение типа не требуется, так как new возвращает объект

Employee, a Object - это базовый тип для Employee*/

Object оbj = new Employee();

/* Приведение типа обязательно, так как Employee - производный от Object. В других языках (таких как Visual Basic) компилятор не потребует явного приведения*/

Employee emp = (Employee) оbj;

}

}

 

Этот пример демонстрирует, что необходимо компилятору для компиляции кода. А что произойдет в период выполнения? CLR проверит операции приведения, чтобы преобразования типов осуществлялись либо к фактическому типу объекта, либо к одному из его базовых типов. Вот код, который успешно компилируется, но в период выполнения вызывает исключение InvalidCastException:

Internal class Employee

{

...

}







Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом...

ЧТО И КАК ПИСАЛИ О МОДЕ В ЖУРНАЛАХ НАЧАЛА XX ВЕКА Первый номер журнала «Аполлон» за 1909 г. начинался, по сути, с программного заявления редакции журнала...

ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования...

Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.