Net framework 5, а также среды Visual Studio 2012 и C#



Download 6,27 Mb.
Pdf ko'rish
bet130/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   126   127   128   129   130   131   132   133   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C


Глава.5 .Примитивные,.ссылочные.и.значимые.типы
// Находим метод, который подходит по типам аргументов
Type[] argTypes = newType[] { arg.GetType() };
MethodInfo method = target.GetType().GetMethod("Contains", argTypes);
// Вызываем метод с желаемым аргументом
Object[] arguments = newObject[] { arg };
Boolean result = Convert.ToBoolean(method.Invoke(target, arguments));
Если использовать тип C# 
dynamic
, этот код можно значительно улучшить 
с точки зрения синтаксиса.
dynamic target = "Jeffrey Richter";
dynamic arg = "ff";
Boolean result = target.Contains(arg);
Ранее я уже говорил о том, что компилятор C# на этапе выполнения про-
граммы генерирует код полезной нагрузки, основываясь на действительных 
типах объекта. Этот код полезной нагрузки использует класс, известный как 
компоновщик
(runtime binder). Различные языки программирования определя-
ют собственных компоновщиков, инкапсулируя в них правила языка. Код для 
компоновщика C# находится в сборке 
Microsoft.CSharp.dll
, поэтому ссылка на 
эту сборку должна включаться в любой проект, использующий ключевое слово 
dynamic
. Эта сборка ссылается на файл параметров по умолчанию, 
CSC rsp
. Код 
из этой сборки знает, что при применении оператора 
+
применяется к двум объ-
ектам типа 
Int32
следует генерировать код сложения, а для двух объектов типа 
String
— код конкатенации.
Во время выполнения сборка 
Microsoft CSharp dll
должна быть загружена в до-
мен приложений, что снизит производительность приложения и повысит расход 
памяти. Кроме того, сборка 
Microsoft SCharp dll
загружает библиотеки
.System dll
и 
System Core dll
. А если вы используете тип 
dynamic
для связи с COM-объектами, 
загружается и библиотека 
System Dynamic dll
. И когда будет выполнен код полезной 
нагрузки, генерирующий динамический код во время выполнения, этот код окажется 
в сборке, названной 
анонимной
сборкой динамических методов
(Anonymously Hosted 
Dynamic Methods Assembly). Назначение этого кода заключается в повышении 
производительности динамических ссылок в ситуациях, в которых конкретное 
место вызова (call site) выдает много вызовов с динамическими аргументами, со-
ответствующих одному типу на этапе выполнения.
Из-за всех издержек, связанных с особенностями встроенных динамических вы-
числений в C#, вы должны осознанно решить, что именно вы желаете добиться от 
динамического кода: превосходной производительности приложения при загрузке 
всех этих сборок или оптимального расходования памяти. Если динамический код 
используется только в паре мест вашего программного кода, разумнее придержи-
ваться старого подхода: либо вызывать методы отражения (для управляемых объ-
ектов), либо «вручную» приводить типы (для COM-объектов).
Во время выполнения компоновщик С# разрешает динамические операции 
в соответствии с типом объекта. Сначала компоновщик проверяет, реализуется 


183
Примитивный.тип.данных.dynamic
ли типом интерфейс 
IDynamicMetObjectProvider
. И если интерфейс реализо-
ван, вызывается метод 
GetMetaObject
, который возвращает тип, производный 
от 
DynamicMetaObject
. Этот тип может обработать все привязки членов, методов 
и операторов, связанные с объектом. Интерфейс 
IDynamicMetaObjectProvider
и основной класс 
DynamicMetaObject
определены в пространстве имен 
System.
Dynamic
и находятся в сборке 
System Core dll
.
Динамические языки, такие как Python и Ruby, используют типы, производные 
от 
DynamicMetaObject
, что позволяет взаимодействовать с ними из других язы-
ков (например, C#). Аналогичным образом компоновщик C# при связи с COM-
компонентами будет использовать порожденный тип 
DynamicMetaObject
, умеющий 
взаимодействовать с COM-компонентами. Порожденный тип 
DynamicMetaObject
определен в сборке 
System Dynamic dll
.
Если тип объекта, используемый в динамическом выражении, не реализует 
интерфейс 
IDynamicMetaObjectProvider
, тогда компилятор C# воспринимает его 
как обычный объект типа языка C# и все связанные с ним действия осуществляет 
через отражение.
Одно из ограничений динамических типов заключается в том, что они могут 
использоваться только для обращения к членам экземпляров, потому что дина-
мическая переменная должна ссылаться на объект. Однако в некоторых случаях 
бывает полезно динамически вызывать статические методы типа, определяемого 
во время выполнения. Для этого я создал класс 
StaticMemberDynamicWrapper

производный от класса 
System.Dynamic.DynamicObject
, реализующего интерфейс 
IDynamicMetaObjectProvider
. Во внутренней реализации этого класса активно 
используется отражение (см. главу 23). Ниже приведен код моего класса 
Static-
MemberDynamicWrapper
.
internal sealed class StaticMemberDynamicWrapper : DynamicObject {
private readonly TypeInfo m_type;
public StaticMemberDynamicWrapper(Type type) { m_type = type.GetTypeInfo(); }
public override IEnumerable GetDynamicMemberNames() {
return m_type.DeclaredMembers.Select(mi => mi.Name);
}
public override Boolean TryGetMember(GetMemberBinder binder, out object result) 
{
result = null;
var field = FindField(binder.Name);
if (field != null) { result = field.GetValue(null); return true; }
var prop = FindProperty(binder.Name, true);
if (prop != null) { result = prop.GetValue(null, null); return true; }
return false;
}
public override Boolean TrySetMember(SetMemberBinder binder, object value) {
var field = FindField(binder.Name);
продолжение



184
Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   126   127   128   129   130   131   132   133   ...   658




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish