Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Название:ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2007
- Город:Москва • Санкт-Петербург • Киев
- ISBN:ISBN 5-8459-1124-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание краткое содержание
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML. Книга содержит множество примеров программного кода, призванного помочь читателю в освоении предлагаемого материала. Программный код примеров можно загрузить с Web-сайта издательства.
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Работа с типами, для которых допустимы значения null
Типы с разрешением принимать значение null могут оказаться исключительно полезными при взаимодействии с базами данных, где столбцы в таблице могут оказаться пустыми (т.е., неопределенными). Для примера рассмотрим следующий класс, моделирующий доступ к базе данных с таблицей, два столбца которой могут оставаться неопределенными. Обратите внимание на то, что здесь метод GetIntFromDatabase() не присваивает значение члену-переменной целочисленного типа с разрешенным значением null, в то время как GetBoolFromDatabase() назначает подходящее значение члену bool?.
Class DatabaseReader {
// Поле данных с разрешением значения null.
public int? numbericValue;
public bool? boolValue = true;
// Обратите внимание на разрешение null для возвращаемого типа.
public int? GetIntFromDatabase() {return numberiсVаlue;}
// Обратите внимание на разрешение null для возвращаемого типа.
public bool? GetBoolFromDatabase() {return boolValue;}
}
Теперь рассмотрим следующий метод Main(), вызывающий члены класса DatabaseReader и демонстрирующий присвоенные им значения с помощью HasValue и Value в соответствии с синтаксисом C#.
static void Main(string[] args) {
Console.WriteLine("***** Забавы с разрешением null *****\n")
DatabaseReader dr = new DatabaseReader();
// Получение int из 'базы данных'.
int? i = dr.GetIntFromDatabase();
if (i.HasValue) Console.WriteLine("Значение 'i' равно: {0}", i);
else Console.WriteLine("Значение 'i' не определено.");
// Получение bool из 'базы данных'.
bool? b = dr.GetBoolFromDatabase();
if (b != null) Console.WriteLine("Значение 'b' равно: {0}", b);
else Console.WriteLine("Значение 'b' не определено.");
Console.ReadLine();
}
Операция ??
Еще одной особенностью типов с разрешением принимать значения null, о которой вам следует знать, является то, что с такими типами можно использовать появившуюся в C# 2005 специальную операцию, обозначаемую знаком ??. Эта операция позволяет присвоить типу значение, если его текущим значением оказывается null. Для примера предположим, что в том случае, когда значение, возвращенное методом GetIntFromDatabase(), оказывается равным null, соответствующему локальному типу int с разрешением значения null нужно присвоить числовое значение 100 (конечно, упомянутый метод всегда возвращает null, но я думаю, вы поймете идею, которую иллюстрирует данный пример).
static void Main(string[] args) {
Console.WriteLine("***** Забавы с разрешением null *****\n");
DatabaseReader dr = new DatabaseReader();
// Если GetIntFromDatabase() возвращает null,
// то локальной переменной присваивается значение 100.
int? myData = dr.GetIntFromDatabase() ?? 100;
Console.WriteLine("Значение myData: {0}", myData);
Console.ReadLine();
}
Исходный код.Проект NullableType размещен в подкаталоге, соответствующем главе 3.
Пользовательские пространства имен
До этого момента мы создавали небольшие тестовые программы, используя пространства имен, существующие в среде .NET (в частности, пространство имен System). Но иногда при создании приложения бывает удобно объединить связанные типы в одном пользовательском пространстве имён. В C# это делается с помощью ключевого слова namespace.
Предположим, что вы создаете коллекцию геометрических классов с названиями Square (квадрат), Circle (круг) и Hexagon (шестиугольник). Учитывая их родство, вы хотите сгруппировать их в общее пространство имен. Здесь вам предлагаются два основных подхода. С одной стороны, можно определить все классы в одном файле (shapeslib.cs), как показано ниже.
// shapeslib.cs
using System;
namespace MyShapes {
// Класс Circle.
class Circle {/* Интересные методы… */}
// Класс Hexagon.
class Hexagon {/* Более интересные методы… */}
// Класс Square.
class Square {/* Еще более интересные методы… */}
}
Заметим, что пространство имен MyShapes играет роль абстрактного "контейнера" указанных типов. Альтернативным вариантом является размещение единого пространства имен в нескольких C#-файлах. Для этого достаточно "завернуть" определения различных классов в одно пространство имен.
// circle.cs
using System;
namespace MyShapes{
// Клаcc Circle.
class Circle{ }
}
// hexagon.cs
using System;
namespace MyShapes{
// Класс Hexagon.
class Hexagon{}
}
// square.cs
using System;
namespace MyShapes{
// Класс Square.
class Square{}
}
Вы уже знаете, что в том случае, когда одному пространству имен требуются объекты из другого пространства имен, следует использовать ключевое слово using.
// Использование типов из пространства имен MyShapes.
using System;
using MyShapes;
namespace MyApp {
class ShapeTester {
static void Main(string[] args) {
Hexagon h = new Hexagon();
Circle с = new Circle();
Square s = new Square();
}
}
}
Абсолютные имена типов
Строго говоря, при объявлении типа, определенного во внешнем пространстве имен, в C# не обязательно использовать ключевое слово using. Можно использовать полное, или абсолютное имя типа, которое, как следует из главы 1, состоит из имени типа с добавленным префиксом пространства имен, определяющего данный тип.
// Заметьте, что здесь не используется 'using MyShapes'.
using System;
namespace MyApp {
class ShapeTester {
static void Main(string[] args) {
MyShapes.Hexagon h = new MyShapes.Hexagon();
MyShapes.Circle с = new MyShapes.Circle();
MyShapes.Square s = new MyShapes.Square();
}
}
}
Обычно нет необходимости использовать полное имя. Это только увеличивает объем ввода с клавиатуры, но не дает никаких преимуществ ни с точки зрения размеров программного кода, ни с точки зрения производительности программы. На самом деле в программном коде CIL типы всегда указываются с полным именем. С этой точки зрения ключевое слово using в C# просто экономит время при наборе программного кода.
Однако абсолютные имена могут быть весьма полезны (а иногда и необходимы) тогда, когда возникают конфликты при использовании пространств имен, содержащих типы с одинаковыми именами. Предположим, что есть еще одно пространство имен My3DShapes, в котором определяются три класса для визуализации пространственных форм.
// Другое пространство форм…
using System;
namespace My3DShapes {
// Трехмерный класс Circle.
class circle{}
// Трехмерный класс Hexagon.
class Hexagon{}
// Трехмерный класс Square.
Интервал:
Закладка: