david salaman Ответов: 1

Являются ли данные типа "out", передаваемые в качестве параметра, равными возвращаемому типу?


недавно прочитал о ключевых словах Out/ref, и мне нужно знать, как приведенный ниже метод(FetchDeviceInfo) возвращает серийный номер устройства, хотя переменная "returnValue" является Строковой.Пустой. а внутри тела метода GetSerialNumber(machineNumber, out returnValue) ничего нет?

public string FetchDeviceInfo(ZkemClient objZkeeper, int machineNumber)
        {
            
            string returnValue = string.Empty;
            
            objZkeeper.GetSerialNumber(machineNumber, out returnValue);
           

            return returnValue.ToString;}

/* 
realized method from class:
public bool GetSerialNumber(int dwMachineNumber, out string dwSerialNumber)
        { return objCZKEM.GetSerialNumber(dwMachineNumber, out dwSerialNumber); }

from interface:
[DispId(29)]
        bool GetSerialNumber(int dwMachineNumber, out string dwSerialNumber);

from manual: 
  2.23 GetSerialNumber
[Function]
Get the product information or serial number
[Protocol]
BOOLGetSerialNumber (
long dwMachineNumber,
 BSTR FAR* lpszSerialNumber);
[Paramters]
dwMachineNumber
The Machine Number of operating device
lpszSerialNumber
The returned string
[Return]
TRUE if success, FALSE else. 

 
*/

============================
class SomeClass
{
      static void Main()
      {
      ZkemClient objZkeeper = new ZkemClient();
      objZkeeper.Connect_Net("192.168.1.25", 4370);
      
      DeviceManipulator manipulator = new DeviceManipulator();
      string deviceInfo = manipulator.FetchDeviceInfo(objZkeeper, 1);
      }
}
//--------------
public class DeviceManipulator
{
       public string FetchDeviceInfo(ZkemClient objZkeeper, int machineNumber)
       {
              returnValue = string.Empty;
              objZkeeper.GetSerialNumber(machineNumber, out returnValue);
              return returnValue.ToString;}
        }

//------------------
using zkemkeeper;

public class ZkemClient : IZKEM
{
      Action<object, string> RaiseDeviceEvent;
      public ZkemClient(Action<object, string> RaiseDeviceEvent)
      {
      this.RaiseDeviceEvent = RaiseDeviceEvent;
      }

      CZKEM objCZKEM = new CZKEM();

      public bool GetSerialNumber(int dwMachineNumber, out string dwSerialNumber)
      {
      return objCZKEM.GetSerialNumber(dwMachineNumber, out dwSerialNumber); 
      }

}

//---------------
namespace zkemkeeper
{
    [CoClass(typeof(CZKEMClass))]
    [Guid("102F4206-E43D-4FC9-BAB0-331CFFE4D25B")]
    public interface CZKEM : IZKEM, _IZKEMEvents_Event
    {
    }
}

//-------------------

namespace zkemkeeper
{
    [ComConversionLoss]
    [Guid("102F4206-E43D-4FC9-BAB0-331CFFE4D25B")]
    [TypeLibType(4160)]
    public interface IZKEM
    {

     [DispId(29)]
     bool GetSerialNumber(int dwMachineNumber, out string dwSerialNumber);
    }
}

        }


Что я уже пробовал:

посмотрел несколько учебных пособий о ref/out. Понял, что это для передачи по ссылке. при передаче их в качестве параметра метода и после вызова метода значение нашей объявленной переменной будет изменено. в отличие от переданного по значению. (где метод будет работать с копией нашей объявленной переменной)

Afzaal Ahmad Zeeshan

Это восходит ко временам программирования в стиле C/C++ передачи объектов по ссылке (или указателям на их ячейки памяти). Единственная причина сделать это-включить несколько возвратов из метода; 1 для успеха метода, 2 для возвращаемого значения.

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

david salaman

thnx)) ваш ответ достаточно хорош)))но у меня нет другого выбора bcz есть устройство отпечатков пальцев, и я должен иметь дело с методами, которые оно предоставляет. автоматическая функция находится в файле по ссылке:///С:/Пользователи/гнездо/рабочего стола/Баха/биометрический%20Device%20SDK-%20Programmers%20Guide.1517824896.формат PDF

1 Ответов

Рейтинг:
2

OriginalGriff

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

Цитата:
из интерфейса:

[DispId(29)]
        bool GetSerialNumber(int dwMachineNumber, out string dwSerialNumber);
это неправильно: интерфейс не может объявить какой-либо код, он просто определяет сигнатуру метода, которая должен быть реализованным каждым классом, который включает интерфейс в свое определение. Вам нужно использовать отладчик, чтобы точно узнать, какой класс экземпляр содержится в вашем компьютере.
Цитата:
objZkeeper
переменная содержит, когда она входит FetchDeviceInfo и посмотрите на исходный код для этого.