Я был в этом немного без везения.
У меня есть эта процедура Delphi, которую я не писал, и у меня нет исходной программы для тестирования. Пожалуйста, обратите внимание на комментарий, чтобы увидеть, что он должен делать:
// first parameter is an input string, and the others are returned contents
// parsed. Example: "Okay:C15" would be parsed as "Okay", "C", 15, 0
procedure TestingThis(const astring: string; var aname: string;
var atype: char; var alength: byte; var adecimals: byte);
var
ipos,jpos: integer;
aa: string;
begin
aname:='';
atype:='C';
alength:=1;
adecimals:=0;
aa:=astring;
ipos:=pos(':',aa);
if ipos > 1 then
begin
aname:=copy(aa,1,ipos-1);
aa:=copy(aa,ipos+1,length(aa)-ipos);
atype:=aa[1];
if atype = 'A' then exit;
if atype = 'B' then
begin
alength:=8;
exit;
end;
if atype = 'C' then
begin
alength:=strtoint(copy(aa,2,length(aa)-1));
exit;
end;
if atype = 'D' then
begin
jpos:=pos('.',aa);
if jpos < 1 then
begin
alength:=strtoint(copy(aa,2,length(aa)-1));
adecimals:=0;
end
else
begin
alength:=strtoint(copy(aa,2,jpos-2));
adecimals:=strtoint(copy(aa,jpos+1,length(aa)-jpos));
end;
exit;
end;
end;
end;
Вот моя версия С#:
public static void TestingThis(string astring)
{
int ipos;
int jpos;
string aa;
string aname = "";
char atype = 'C';
// def
byte alength = 1;
byte adecimals = 0;
aa = astring;
ipos = aa.IndexOf(':');
if (ipos > 0)
{
aname = aa.Substring(0,ipos);
aa = aa.Substring(ipos + 1, aa.Length - ipos - 1);
atype = aa[0];
if (atype == 'L')
{
return;
}
if (atype == 'D')
{
alength = 8;
}
if (atype == 'C')
{
if (Byte.TryParse(aa.Substring(1, aa.Length - 1), out alength)) //Get the last two elements of string and convert to type byte
{
return;
}
}
if (atype == 'N')
{
jpos = aa.IndexOf('.');
if (jpos < 0) // if '.' isn't found in string
{
if (byte.TryParse(aa.Substring(1, aa.Length - 1), out alength))
{
adecimals = 0;
return;
}
}
else
{
if ((byte.TryParse(aa.Substring(2, jpos - 2), out alength)) && (byte.TryParse(aa.Substring(jpos + 1 ,aa.Length - jpos), out adecimals)))
{
return;
}
}
return;
}
}
}
Я проверил это, дав ему строку вроде:
string test = "Okay:C15"
TestingThis(test)
Хотя я в замешательстве. В коде Delphi только один параметр является входным: astring, а остальные якобы возвращаемые значения? Как это возможно? Я ничего не видел о входе одного параметра и выходе 4 Из того, что я прочитал, ключевое слово var означает, что они передаются по ссылке, что означает, что я должен использовать ref в версии С#. Сама функция предположительно вызывается только один раз, а ввод на самом деле представляет собой одну строку.
Изменить: изменил мою функцию на это:
public static void TestingThis(string astring, out string aname, out char atype, out byte alength, out byte adecimals)
И я называю это так:
string test = "Okay:C15";
string aname;
char atype;
byte alength;
byte adecimals;
TestingThis(test, out aname, out atype, out alength, out adecimals);
Это правильное преобразование из Delphi в C#?
var- это ключевое слово в C#, котороеimplicitly vs explicitlyсообщает вам, что такое тип переменной.. также вы можете вернуть столько значений из метода, если сигнатура метода имеет параметрout, например,var myVar = new DataTableэто то же самое, что сказать явноDataTable myVar = new DataTable()и передать по ref в С# вам все равно нужно будет указать ключевое словоrefв сигнатуре метода, а также выполнить поиск в Google поC# MSDN var, а также, если вы ожидаете вернуть значение из вашего метода С#, который вы опубликовали, вам нужно изменить void к фактическому типу данных - person MethodMan   schedule 19.02.2016varнаходится в части delphi, которую я собирался переключить наrefв C#, поскольку я читал, что это ее аналог. Итак, для всех параметров, перечисленных какvarв delphi, которые должны быть возвращаемыми параметрами, будет ли эквивалент C#out ref paramName? Редактировать: N/m так не работает. Хм. - person pfinferno   schedule 19.02.2016outвзглянуть на этот отличный пост/объяснение - stackoverflow.com/questions/1516876/when-to-use-ref-vs-out Я также знаю, что Delphi исключительно хорошо кодировал его в течение 17 из моих 22 лет кодирования. - person MethodMan   schedule 19.02.2016refв C#, но скажите, что просто используйтеoutв следующем. Что правильно? Я собираюсь отредактировать свой основной пост с тем, что у меня есть сейчас. - person pfinferno   schedule 19.02.2016string aname = (default)string;всегда инициализируйте целые числа = 0, объекты = null , строка=строка.Пустой; или какое-то строковое значение. char =' 'decimals = 0.0 не 0 и т.д.. вы поняли дрейф - person MethodMan   schedule 19.02.2016