Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.07.10;
Скачать: [xml.tar.bz2];

Вниз

Делегаты, анонимные методы, C#   Найти похожие ветки 

 
Palladin ©   (2011-03-23 19:15) [0]

       private void btnScan_Click(object sender, EventArgs e)
       {
           new Thread(delegate()
           {
               DirectoryInfo di = new DirectoryInfo(@"c:\GtNet\_thread_debug_logs\" + editSessionsList.SelectedItem);
               FileInfo[] files = di.GetFiles("*.txt");
               int linesCount = 0;
               string line;
               this.BeginInvoke(delegate(object sender1, EventArgs e1)
               {
                   lblScanProgress.Maximum = files.Length;
               });


обясните нЕучу, почему в конструкторе Thread эта конструкция срабатывает, а в вызове BeginInvoke вещает
Ошибка 1 Невозможно преобразовать "анонимный метод" к типу "System.Delegate", поскольку он не является делегатом ?
я и параметры убирал, и new писал, и по колесам пинал, и фары протирал...


 
Игорь Шевченко ©   (2011-03-23 19:18) [1]

какой кошмар


 
DiamondShark ©   (2011-03-23 19:34) [2]

private delegate void foo();

this.BeginInvoke((foo) delegate() {...});


 
DiamondShark ©   (2011-03-23 19:38) [3]

Нету неявного преобразования анонимного метода в нетипизированный делегат. Нету.

Почему
int i = 0.0;
ругается?


 
Palladin ©   (2011-03-23 19:43) [4]


> нетипизированный делегат

о, новое словосочетание... кажется вкурил....


 
oxffff ©   (2011-03-24 08:35) [5]


> DiamondShark ©   (23.03.11 19:38) [3]
> Нету неявного преобразования анонимного метода в нетипизированный
> делегат.


Вообще c# static typed поэтому такого понятия как нетипизированный
делегат в нем нет.
Следуют восполнить пробел в знаниях.


 
oxffff ©   (2011-03-24 08:40) [6]


> Palladin ©   (23.03.11 19:43) [4]
>
> > нетипизированный делегат
>
> о, новое словосочетание... кажется вкурил....


Не то вкурил видимо.

Если я правильно понял, что

Control.BeginInvoke Method

method
A delegate to a method that takes no parameters.


 
oxffff ©   (2011-03-24 09:50) [7]

Хотя  для .NET 2.0 сигнатура Control.BeginInvoke  странная.

1.Control.BeginInvoke (Delegate)
2.Control.BeginInvoke (Delegate, Object[])  

Поскольку в 1 случае, можно по сути передать делагат с параметрами и получить грабли при вызове внутри контрола. По Моему брешь.
Почему они так сделали.

   public partial class Form1 : Form
   {
       public delegate void InvokeDelegate(Int32 c);
       public Form1()
       {
           InitializeComponent();
       }

       private void Form1_Load(object sender, EventArgs e)
       {
           InvokeDelegate A = new InvokeDelegate(delegate(Int32 c)
           {
            int a, b;
             a = c;
             b = a;
            });
           BeginInvoke(A);  
       }
   }


 
Romkin ©   (2011-03-24 11:33) [8]


> Игорь Шевченко ©   (23.03.11 19:18) [1]
> какой кошмар

В Delphi ненамного лучше.


 
oxffff ©   (2011-03-24 11:45) [9]

Самое интересное почему объект делегат размещен в куче. :)
Ведь в Delphi это value тип.

2. Поддержка MultiDelegate. Но это следствие 1.
1. НО! Основное это поддержка RTTI.
  Что определить тип делегата (сигнатуру делегата, ...) run-time.


 
DiamondShark ©   (2011-03-24 12:09) [10]


> oxffff ©   (24.03.11 09:50) [7]
> и и получить грабли при вызове внутри контрола.

Всего лишь TargetParameterCountException.


> Почему они так сделали.

По кочану.
Поучи жену щи варить, и расскажи, как надо было сделать?


 
oxffff ©   (2011-03-24 12:40) [11]


> DiamondShark ©   (24.03.11 12:09) [10]
>
> > oxffff ©   (24.03.11 09:50) [7]
> > и и получить грабли при вызове внутри контрола.
>
> Всего лишь TargetParameterCountException.

Точно всего лишь исключение, которого могло бы и не быть.

>
>
> > Почему они так сделали.
>
> По кочану.
> Поучи жену щи варить, и расскажи, как надо было сделать?
>


Так я и рассказал, почему они так сделали.
Я читал об этом в интервью с Андерсом Хейлсбергом или одним из других ключевых разработчиком .NET.
Упоминалась связь с Remoting и сериализацией.


 
DiamondShark ©   (2011-03-24 13:24) [12]


> oxffff ©   (24.03.11 12:40) [11]
> Точно всего лишь исключение, которого могло бы и не быть.

Исключение -- не грабли, а вид диагностики.
Грабли -- это порча фрейма или передача управления по мусорному адресу, молча, разумеется, с отложенным на неопределённое время невоспроизводимым крахом. Обычное дело в неуправляемых языках.


> Так я и рассказал, почему они так сделали.

Где?


> oxffff ©   (24.03.11 11:45) [9]

Фантазии.

Следуют восполнить пробел в знаниях, и узнать, что RTTI поддерживается и для ссылочных типов, и для типов-значений.

А вот, кстати, как получить сигнатуру делегата?

private delegate void MyDelegate(int a, sting b);

public static void Main()
{
PrintDelegateSignature(typeof(MyDelegate));
}

private static void PrintDelegateSignature(Type delegateType)
{
// TODO: print delegate signature to Console
}

Напиши реализацию PrintDelegateSignature.


 
oxffff ©   (2011-03-24 14:32) [13]


> DiamondShark ©   (24.03.11 13:24) [12]
>
> > oxffff ©   (24.03.11 12:40) [11]
> > Точно всего лишь исключение, которого могло бы и не быть.
>
>
> Исключение -- не грабли, а вид диагностики.
> Грабли -- это порча фрейма или передача управления по мусорному
> адресу, молча, разумеется, с отложенным на неопределённое
> время невоспроизводимым крахом. Обычное дело в неуправляемых
> языках.


Это брешь в сигнатуре (читай ошибка типов).  

> Так я и рассказал, почему они так сделали.
>Где?

Выше.


> > oxffff ©   (24.03.11 11:45) [9]
>
> Фантазии.
>
> Следуют восполнить пробел в знаниях, и узнать, что RTTI
> поддерживается и для ссылочных типов, и для типов-значений.
>
>
Так это Вам следуют восполнить пробел в знаниях, и вспомнить что value тип не несет в себе RTTI, а ее несет в себе boxed value type. Следуют внимательнее изучать мат. часть.

Int32 a;
a.GetType();

=>

.entrypoint
 // Code size       16 (0x10)
 .maxstack  1
 .locals init ([0] int32 a)

 ........
 IL_0003:  ldloc.0
 IL_0004:  box        [mscorlib]System.Int32
 IL_0009:  call       instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
 IL_000e:  pop
 IL_000f:  ret

} // end of method Program::Main

> А вот, кстати, как получить сигнатуру делегата?
>
> private delegate void MyDelegate(int a, sting b);
>
> public static void Main()
> {
> PrintDelegateSignature(typeof(MyDelegate));
> }
>
> private static void PrintDelegateSignature(Type delegateType)
> {
> // TODO: print delegate signature to Console
> }
>
> Напиши реализацию PrintDelegateSignature.


А что у самого уже сложности получить сигнатуру метода Invoke или BeginInvoke у объекта-делегата?


 
DiamondShark ©   (2011-03-24 16:32) [14]


> oxffff ©   (24.03.11 14:32) [13]
> Это брешь в сигнатуре (читай ошибка типов).  

Щито?
Чем сигнатура Foo(System.Delegate) принципиально отличается от сигнатуры Bar(MyCoolObject)?
Кто запрещает вызвать Bar(MyCoolObject) с любым наследником MyCoolObject?
Какая брешь? Какая ошибка?


> Выше.

Ты не мудри, ты пальцем покажи, где ты рассказал, почему у Control.BeginInvoke такая сигнатура.


> Так это Вам следуют восполнить пробел в знаниях, и вспомнить
> что value тип не несет в себе RTTI, а ее несет в себе boxed
> value type. Следуют внимательнее изучать мат. часть.

Откуда такая феерическая фантазия? Из того, что ты в IL инструкцию box увидел?
Друг мой, боксинг происходит при вызове любого метода, унаследованного от Object, и не перекрытого в данном value-типе.
Учи матчасть.

Можешь помедитировать над IL-кодом такого оператора:
Type t = typeof(int);
Вернёшься, когда найдёшь там боксинг.


> А что у самого уже сложности получить сигнатуру метода Invoke
> или BeginInvoke у объекта-делегата?

Чо, правда? Вот так просто?
Ну смотри:

public struct Foo
{
public void FooInvoke() {}
}

public class Bar
{
public void BarInvoke() {}
}

MethodInfo miFoo = typeof(Foo).GetMethod("FooInvoke", BindingFlags.Instance | BindingFlags.Public);
MethodInfo miBar = typeof(Bar).GetMethod("BarInvoke", BindingFlags.Instance | BindingFlags.Public);

Почувствуй, как говорится, разницу.
Теперь вопрос: каким образом проблема получения сигнатуры метода может повлиять на выбор struct или class?


 
oxffff ©   (2011-03-24 16:46) [15]


> > Так это Вам следуют восполнить пробел в знаниях, и вспомнить
>
> > что value тип не несет в себе RTTI, а ее несет в себе
> boxed
> > value type. Следуют внимательнее изучать мат. часть.
>
> Откуда такая феерическая фантазия? Из того, что ты в IL
> инструкцию box увидел?
> Друг мой, боксинг происходит при вызове любого метода, унаследованного
> от Object, и не перекрытого в данном value-типе.
> Учи матчасть.


И что опять никаких выводов не делается? Почему это так делается?
А потому, что как раз для этих методов необходима RTTI, которая есть только у объекта кучи, т.е boxed value type. Например GetType


>
> Можешь помедитировать над IL-кодом такого оператора:
> Type t = typeof(int);
> Вернёшься, когда найдёшь там боксинг.


Не съезжай с темы. Поскольку получение typeinfo по token происходит для boxed типа, а не для value типа. Это скрыто от тебя.


 
oxffff ©   (2011-03-24 16:49) [16]


> DiamondShark ©   (24.03.11 16:32) [14]
>
> > oxffff ©   (24.03.11 14:32) [13]
> > Это брешь в сигнатуре (читай ошибка типов).  
>
> Щито?
> Чем сигнатура Foo(System.Delegate) принципиально отличается
> от сигнатуры Bar(MyCoolObject)?
> Кто запрещает вызвать Bar(MyCoolObject) с любым наследником
> MyCoolObject?
> Какая брешь? Какая ошибка?


Для случая, когда

Abc(obj:Tcontrol)
begin
(obj as TForm).stuff()
end

следуют написать

Abc(obj:TForm)
begin
obj... .stuff()
end

> Выше.
>Ты не мудри, ты пальцем покажи, где ты рассказал, почему у >Control.BeginInvoke такая сигнатура.

Чего? MSDN в руки.


 
oxffff ©   (2011-03-24 17:01) [17]


> > А что у самого уже сложности получить сигнатуру метода
> Invoke
> > или BeginInvoke у объекта-делегата?
>
> Чо, правда? Вот так просто?
> Ну смотри:
>
> public struct Foo
> {
> public void FooInvoke() {}
> }
>
> public class Bar
> {
> public void BarInvoke() {}
> }
>
> MethodInfo miFoo = typeof(Foo).GetMethod("FooInvoke", BindingFlags.
> Instance | BindingFlags.Public);
> MethodInfo miBar = typeof(Bar).GetMethod("BarInvoke", BindingFlags.
> Instance | BindingFlags.Public);
>
> Почувствуй, как говорится, разницу.
> Теперь вопрос: каким образом проблема получения сигнатуры
> метода может повлиять на выбор struct или class?


Что реально сложности с пониманием?

1. У структуры нет RTTI. Есть только у boxed value
2. Если бы делегаты хранились в структуре, то пришлось бы делать совместимыми структры по присваиванию, т.е.

public struct StructDelegate
{
}

public struct Foo:StructDelegate
{
public void FooInvoke(int aa) {}
}

StructDelegate A;
Foo B;

Type Type1;
Type Type2

Type1=typeinfo(A);
A=B; <= в этом месте информация теряется, точнее не используется
Type2=typeinfo(A);

поскольку Type1=Type2, и не равно typeinfo(Foo);

А ето значит, что она не содержит в себе  RTTI.
Учи мат. часть.


 
DiamondShark ©   (2011-03-24 18:16) [18]


> oxffff ©   (24.03.11 16:46) [15]
> И что опять никаких выводов не делается? Почему это так
> делается?

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

Это делается потому что методам, унаследованным от Object, требуется параметр this типа Object. Всё остальное -- твои больные фантазии.


> А потому, что как раз для этих методов необходима RTTI,
> которая есть только у объекта кучи, т.е boxed value type.
>  Например GetType

Ты, почему-то, думаешь, что методы класса Object (например GetType)-- это какие-то особые магические методы.
Но компилятор с тобой не согласен.
Например, результат вызова GetType для переменной типа-значения является статически определимым, и компилятор мог бы заменять вызов a.GetType() на typeof(int) (можешь проверить, что эти вызовы возвращают одини и тот же экземпляр Type), если бы он обладал сакральным знанием. Но он генериреут обычный вызов, с боксингом, чтобы метод получил привычный параметр this типа Object. Почему компилятор не делает такую очевидную оптимизацию? Да потому что он болт клал на сакральный смысл метода GetType, для него это обычный метод.


> Не съезжай с темы. Поскольку получение typeinfo по token
> происходит для boxed типа, а не для value типа. Это скрыто
> от тебя.

Иди в горы.
Получение typeinfo по token происходит по token. Всё.
Там, где токен статически определим (выражения, вроде typeof(int)), там прописывается константа токена.
Никакого боксинга, чтобы получить typeinfo, не надо.
Боксинг при вызове методов, вроде GetType, происходит от того, что для компилятора это самый обычный метод.

Всё остальное (вроде неизвестного науке термина "boxed тип") -- твои больные фантазии.
Иди кури матчасть.


 
DiamondShark ©   (2011-03-24 18:28) [19]


> 1. У структуры нет RTTI. Есть только у boxed value

Иди в пень. RTTI есть у типа, а не у значения. У значения может быть только ссылка на RTTI. Или не быть, если ссылка на RTTI является статитчески определимой, как у структур.


> 2. Если бы делегаты хранились в структуре, то пришлось бы
> делать совместимыми структры по присваиванию, т.е.

С чего это вдруг "пришлось бы"?
Нафига она им сдалась?

Вот сейчас у них есть совместимость с System.Delegate и то, только в одну сторону. Так ты говоришь, что это грабли. А было бы всё строго типизировано, и не было бы граблей.


 
oxffff ©   (2011-03-24 18:28) [20]


> DiamondShark ©   (24.03.11 18:16) [18]


Ты суть улавливаешь, или просто говоришь, то что сам знаешь и знают другие?
Да компилятор делает так как ты написал [18].
А устройство value и object тебе наверно тоже известно.

Поэтому мне не понятно, зачем описывать всем известные вещи, когда речь идет о том, что в работе GetType (Читай внутри метода) или ToString используется RTTI Boxed Value type, поскольку у value type ee нет.
И понимай это только в том смысле, что она не хранится в экземпляре этого типе, т.е. нету никаких байтиков типа управляемый указатель и token типа в value типе.


 
oxffff ©   (2011-03-24 18:30) [21]


> DiamondShark ©   (24.03.11 18:28) [19]
>
> > 1. У структуры нет RTTI. Есть только у boxed value
>
> Иди в пень. RTTI есть у типа, а не у значения. У значения
> может быть только ссылка на RTTI. Или не быть, если ссылка
> на RTTI является статитчески определимой, как у структур.
>
>
>
> > 2. Если бы делегаты хранились в структуре, то пришлось
> бы
> > делать совместимыми структры по присваиванию, т.е.
>
> С чего это вдруг "пришлось бы"?
> Нафига она им сдалась?
>
> Вот сейчас у них есть совместимость с System.Delegate и
> то, только в одну сторону. Так ты говоришь, что это грабли.
>  А было бы всё строго типизировано, и не было бы граблей.
>


Пример видел?
Опять не понял?
иди Читай мат. часть.


 
DiamondShark ©   (2011-03-24 18:48) [22]


> oxffff ©   (24.03.11 18:30) [21]
> Пример видел?

Пример с наследуемыми и совместимыми по присваиванию структурами?
Видел.
У меня к тебе вопрос, нет, даже два вопроса.
1. Какое отношение твой пример имеет к вопросу "нафига структурам совместимость по присваиванию"?
2. Ты пьян?


 
DiamondShark ©   (2011-03-24 18:57) [23]


> oxffff ©   (24.03.11 18:28) [20]
> Ты суть улавливаешь, или просто говоришь, то что сам знаешь и знают другие?

Суть такова: домики деревянные набигают^W^W^W ты не понимаешь значения используемых терминов, плохо владеешь предметной областью и вообще русским языком. И по этой причине несёшь чушь собачью. А, поскольку, всё это сопровождается непомерным гонором, то выглядишь просто клоуном.

Вот такова суть. Улавливаешь?


 
oxffff ©   (2011-03-25 08:45) [24]


> DiamondShark ©   (24.03.11 18:57) [23]
>
> > oxffff ©   (24.03.11 18:28) [20]
> > Ты суть улавливаешь, или просто говоришь, то что сам знаешь
> и знают другие?
>
> Суть такова: домики деревянные набигают^W^W^W ты не понимаешь
> значения используемых терминов, плохо владеешь предметной
> областью и вообще русским языком. И по этой причине несёшь
> чушь собачью. А, поскольку, всё это сопровождается непомерным
> гонором, то выглядишь просто клоуном.
>
> Вот такова суть. Улавливаешь?


То есть ты считаешь, что тебя в каком-то из постов унизили и оскорбили?
У тебя что низкая самооценка?


 
Думкин ©   (2011-03-25 09:12) [25]

Надо подраться клавиатурами, а то как-то вяло.


 
oxffff ©   (2011-03-25 09:26) [26]


> DiamondShark ©   (24.03.11 18:48) [22]
>
> > oxffff ©   (24.03.11 18:30) [21]
> > Пример видел?
>
> Пример с наследуемыми и совместимыми по присваиванию структурами?
>
> Видел.
> У меня к тебе вопрос, нет, даже два вопроса.
> 1. Какое отношение твой пример имеет к вопросу "нафига структурам
> совместимость по присваиванию"?
> 2. Ты пьян?


Пример имеет очень простое назначения. А именно

Рассмотрим твое предложение об использовании в качестве делегата структур. Тогда для их полноченной работы необходимо следующее

Пусть есть базовая структура по аналогии с Delphi

TMethod = record
Code, Data: Pointer;
end;

Тогда для сигнатуры аналога delphi
ProcOneParameter=procedure (a:integer) of object

создается делегат вида

TProcOneParameterMethod=record(TMethod)
procedure Invoke(a:integer);
end;

Рассмотрим случай, когда есть структура содержащая делегат.
Например

TStuffRecord=record
...
ProcOneParameterMethod:TProcOneParameterMethod;
...
end;

Действительно получив RTTI от TStuffRecord мы может его сериализовать посколько тип делегата конкретен. Мы также можем динамически (run-time) присвоить этому полю значение или использовать сам делегат поскольку может сделать проверку используя RTTI от TStuffRecord. И таким образом получить тип делегата.

Рассмотрим более сложный пример, учитывая совместимость по присваиванию TMethod=TProcOneParameterMethod, поскольку TProcOneParameterMethod является конкретным делегатом, а не абстрактным.

TStuffRecordEx=record
...
Method:TMethod
...
end;

Здесь получив RTTI от TStuffRecord мы скорее всего можем его сериализовать.
А вот с использованием полная сложность.
Поскольку ничего о том, что хранится в Method мы не знаем, а значит ни вызвать, не передать в качестве remoting мы не можем поскольку информация отсутствует( о количестве параметров способе вызове и возвращаемых значениях). То есть после присваивания TMethod=TProcOneParameterMethod информация о вызове теряется поскольку не содержится в структурах, которые ты предлагаешь использовать в качестве делегатов.


 
oxffff ©   (2011-03-25 09:32) [27]


> oxffff ©   (25.03.11 09:26) [26]


Это все означает, что делегат является типобезопасным аналогом небезопасного указателя на метод, поскольку содержит в себе информацию, которая может быть использована run-time для динамических операций вызова.


 
oxffff ©   (2011-03-25 09:45) [28]


> oxffff ©   (25.03.11 09:32) [27]
>
> > oxffff ©   (25.03.11 09:26) [26]
>
>
> Это все означает, что делегат является типобезопасным аналогом
> небезопасного указателя на метод, поскольку содержит в себе
> информацию, которая может быть использована run-time для
> динамических операций вызова.


Естественно при реализации делегата как managed heap object,
а не структуры.


 
DiamondShark ©   (2011-03-25 11:36) [29]


> oxffff ©   (25.03.11 09:26) [26]

Опять бредишь.


> Рассмотрим твое предложение об использовании в качестве
> делегата структур.

Можно ссылку на моё предложение?

Рассматривается твоё утверждение, что делегаты реализованы как ссылочные объекты, потому что [далее по тексту 9].
У тебя проблемы с русским языком, памятью и логикой.


> Пусть есть базовая структура по аналогии с Delphi

А почему не по аналогии с Фортраном, или Перлом? Или макроассемблером БЭСМ-6?

Пусть есть базовая структура по аналогии с НЕТ
struct Delegate
{
MethodInfo Method;
Object Target;
}


> Рассмотрим более сложный пример, учитывая совместимость
> по присваиванию TMethod=TProcOneParameterMethod,

Такие присваиваивания запрещены. Нафиг мне их рассматривать?

Я ещё раз спрашиваю:
Зачем ты суёшь мне свой "пример" на несуществующем языке для несуществующей среды исполнения?
Голоса нашептали? С русским языком проблемы?


 
oxffff ©   (2011-03-25 12:15) [30]


> > Рассмотрим твое предложение об использовании в качестве
>
> > делегата структур.
>
> Можно ссылку на моё предложение?


[14] и последнее предложение [14].


> > Пусть есть базовая структура по аналогии с Delphi
> Пусть есть базовая структура по аналогии с НЕТ
> struct Delegate
> {
> MethodInfo Method;
> Object Target;
> }


1. А где сам указатель на код?
2. MethodInfo является вычисляемым.


> > Рассмотрим более сложный пример, учитывая совместимость
>
> > по присваиванию TMethod=TProcOneParameterMethod,
>
> Такие присваиваивания запрещены. Нафиг мне их рассматривать?
>
>


С каких таких запрещены?

Delegate DelegateAA;
MyDelegate MyDelegateBB;
DelegateAA = MyDelegateBB;

> Я ещё раз спрашиваю:
> Зачем ты суёшь мне свой "пример" на несуществующем языке

Так ты же пытаешься показать что разницы между выбором структуры или объекта нет для получения информации о типе метода. А я тебе показываю, что есть.  


> для несуществующей среды исполнения?
> Голоса нашептали? С русским языком проблемы?


Не волнуйся ты так.


 
DiamondShark ©   (2011-03-25 13:10) [31]


> oxffff ©   (25.03.11 12:15) [30]


> [14] и последнее предложение [14].

Убей свою учительницу русского языка.


> 1. А где сам указатель на код?

Анах он нужен?


> 2. MethodInfo является вычисляемым.

Где?


> С каких таких запрещены?

Учи матчасть.


> Так ты же пытаешься показать что разницы между выбором структуры
> или объекта нет для получения информации о типе метода.

Не пытаюсь, а показал.

MethodInfo miFoo = typeof(Foo).GetMethod("FooInvoke", BindingFlags.Instance | BindingFlags.Public);
MethodInfo miBar = typeof(Bar).GetMethod("BarInvoke", BindingFlags.Instance | BindingFlags.Public);

Foo -- структура, Bar -- класс.
Найди разницу.


> А я тебе показываю, что есть.  

Ты показываешь огрызки на несуществующем языке, с на ходу выдуманными правилами. Тем самым, какбэ намекая, что не знаешь русского языка, матчасти и логики.


> Не волнуйся ты так.

Да я просто развлекаюсь. Такие персонажи редко попадаются.


 
oxffff ©   (2011-03-25 14:24) [32]


> DiamondShark ©   (25.03.11 13:10) [31]
>
> > oxffff ©   (25.03.11 12:15) [30]
> > 1. А где сам указатель на код?
>
> Анах он нужен?
>

А оптимизация?


>
> > 2. MethodInfo является вычисляемым.
>
> Где?

В .NET.



> > С каких таких запрещены?
>
> Учи матчасть.


Слушай я привел тебе код на С#, который успешно компилируется. Выше был пример для Control.BeginInvoke.
У тебя явно с мат. частью сложности.


> > Так ты же пытаешься показать что разницы между выбором
> структуры
> > или объекта нет для получения информации о типе метода.
>  
>
> Не пытаюсь, а показал.
>
> MethodInfo miFoo = typeof(Foo).GetMethod("FooInvoke", BindingFlags.
> Instance | BindingFlags.Public);
> MethodInfo miBar = typeof(Bar).GetMethod("BarInvoke", BindingFlags.
> Instance | BindingFlags.Public);
>
> Foo -- структура, Bar -- класс.
> Найди разницу.


Привожу твои слова дословно

>Почувствуй, как говорится, разницу.
>Теперь вопрос: каким образом проблема получения сигнатуры метода >может повлиять на выбор struct или class?

Далее я тебя привожу пример с возможостью присвоения базовому классу делегата, которое допустимо в С#, и вызывает потерю информации при представлении делегатов как структур. У тебя все нормально?


> > А я тебе показываю, что есть.  
>
> Ты показываешь огрызки на несуществующем языке, с на ходу
> выдуманными правилами. Тем самым, какбэ намекая, что не
> знаешь русского языка, матчасти и логики.


Какбэ, это C#. И намекаю, что у тебя сложности с пониманием материала.


> > Не волнуйся ты так.
>
> Да я просто развлекаюсь. Такие персонажи редко попадаются.
>


Ты троль?


 
DiamondShark ©   (2011-03-25 16:15) [33]

Удалено модератором
Примечание: Выражения выбираем, не в пивной


 
Palladin ©   (2011-03-25 18:07) [34]


> oxffff ©   (24.03.11 08:40) [6]
> Не то вкурил видимо.


Я вкурил то, что у Thread в конструкторе указывается конкретный делегат, определенный в Thread, а в BeginInvoke не понятно какой, до которого я не смог достучатья ни в исходниках, ни в справке, и мне не понятна было невоспроизводимость "как у Thread", словосочетание "нетипизированный делегат" поставило все на свои места. Я принял к сведению их существование. И существание конкретных делегатов.

Если есть более подробная информация почему же нельзя "как Thread", расскажи.


 
Palladin ©   (2011-03-25 18:08) [35]

Извиняюсь, "конкретный делегат", читать как "конкретный тип делегата".


 
DiamondShark ©   (2011-03-25 19:29) [36]


> Palladin ©   (25.03.11 18:07) [34]

Тут некоторые любят придираться к неканонiчнымъ терминам, поэтому, думаю, надо всё-таки поянить, что там происходит.

1. Компилятор компилирует тело анонимного метода.
Метод помещается либо в текущий класс, если нет замыканий, либо создаётся новый вложенный класс, и метод помещается в него, если замыкания есть.

2. Теперь компилятор должен сделать со ссылкой на метод что-то подходящее по месту. В контексте подходит только одна операция: заворачивание в какой-либо подходящий делегат.

3. Теперь компилятор должен сгенерировать вызов конструктора для создания экземпляра делегата. Вот тут и встаёт вопрос: а экземпляр какого типа создавать? Включается механизм вывода типов.
В случае Thread тип параметра ThreadStart, это хороший, годный тип. Компилятору остаётся только проверить совпадение сигнатур ThreadStart и только что сгенерированного анонимного метода.
В случае BeginInvoke тип параметра System.Delegate. Это вообще абстрактный тип, экземпляры этого типа создавать нельзя, а больше никаких вариантов вывод типа придумать не может.

Вот компилятор и сообщает: "Не могу выполнить п. 2., потому что выведенный в п. 3. тип недостаточно кошерен".


 
oxffff ©   (2011-03-25 22:38) [37]


>DiamondShark ©   (25.03.11 19:29) [36]
> Включается механизм вывода типов.


Ну ведь опять не понимаешь и не краснеешь.

Механизм вывода типов здесь не применяется.
Ты наверно хотел сказать явное и неявное приведение?

You can call a generic procedure without supplying any type arguments at all.
If you call it this way, the compiler attempts to determine the appropriate data types to pass to the procedure"s type arguments. This is called type inference.

Учи мат. часть.


 
oxffff ©   (2011-03-25 22:45) [38]


> DiamondShark ©  


Без обид. :)


 
Иксик ©   (2011-03-26 21:10) [39]

Я вас люблю! Такая классная схватка двух ботаников! :)))

Шутка! Это я дразнюсь. Ээээ.... (высовывает язык)



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2011.07.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.004 c
11-1235124028
BMouradov
2009-02-20 13:00
2011.07.10
Вопрос по PStrListEx


15-1298116193
И. Павел
2011-02-19 14:49
2011.07.10
Упрощение установки Delphi на новый компьютер


15-1300948857
brother
2011-03-24 09:40
2011.07.10
Эмулировать поведение курсора


2-1301672845
istok
2011-04-01 19:47
2011.07.10
TidTransaction


4-1248621510
Nikfel
2009-07-26 19:18
2011.07.10
Как перекрасить меню полностью





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский