Это потенциальная проблема, НО ...
Ваш персонаж может также зависнуть в середине вашей программы на C ++, пока ОС извлекает страницу памяти с перегруженного жесткого диска. Если вы не используете ОС реального времени на оборудовании, предназначенном для обеспечения конкретных гарантий производительности, вам никогда не гарантируется производительность.
Чтобы получить более конкретный ответ, вам нужно спросить о конкретной реализации конкретной виртуальной машины. Вы можете использовать виртуальную машину со сборщиком мусора для систем реального времени, если она обеспечивает подходящие гарантии производительности для сборки мусора.
VB и C # по-разному интерпретируют, что означает «защищенный».
Вот объяснение , скопированное ниже:
Конструктор по умолчанию для WebControl защищен.
VB и C # имеют разные интерпретации того, что «защищено» означает.
В VB вы можете получить доступ к защищенному член класса из любого метода в любой тип, производный от класса.
То есть VB позволяет этому коду компилировать:
class Base защищенный m_x как целое число конец класса класс Derived1 наследует базу public sub Foo (другой как Base) другой.m_x = 2 конец суб конец класса класс Derived2 наследует базу конец класса
Поскольку "Derived1" является базой, он может доступ к защищенным членам "других", который также является базовым.
C # придерживается другой точки зрения. Это не допускает "бокового" доступа что делает VB. В нем говорится, что доступ к защищенные члены могут быть сделаны через "это" или любой объект того же типа как класс, содержащий метод.
Поскольку "Foo" здесь определено в "Derived1", C # разрешает только "Foo" для доступа к членам "Базы" из Экземпляр "Derived1". Это возможно для "другое" быть чем-то, что не является "Derived1" (например, это может быть a "Derived2"), поэтому он не разрешить доступ к "m_x".
Как упоминал Крис Данауэй, VB.NET имеет модули, которые позволяют вам определять функции и данные.
VB.NET имеет синтаксис VB6 для связывания с методами в библиотеках DLL. Например:
Declare SetSuspendState Lib "powrprof" As Function (byval hibernate as Int32, byval forceCritical as Int32, byval disableWakeEvent) as Int32
(Хотя это фактическое объявление, возможно, должно быть маршалировано)
В C # вы должны назначить свою переменную, прежде чем сможете ее использовать. Я думаю, вы можете отключить это, но это поведение по умолчанию.
Примерно так:
int something;
if (something == 10)
{ ... }
Не разрешено, но эквивалент VB будет.
Точка с запятой, которая заканчивается каждой строкой в C #, запрещена в VB, и это всегда вызывает у меня улыбку, когда я пытаюсь вернуться в VB.Net ...
Новые автосвойства в C # еще не реализованы для VB.NET.
VB имеет необязательные параметры для функций.
C # получит их только с C # 4.0
Одно из моих любимых (и обломков)
В VB.Net вы можете использовать оператор switch / case как таковой:
Select Case True
Case User.Name = "Joe" And User.Role = "BigWig" And SecretTime = "HackerTime"
GrantCredentials()
End Select
который позволяет вам оценивать некоторые сложные оценки с помощью переключателя вместо множества блоков if / else. Вы не можете сделать это на C #.
Ключевое слово volatile доступно только в C # http://www.devcity.net/Articles/160/5/article.aspx
Вне всяких сомнений (до 4.0):
"Возможности" языка VB не поддерживаются в C #:
Я уверен, что есть еще кое-что. На ваш вопрос можно получить более точные ответы, если вы попросите конкретные примеры того, где каждый язык выделяется. VB в настоящее время лучше, чем C #, при взаимодействии с COM. Это связано с тем, что COM - гораздо меньше головной боли, когда доступны дополнительные параметры и когда вам не нужно выполнять привязку к (часто неизвестному типу) во время компиляции.
C #, с другой стороны, предпочтительнее для многих, когда писать сложную логику из-за ее безопасности типов (в которой нельзя обойти статическую типизацию) и ее краткости.
В конце концов, языки в основном эквивалентны, поскольку они различаются только по краям. Функционально они одинаково способны.
РЕДАКТИРОВАТЬ
Для ясности, я не имею в виду, что VB не допускает статическую типизацию ... просто то, что C # не поддерживает [пока] позволяют обойти статический ввод . Это делает C # более привлекательным кандидатом для определенных типов архитектур. В спецификации языка C # 4.0 вы можете обойти статическую типизацию, но вы делаете это, определяя блок динамического кода, а не объявляя весь файл «не строгим», что делает его более целенаправленным и целенаправленным.
В январе 2008 года в журнале Visual Studio было несколько полезных статей.
Индексированные свойства разрешены в VB.NET, но не в C #
Private m_MyItems As New Collection(Of String)
Public Property MyItems(ByVal index As Integer) As String
Get
Return m_MyItems.Item(index)
End Get
Set(ByVal value As String)
m_MyItems.Item(index) = value
End Set
End Property
VB разрешает невиртуальные вызовы методов виртуального экземпляра ( call
в IL), тогда как C # разрешает только виртуальные вызовы ( callvirt
в IL). Рассмотрим следующий код:
В VB вы можете реализовать интерфейс с помощью метода любого имени - то есть метод «Class.A» может реализовать метод интерфейса «Interface.B».
В C # вы бы Для этого необходимо ввести дополнительный уровень косвенности - явную реализацию интерфейса, которая вызывает «Class.A».
Это особенно заметно, когда вы хотите, чтобы «Class.A» был защищенный
и / или виртуальный
(явные реализации интерфейса не являются ни тем, ни другим); если бы он был просто «частным», вы бы, вероятно, просто оставили его как явную реализацию интерфейса.
C #:
interface IFoo {
void B();
}
class Foo : IFoo {
void IFoo.B() {A();} // <==== extra method here
protected virtual void A() {}
}
VB:
Interface IFoo
Sub B()
End Interface
Class Foo
Implements IFoo
Protected Overridable Sub A() Implements IFoo.B
End Sub
End Class
В IL VB выполняет это сопоставление напрямую (что нормально; это не необходимо, чтобы реализующий метод имел общее имя).
Компилятор VB 9.0 автоматически переводит буквальный XML в синтаксис «функциональной конструкции». Компилятор C # не поддерживает этот красивый буквальный синтаксис XML.
Обрабатывает ключевые слова и WithEvents для автоматического подключения обработчиков событий.
Private Sub btnOKClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOK.Click
End Sub
Я удивлен, что небезопасный код C # еще не упоминался. Это запрещено в VB.NET.
VB.NET поддерживает фильтры исключений CIL, а C # нет:
Try
...
Catch ex As SomeException When ex.SomeProperty = 1
...
End Try
В C # вы можете объявить свойство в интерфейсе как имеющее 'get', а затем реализовать его в классе с помощью get и set.
public interface IFoo {
string Bar {get;}
}
public class Foo : IFoo {
public string Bar {get; set;}
}
В VB эквивалентом объявления свойства с помощью get было бы объявление его ReadOnly. Тогда вы не сможете сделать реализацию доступной для записи.
Public Interface IFoo
ReadOnly Property Bar() As String
End Interface
Public Class Foo
Implements IFoo
Public Property Bar() As String Implements IFoo.Bar 'Compile error here'
End Class
Я считаю, что это серьезное ограничение VB. Довольно часто я хочу определить интерфейс, который позволяет другому коду только читать свойство, но мне нужен общедоступный установщик в реализованном классе для использования персистором.
Я думаю, что вы имеете в виду:
Child aChild = aParent;
Вы сделали Не указать, что Athild
имеет тип ребенка
.
Ссылка на Child
Тип будет означать, что вы можете позвонить в него членам, которые могут не существовать в родительском
. Итак, если вы назначаете родитель
, объект Child
, вы сможете позвонить членам, которые не существуют на родительском составе
.
Одним из пропущенных или просто неправильно понятых функций языка VB - это вызывает функцию, которая имеет BYREF
параметра. Большинство языков поддерживают только один метод передачи параметров посредством ссылки: это сценарии, непосредственно поддерживаемые CLR.
CLR имеет много ограничений на тип значений, которые он поддерживает для ByRef
параметров , и эти ограничения получают на пути цели VB - быть гибким языком. Следовательно, компилятор идет к большой длине, чтобы быть гибким и поддерживать несколько проспектов Byref
, намного выше , что позволяет вродить CLR.
C # 4 теперь поддерживает Две версии прохождения ссылок. В дополнение к одному наступлению с 1,0
модификатор теперь является необязательным при создании вызова взаимодействия на объект COM.