2015-07-02 2 views
0

Я думаю, это глупый вопрос, но если вы можете взглянутьПараметр изменяет исходное значение

Вот мой метод

public Tuple CheckRoyalFlush() 
     { 
      List<Honours> flush = new List<Honours>() 
      { 
       Honours.Ace, 
       Honours.King, 
       Honours.Queen, 
       Honours.Jack, 
       Honours.Ten 
      }; 

      if (RoyalFlushJokerHelper(honoursOnTheScreen, flush) || ContainsAllItems(honoursOnTheScreen, flush)) 
      { 
       Suits suit = cardsOnTheScreen.ElementAt(0).GetSuit(); 
       foreach (Card card in cardsOnTheScreen.Skip(1)) 
       { 
        if (card.GetSuit() != suit) 
        { 
         if (card.GetHonour() == Honours.Joker) 
          continue; 
         else 
          return new Tuple(false, null); 
        } 
       } 
       return new Tuple(true, new List<int> { 0, 1, 2, 3, 4 }); 
      } 

Дело в том, когда я проверяю мой «Если» я к первый метод «RoyalFlushJokerHelper», и я удаляю все мои 5 предметов из списка флешей.

Тогда проблема в том, когда я вхожу в метод ContainAllItems, мой список флешей пуст.

Я не передаю его по ссылке, так почему первый метод меняет мой первоначальный список?

+0

Что заставляет вас поверить, что вы не передаете его по ссылке? –

ответ

1

В C# только эти объекты являются оценочными типов:

  • Числовые типы данных
  • Boolean, Char, и Дата
  • struct сек
  • enum сек
  • Long, Byte, UShort , UInteger или ULong

Все остальные объекты являются ссылочными типами, и когда вы передаете их функции, вы передаете ее в качестве ссылки.
Если вы хотите изменить свой List, не затрагивая его, вы можете клонировать его перед:

public bool RoyalFlushJokerHelper(object honoursOnTheScreen, List<Honours> honours) 
{ 
    var honoursCopy = honours.Clone(); 
    // work with honoursCopy 
} 

, прочитайте пожалуйста информацию о типах значений и ссылочных типов.
Например, взгляните на MSDN article "Value Types and Reference Types".

+0

Объекты класса являются ссылочными типами, это не так, потому что тип предпосылки также получен только из этого типа. его родитель всех типов .net –

+0

@PranayRana Я не имел в виду 'object's. Я имел в виду «объекты класса» - объекты, которые являются классами. Наверное, я назвал это неправильно. Во всяком случае, я исправил ответ. Пожалуйста, если вы не возражаете, просмотрите его и сообщите мне, если что-то не так. –

Смежные вопросы