Строки.
Конечно, неизменяемые строки могут передаваться между системами
типов WinRT и CLR. Тем не менее система типов WinRT не разрешает строкам при-
нимать значение
null
. Если передать
null
в строковом параметре функции WinRT
API, CLR обнаруживает этот факт и выдает исключение
ArgumentNullException
;
вместо
null
для передачи пустой строки функциям WinRT API следует использо-
вать
String.Empty
. Строки передаются по ссылке; возвращение строк функциями
WinRT API всегда сопровождается их копированием. При передаче или получении
строковых массивов CLR (
String
[]) от функций WinRT API создается копия мас-
сива, которая передается или возвращается на сторону вызова.
Дата и время.
Структура WinRT
Windows.Foundation.DateTime
представля-
ет дату/время в формате UTC. CLR проецирует структуру WinRT
DateTime
на
структуру .NET Framework
System.DateTimeOffset
, которую следует использо-
вать вместо структуры .NET Framework
System.DateTime
. В итоговом экземпляре
DateTimeOffset
CLR преобразует дату и время UTC, возвращаемые WinRT, в ло-
кальное время. CLR передает функциям WinRT API структуру
DateTimeOffet
с временем UTC.
URI.
CLR проецирует тип WinRT
Windows.Foundation.Uri
на тип .NET
Framework
System.Uri
. Если при передаче типа .NET Framework
Uri
функции
WinRT API используется относительный URI-адрес, среда CLR выдает исключение
ArgumentException
; WinRT поддерживает только абсолютные URI. Переход через
границы взаимодействий всегда сопровождается копированием URI.
IClosable/IDisposable
CLR проецирует интерфейс
WinRT Windows.Foundation.
IClosable
(состоящий из единственного метода
Close
) на интерфейс .NET
Framework
System.IDisposable
(содержащий метод
Dispose
). Следует учесть,
что все функции WinRT API, выполняющие операции ввода-вывода, реализованы
асинхронно. Так как метод интерфейса
IClosable
называется
Close
, а не
CloseAsync
,
метод
Close
не должен выполнять никакие операции ввода-вывода. В этом он се-
мантически отличается от типичного поведения
Dispose
в .NET Framework. Для
типов, реализованных в .NET Framework, метод
Dispose
может выполнять операции
ввода-вывода; более того, часто он обеспечивает запись буферизованных данных
перед фактическим закрытием устройства. Но когда код C# вызывает
Dispose
для
типа WinRT, операции ввода-вывода (в частности, запись буферизованных данных)
выполняться не будут, что может привести к возможной потере данных. Вы должны
учитывать это обстоятельство и явно вызывать методы, предотвращающие потерю
704
Do'stlaringiz bilan baham: |