Что позволяется в Visual Basic, это запрещается в C# (или наоборот)?

Это потенциальная проблема, НО ...

Ваш персонаж может также зависнуть в середине вашей программы на C ++, пока ОС извлекает страницу памяти с перегруженного жесткого диска. Если вы не используете ОС реального времени на оборудовании, предназначенном для обеспечения конкретных гарантий производительности, вам никогда не гарантируется производительность.

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

14
задан Joel Coehoorn 20 March 2012 в 15:19
поделиться

20 ответов

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".

5
ответ дан 1 December 2019 в 05:47
поделиться

Как упоминал Крис Данауэй, VB.NET имеет модули, которые позволяют вам определять функции и данные.

VB.NET имеет синтаксис VB6 для связывания с методами в библиотеках DLL. Например:

Declare SetSuspendState Lib "powrprof" As Function (byval hibernate as Int32, byval forceCritical as Int32, byval disableWakeEvent) as Int32

(Хотя это фактическое объявление, возможно, должно быть маршалировано)


2
ответ дан 1 December 2019 в 05:47
поделиться

Глобальные переменные не существуют в c # я думаю

1
ответ дан 1 December 2019 в 05:47
поделиться

В C # вы должны назначить свою переменную, прежде чем сможете ее использовать. Я думаю, вы можете отключить это, но это поведение по умолчанию.

Примерно так:

int something;
if (something == 10)
{ ... }

Не разрешено, но эквивалент VB будет.

2
ответ дан 1 December 2019 в 05:47
поделиться

Точка с запятой, которая заканчивается каждой строкой в ​​C #, запрещена в VB, и это всегда вызывает у меня улыбку, когда я пытаюсь вернуться в VB.Net ...

3
ответ дан 1 December 2019 в 05:47
поделиться

Новые автосвойства в C # еще не реализованы для VB.NET.

3
ответ дан 1 December 2019 в 05:47
поделиться

VB имеет необязательные параметры для функций.

C # получит их только с C # 4.0

4
ответ дан 1 December 2019 в 05:47
поделиться

Одно из моих любимых (и обломков)

В VB.Net вы можете использовать оператор switch / case как таковой:

Select Case True

   Case User.Name = "Joe" And User.Role = "BigWig" And SecretTime = "HackerTime"
      GrantCredentials()

End Select

который позволяет вам оценивать некоторые сложные оценки с помощью переключателя вместо множества блоков if / else. Вы не можете сделать это на C #.

4
ответ дан 1 December 2019 в 05:47
поделиться

Ключевое слово volatile доступно только в C # http://www.devcity.net/Articles/160/5/article.aspx

4
ответ дан 1 December 2019 в 05:47
поделиться

Вне всяких сомнений (до 4.0):

"Возможности" языка VB не поддерживаются в C #:

  • Дополнительные параметры
  • Позднее связывание
  • Без учета регистра

Я уверен, что есть еще кое-что. На ваш вопрос можно получить более точные ответы, если вы попросите конкретные примеры того, где каждый язык выделяется. VB в настоящее время лучше, чем C #, при взаимодействии с COM. Это связано с тем, что COM - гораздо меньше головной боли, когда доступны дополнительные параметры и когда вам не нужно выполнять привязку к (часто неизвестному типу) во время компиляции.

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

В конце концов, языки в основном эквивалентны, поскольку они различаются только по краям. Функционально они одинаково способны.

РЕДАКТИРОВАТЬ

Для ясности, я не имею в виду, что VB не допускает статическую типизацию ... просто то, что C # не поддерживает [пока] позволяют обойти статический ввод . Это делает C # более привлекательным кандидатом для определенных типов архитектур. В спецификации языка C # 4.0 вы можете обойти статическую типизацию, но вы делаете это, определяя блок динамического кода, а не объявляя весь файл «не строгим», что делает его более целенаправленным и целенаправленным.

5
ответ дан 1 December 2019 в 05:47
поделиться

В январе 2008 года в журнале Visual Studio было несколько полезных статей.

6
ответ дан 1 December 2019 в 05:47
поделиться

Индексированные свойства разрешены в 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
5
ответ дан 1 December 2019 в 05:47
поделиться

VB разрешает невиртуальные вызовы методов виртуального экземпляра ( call в IL), тогда как C # разрешает только виртуальные вызовы ( callvirt в IL). Рассмотрим следующий код:

8
ответ дан 1 December 2019 в 05:47
поделиться

В 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 выполняет это сопоставление напрямую (что нормально; это не необходимо, чтобы реализующий метод имел общее имя).

10
ответ дан 1 December 2019 в 05:47
поделиться

Компилятор VB 9.0 автоматически переводит буквальный XML в синтаксис «функциональной конструкции». Компилятор C # не поддерживает этот красивый буквальный синтаксис XML.

11
ответ дан 1 December 2019 в 05:47
поделиться

Обрабатывает ключевые слова и WithEvents для автоматического подключения обработчиков событий.

Private Sub btnOKClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOK.Click
End Sub
11
ответ дан 1 December 2019 в 05:47
поделиться

Я удивлен, что небезопасный код C # еще не упоминался. Это запрещено в VB.NET.

12
ответ дан 1 December 2019 в 05:47
поделиться

VB.NET поддерживает фильтры исключений CIL, а C # нет:

Try 
  ...
Catch ex As SomeException When ex.SomeProperty = 1
  ...
End Try 
17
ответ дан 1 December 2019 в 05:47
поделиться

В 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. Довольно часто я хочу определить интерфейс, который позволяет другому коду только читать свойство, но мне нужен общедоступный установщик в реализованном классе для использования персистором.

5
ответ дан 1 December 2019 в 05:47
поделиться

Я думаю, что вы имеете в виду:

Child aChild = aParent;

Вы сделали Не указать, что Athild имеет тип ребенка .

Ссылка на Child Тип будет означать, что вы можете позвонить в него членам, которые могут не существовать в родительском . Итак, если вы назначаете родитель , объект Child , вы сможете позвонить членам, которые не существуют на родительском составе .

-121--2370475-

Одним из пропущенных или просто неправильно понятых функций языка VB - это вызывает функцию, которая имеет BYREF параметра. Большинство языков поддерживают только один метод передачи параметров посредством ссылки: это сценарии, непосредственно поддерживаемые CLR.

CLR имеет много ограничений на тип значений, которые он поддерживает для ByRef параметров , и эти ограничения получают на пути цели VB - быть гибким языком. Следовательно, компилятор идет к большой длине, чтобы быть гибким и поддерживать несколько проспектов Byref , намного выше , что позволяет вродить CLR.

C # 4 теперь поддерживает Две версии прохождения ссылок. В дополнение к одному наступлению с 1,0 модификатор теперь является необязательным при создании вызова взаимодействия на объект COM.

5
ответ дан 1 December 2019 в 05:47
поделиться
Другие вопросы по тегам:

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