|
Класс 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. Это значит, что следующие определения типов идентичны:
Благодаря тому, что все типы в конечном счете являются производными от System.Object, любой объект любого типа гарантированно имеет минимальный набор методов. Открытые экземплярные методы класса System.Object перечислены в табл. 3.1.
Табл. 3.1. Открытые методы System.Object
Кроме того, типы, производные от System.Object, имеют доступ к защищенным методам (см. табл. 3.2). Табл. 3.2. Защищенные методы System.Object
Пример с константой: 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 г. начинался, по сути, с программного заявления редакции журнала... ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования... Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|