Динамическое связывание походит на ложь

Хорошо.... Java является на самом деле более портативным. Моно не реализован везде, и это значительно отстает от реализации Microsoft. SDK Java, кажется, остается в лучшей синхронизации через платформы (и это работает над большим количеством платформ).

я также сказал бы, что Java имеет больше доступности инструмента через все те платформы, хотя существует много инструментов, доступных для.NET на платформах Windows.

Обновление на 2014

я все еще держу это мнение в 2014. Однако я квалифицирую это путем высказывания, что я сейчас начинаю обращать некоторое внимание на Моно через длительное время не действительно заботливого, таким образом, могут быть улучшения Моно времени выполнения (или экосистема), что я не был сделан знающий. AFAIK, нет все еще никакой поддержки WPF, WCF, WF, WIF. Моно может работать на iOS, но к моему знанию, Среда выполнения Java все еще работает на намного большем количестве платформ, чем Моно. Кроме того, Моно начинает видеть некоторые очень улучшенные инструменты (Xamarin), и Microsoft, кажется, имеет намного больше межплатформенного вида отношения и готовности работать с партнерами для создания их дополнительными, а не конкурентоспособными (например, Моно будет довольно важная часть предстоящей среды ASP.NET OWIN/Helios). Я подозреваю, что в ближайшие годы различия в мобильности уменьшатся быстро, особенно после открыто получаемой.NET.

Обновление на 2018

Мое представление об этом начинает идти другим путем. Я думаю, что.NET, широко, особенно с.NET Core, начала достигать "четности мобильности" с Java. Существуют усилия в стадии реализации для обеспечения WPF к.NET Core для некоторых платформ, и само.NET Core работает на очень многих платформах теперь. Моно (принадлежавший Xamarin, который теперь принадлежит Microsoft) более зрелый и полируемый продукт чем когда-либо и запись приложений, которые работают над несколькими платформами, больше не домен глубокого gnosis хакерства.NET, но относительно простое усилие. Существуют, конечно, библиотеки и службы и приложения, которые только для Windows или могут только предназначаться для определенных платформ - но то же может быть сказано относительно Java (широко).

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

6
задан Community 23 May 2017 в 11:55
поделиться

3 ответа

Вы путаете среду выполнения и компилятор. У среды выполнения нет проблем с этим. Проблема в том, что точечная нотация (которая является синтаксическим сахаром) требует информации о типе для компилятора, чтобы устранять неоднозначность между объектами Objective-C и структурами C.

Если вы не используете точечную нотацию, она работает:

NSLog( @"%@ : %@\n", [exc name], [exc reason]) ;

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

По сути, проблема заключается в том, что компилятор должен знать, следует ли сгенерировать загрузку структуры или отправку Objective C, другими словами, с точечной нотацией ему необходимо иметь достаточно информации, чтобы определить разницу между объектом и скалярным типом.

17
ответ дан 8 December 2019 в 02:41
поделиться

Динамическое связывание не является синонимом динамической типизации . C - это строго типизированный язык, и, в частности, тип аргумента или возвращаемого значения имеет решающее значение и может значительно повлиять на генерацию кода.

Свойства специально разработаны для устранения двусмысленности. В рамках этого было принято решение не разрешать использование точечного синтаксиса против id .

В частности, это касается этой ситуации:

@interface Foo
- (short) length;
@end

@interface Bar
- (unsigned long long) length;
@end

С учетом вышеизложенного в двух отдельных файлах заголовков компиляция [длина объекта] выдаст предупреждение только о том, что оба файла заголовков были импортированы . Если был импортирован только один файл заголовка, то сайт вызова будет скомпилирован, возвращая тип, указанный в заголовке. Если место вызова было для другого метода, будет возвращен очень неожиданный результат.

Ограничение точечного синтаксиса устраняет эту потенциальную двусмысленность. Это также причина того, что вы не обычно видите ковариантные объявления методов. C ABI просто не поддерживает его чисто (с учетом сказанного, Objective-C плохо справляется с поддержкой ковариантности типов объектов).

На самом деле разработчики Objective-C редко используют id ] тип. Объявления конкретных типов позволяют компилятору значительно улучшить проверку кода.

Objective-C плохо справляется с поддержкой ковариантности типов объектов.

В действительности разработчики Objective-C редко используют тип id . Объявления конкретных типов позволяют компилятору значительно улучшить проверку кода.

Objective-C плохо справляется с поддержкой ковариантности типов объектов.

В действительности разработчики Objective-C редко используют тип id . Объявления конкретных типов позволяют компилятору значительно улучшить проверку кода.

17
ответ дан 8 December 2019 в 02:41
поделиться

Objective-C поддерживает динамическое связывание. Однако вы не можете использовать свойства для объектов типа id, но вы можете отправлять ему любые сообщения, которые захотите. (Вероятно, это ошибка в текущем определении / реализации ... но пока оставим это в стороне.)

Если бы вы сделали

NSLog(@"%@ : %@", [exc name], [exc reason] ); 

, то это сработало бы. Обратите внимание, что вам не нужно помещать новую строку в оператор NSLog, поскольку все они в любом случае находятся на отдельных строках.

0
ответ дан 8 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: