2016-06-22 2 views
1

Я в настоящее время преобразовываю проект из VB в C#. У меня есть Веб-ссылка в проекте VB, на который я ссылался в проекте C# (Добавить веб-ссылку). Подписи те же. Код VB выглядит следующим образом:vb to C# ref аргумент

If Not tws.StartSession(tsd) Then 
    Throw New systemMonitor.internalEx.securityEx("Failed to initiate a TROPOS session") 
End If 

Я попытался тайным, что через, как это:

// Start our session 
if (!this._service.StartSession(this._details)) 
    throw new Exception("The TROPOS session failed to start."); 

У меня есть проблема, в том, что он не будет компилировать и приходит с ошибкой:

argument 1 must be passed with the 'ref' keyword

поэтому я изменил его к этому:

// Start our session 
if (!this._service.StartSession(ref this._details)) 
    throw new Exception("The TROPOS session failed to start."); 

, который компилируется и запускается (хотя ничего не происходит, но это еще одна проблема). Мой вопрос прост. В VB вам не нужно устанавливать ключевое слово ByRef?

+0

Будет ли это http://stackoverflow.com/questions/9207620/why-is-it-not-necessary-to-indicate-byval-byref-anymore help? – bi0phaz3

+0

также показывают весь класс. для обоих. vb и C# – Seabizkit

+0

Это объясняет различия, но не говорит, требуется ли в VB или нет? – r3plica

ответ

1

В VB.NET ByRef или ByVal является (по желанию), указанный в методе вызывается (с по умолчанию быть ByVal, если ни один не задан), и вы не указали его при вызове метода.

В C#, если для этого параметра указан параметр ref, тогда вы должны также указать 'ref' при вызове метода.

-2

Вам не нужно указывать ByRef в VB.NET

Короткий ответ нет, вы не должны.

Вот почему: снова VB.NET делает что-то для вас, если это объект, который передается функции, он будет автоматически передаваться по ссылке. Поэтому под обложками VB.NET добавляет его для вас. VB.NET будет передавать простые типы данных (строки, целые числа и т. Д.) ByVal автоматически, если вы не укажете ByRef.

Лично я хотел бы написать свой код явно, используя ByRef, когда я хочу передать что-то по ссылке. Я также использую следующие параметры компилятора:

Option Explicit On 
Option Strict On 

Который ограничивает количество вещей, которые VB делает для меня автоматически. Я не думаю, что это влияет на объекты passign по ссылке.

+2

', если это объект, переданный функции, он будет автоматически передан по ссылке. Это ложь. По умолчанию он будет передан по значению. Единственное, что происходит здесь, это то, что если определение метода определяет параметр как передаваемый по ссылке, вызывающий не * также * должен явно указывать его; это подразумевается, но определение метода * does * все еще должно явно указывать его. – Servy

+1

Слишком много программистов просто не получают этого - ссылочные типы * не * автоматически передаются 'byref'. Параметры «ByRef» означают, что вы можете переназначить объект на новый или другой экземпляр и иметь изменения, видимые в месте вызова.Если параметр «ByVal», изменение идентификатора объекта не будет иметь эффекта вне метода. –