2015-07-30 16 views
5

Uważam za bardzo mylące, aby zrozumieć przejść przez odniesienie w języku C#. W moim kodu mam funkcję, która przyjmuje dwa parametryProblemy ze zrozumieniem przekazać przez odniesienie

private bool SerialUnEscape(byte serialData, ref byte serialResult) 
    { 
     if (((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_START) || 
        ((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_END)) { 
      serialEscaped = false; 
      serialResult = 0; 
      return (true); 
      } 

     } else if (serialEscaped) { 

      if ((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_ESCAPE_START) { 
       serialResult = (int)SerialProcessValue.SERIAL_PACKET_START; 
       serialEscaped = false; 
       return (true); 
      } 
     } else { 
      serialResult = serialData; 
      return (true); 
     } 

    } 

Wołam funkcji z odniesieniem jako serialDataLsb & serialDataMsb.

Teraz moje zamieszanie jest o to, jaka byłaby wartość serialDataLsb lub serialDataMsb, Czy to uzyskać wartość serialResult ??

for (i = 0; i < serialElements; i++) { 
    serialDataLsb = 0; 
    serialDataMsb = 0; 
    while (serialBufferWalk < serialIndex) { 
     if (SerialUnEscape(serialBuffer[serialBufferWalk++], ref serialDataLsb)) { 
      break; 
       } 
       } 
    while (serialBufferWalk < serialIndex) { 
     if (SerialUnEscape(serialBuffer[serialBufferWalk++], ref serialDataMsb)) { 
      break; 
      } 
     } 
serialElementData[i] = (UInt16)(serialDataLsb + (serialDataMsb << 8)); 
} 

i muszę portu tego kodu w Pythonie, 1) w jaki sposób można wdrożyć podanie przez odniesienie w Pythonie

Próbowałem przy użyciu tej

while serialBufferWalk < serialIndex: 
    if self.SerialUnEscape(serialBuffer[serialBufferWalk += 1],serialDataLsb): 
     break 
while serialBufferWalk < serialIndex: 
    if self.SerialUnEscape(serialBuffer[serialBufferWalk += 1],serialDataLsb): 
     break 
+0

C! = C# Proszę oznaczyć pytanie poprawnie następnym razem – Haris

+3

Jeśli nie musisz przekazywać wartości do funkcji, rozważ użycie słowa kluczowego "out" (https://msdn.microsoft.com /en-us/library/t3c3bfhx.aspx) zamiast tego –

+1

Wydaje mi się, że ten kod jest bardziej o Pythonie niż C#. Proponuję po prostu zwrócić krotkę z Python ... –

Odpowiedz

0

Jeśli naprawdę chcą naśladować przekaż referencję zamiast zmieniać kod, aby zwrócić wartość, możesz zawinąć prymityw, który chcesz zmienić w obiekcie. Dla uproszczenia użyłem listy:

def change_reference(byteContainer): 
    byteContainer[0] = 42 

b = 123 
print(b) # Prints 123 

# Copy the data into the container list. 
container = [b] 
# Pass a pointer to that list into the function. 
change_reference(container) 
# Take the value out of the container. 
b = container[0] 

print(b) # Prints 42 

To sprawia, że ​​twoja funkcja jest naprawdę myląca. Co należy zrobić, to naprawdę to zmodyfikowany bajt wartości zwracanej:

def test_and_subtract(v): 
    if v == 1: 
     return (v - 1, True) 
    return (v - 2, False) 

v = 1 
v, b = test_and_subtract(v) 
print(v) # 0 
print(b) # True 

v = 5 
v, b = test_and_subtract(v) 
print(v) # 3 
print(b) # False 

Tutaj return (v - 1, True) wywiera zarówno wyniki na krotki i b, v jest usunięcie ich z tej krotki.

Powiązane problemy