Ten artykuł został przetłumaczony przez maszynę. Aby wyświetlić jego treść w języku angielskim, zaznacz pole wyboru Angielski. Możesz też wyświetlić angielski tekst w okienku wyskakującym, przesuwając wskaźnik myszy nad konkretny tekst”.
Tłumaczenie
Angielski

Klasa ArgumentOutOfRangeException

.NET Framework (current version)
 

Data opublikowania: październik 2016

Wyjątek, który jest generowany, gdy wartość argumentu jest poza dozwolonym zakresem wartości określonych wywoływana metoda.

Przestrzeń nazw:   System
Zestaw:  mscorlib (w mscorlib.dll)

System.Object
  System.Exception
    System.SystemException
      System.ArgumentException
        System.ArgumentOutOfRangeException

[SerializableAttribute]
[ComVisibleAttribute(true)]
public class ArgumentOutOfRangeException : ArgumentException, 
	ISerializable

NazwaOpis
System_CAPS_pubmethodArgumentOutOfRangeException()

Inicjuje nowe wystąpienie ArgumentOutOfRangeException klasy.

System_CAPS_protmethodArgumentOutOfRangeException(SerializationInfo, StreamingContext)

Inicjuje nowe wystąpienie ArgumentOutOfRangeException klasy przy użyciu danych serializacji.

System_CAPS_pubmethodArgumentOutOfRangeException(String)

Inicjuje nowe wystąpienie ArgumentOutOfRangeException klasy o nazwie parametru, który powoduje, że ten wyjątek.

System_CAPS_pubmethodArgumentOutOfRangeException(String, Exception)

Inicjuje nowe wystąpienie ArgumentOutOfRangeException klasy z określonym komunikatem o błędzie i wyjątek, który jest przyczyną tego wyjątku.

System_CAPS_pubmethodArgumentOutOfRangeException(String, Object, String)

Inicjuje nowe wystąpienie ArgumentOutOfRangeException nazwę klasy za pomocą parametru, wartość argumentu i określonym komunikatem o błędzie.

System_CAPS_pubmethodArgumentOutOfRangeException(String, String)

Inicjuje nowe wystąpienie ArgumentOutOfRangeException klasy o nazwie parametru, który powoduje, że ten wyjątek określony komunikat o błędzie.

NazwaOpis
System_CAPS_pubpropertyActualValue

Pobiera wartość argumentu, który powoduje, że ten wyjątek.

System_CAPS_pubpropertyData

Pobiera kolekcję pary klucz wartość, które zapewniają dodatkowe zdefiniowane przez użytkownika informacji o wyjątku.(Dziedziczone z Exception).

System_CAPS_pubpropertyHelpLink

Pobiera lub ustawia łącze do pliku pomocy skojarzonego z tym wyjątkiem. (Dziedziczone z Exception).

System_CAPS_pubpropertyHResult

Pobiera lub ustawia zakodowaną wartość liczbową HRESULT, przypisaną do określonych wyjątków. (Dziedziczone z Exception).

System_CAPS_pubpropertyInnerException

Pobiera Exception wystąpienia, który spowodował bieżący wyjątek.(Dziedziczone z Exception).

System_CAPS_pubpropertyMessage

Pobiera komunikat o błędzie i ciąg reprezentujący wartość nieprawidłowy argument lub komunikacie o błędzie, jeśli wartość argumentu jest równa null.(Przesłania ArgumentException.Message).

System_CAPS_pubpropertyParamName

Pobiera nazwę parametru, który powoduje, że ten wyjątek.(Dziedziczone z ArgumentException).

System_CAPS_pubpropertySource

Pobiera lub ustawia nazwę aplikacji lub obiekt, który powoduje błąd.(Dziedziczone z Exception).

System_CAPS_pubpropertyStackTrace

Pobiera reprezentację ciągu natychmiastowe ramek na stosie wywołań.(Dziedziczone z Exception).

System_CAPS_pubpropertyTargetSite

Pobiera metodę, która wygenerowała bieżący wyjątek. (Dziedziczone z Exception).

NazwaOpis
System_CAPS_pubmethodEquals(Object)

Sprawdza, czy podany obiekt jest równy aktualnemu obiektowi (Dziedziczone z Object).

System_CAPS_protmethodFinalize()

Pozwala, aby obiekt spróbował zwolnić zasoby i wykonał inne operacje czyszczenia, zanim zostanie odzyskany przez moduł zbierający elementy bezużyteczne. (Dziedziczone z Object).

System_CAPS_pubmethodGetBaseException()

Gdy zostanie zastąpione w klasie pochodnej, zwraca Exception czyli przyczynę jeden lub więcej kolejnych wyjątków.(Dziedziczone z Exception).

System_CAPS_pubmethodGetHashCode()

Służy jako domyślna funkcji mieszania.(Dziedziczone z Object).

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

Zestawy SerializationInfo obiekt o wartości nieprawidłowy argument i dodatkowe informacje o wyjątku.(Przesłania ArgumentException.GetObjectData(SerializationInfo, StreamingContext)).

System_CAPS_pubmethodGetType()

Pobiera typ środowiska uruchomieniowego bieżącego wystąpienia.(Dziedziczone z Exception).

System_CAPS_protmethodMemberwiseClone()

Tworzy płytką kopię bieżącego Object.(Dziedziczone z Object).

System_CAPS_pubmethodToString()

Tworzy i zwraca reprezentację tekstową bieżącego wyjątku. (Dziedziczone z Exception).

NazwaOpis
System_CAPS_proteventSerializeObjectState

Występuje, gdy wyjątek jest serializowana utworzyć obiekt stanu wyjątek, który zawiera serializowane dane o wyjątku.(Dziedziczone z Exception).

ArgumentOutOfRangeException Wyjątek jest generowany, gdy wywoływana jest metoda i co najmniej jeden argument przekazany do metody nie jest null i zawiera nieprawidłową wartość, która nie jest członkiem zestawu wartości Oczekiwano argumentu. ParamName Właściwość identyfikuje nieprawidłowy argument i ActualValue właściwość, jeśli wartość jest obecny, określa nieprawidłową wartość.

Zazwyczaj ArgumentOutOfRangeException wynikiem błędu dla deweloperów. Zamiast obsługi wyjątków w try/catch bloku, należy wyeliminować przyczyny wyjątku lub, jeśli argument jest zwracany przez wywołanie metody lub danych wejściowych przez użytkownika przed przesłaniem do metody, która zgłasza wyjątek, należy sprawdzić, czy argumenty przed przekazaniem ich do metody.

ArgumentOutOfRangeException powszechnie używana przez:

Warunki, w których ArgumentOutOfRangeException wyjątku są następujące:

Element członkowski kolekcji są pobierane przy użyciu numeru indeksu, a numer indeksu jest nieprawidłowy.

Jest to najbardziej typowe przyczyny ArgumentOutOfRangeException wyjątek. Zazwyczaj numer indeksu jest nieprawidłowy dla jednego z trzech powodów:

  • Kolekcja nie ma elementów członkowskich i kodu zakłada, że robi. Poniższy przykład podejmie próbę pobrania pierwszego elementu w kolekcji, która nie ma żadnych elementów:

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          var list = new List<String>();
          Console.WriteLine("Number of items: {0}", list.Count);
          try {
             Console.WriteLine("The first item: '{0}'", list[0]);
          }
          catch (ArgumentOutOfRangeException e) {
             Console.WriteLine(e.Message);
          }
       }
    }
    // The example displays the following output:
    //   Number of items: 0
    //   Index was out of range. Must be non-negative and less than the size of the collection.
    //   Parameter name: index
    

    Aby zapobiec wyjątek, sprawdź, czy kolekcja Count właściwość jest większa od zera, przed próbą pobrania żadnych elementów członkowskich, podobnie jak następujący fragment kodu.

    if (list.Count > 0)
       Console.WriteLine("The first item: '{0}'", list[0]);
    

    W niektórych przypadkach może to nastąpić, ponieważ próbujesz dodać członka do kolekcji przy użyciu indeksu, który nie istnieje, a nie przez wywołanie metody, takie jak Add, który istnieje w tym celu. Poniższy przykład próbuje dodać element do kolekcji przy użyciu indeksu nieistniejącej zamiast wywoływania List<T>.Add metody.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          var numbers = new List<int>();
          numbers.AddRange( new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 20 } );
    
          var squares = new List<int>();
          for (int ctr = 0; ctr < numbers.Count; ctr++)
             squares[ctr] = (int) Math.Pow(numbers[ctr], 2); 
       }
    }
    // The example displays the following output:
    //    Unhandled Exception: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
    //    Parameter name: index
    //       at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
    //       at Example.Main()
    

    Poniższy fragment kodu rozwiąże ten błąd:

    var squares = new List<int>();
    for (int ctr = 0; ctr < numbers.Count; ctr++)
       squares.Add((int) Math.Pow(numbers[ctr], 2)); 
    
  • W przypadku próby pobrania elementu, którego indeks jest ujemny. Zwykle dzieje się tak, ponieważ po przeszukaniu kolekcji dla indeksu określonego elementu i ma błędnie założono, że wyszukiwanie pomyślnie. W poniższym przykładzie wywołanie List<T>.FindIndex(Predicate<T>) Metoda nie odnajdzie ciągu równą "Z", a tym samym zwraca wartość -1. Jest to jednak wartość nieprawidłowy indeks.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          var list = new List<String>(); 
          list.AddRange( new String[] { "A", "B", "C" } );
          // Get the index of the element whose value is "Z".
          int index = list.FindIndex((new StringSearcher("Z")).FindEquals);
          try {
             Console.WriteLine("Index {0} contains '{1}'", index, list[index]); 
          }
          catch (ArgumentOutOfRangeException e) {
             Console.WriteLine(e.Message);
          }
       }
    }
    
    internal class StringSearcher
    {
       String value;
    
       public StringSearcher(String value)
       {
          this.value = value;
       }
    
       public bool FindEquals(String s) 
       {
          return s.Equals(value, StringComparison.InvariantCulture); 
       }
    }
    // The example displays the following output:
    //   Index was out of range. Must be non-negative and less than the size of the collection.
    //   Parameter name: index
    

    Aby zapobiec wyjątek, sprawdź, czy wyszukiwanie zakończyło się powodzeniem, upewniając się, że zwrócony indeksu jest większa niż lub równa zero, przed podjęciem próby pobrania elementu z kolekcji, jako następujący kod fragment nie.

    // Get the index of the element whose value is "Z".
    int index = list.FindIndex((new StringSearcher("Z")).FindEquals);
    if (index >= 0)
       Console.WriteLine("'Z' is found at index {0}", list[index]); 
    
  • W przypadku próby pobrania elementu, którego indeks jest równa wartości kolekcji Count Właściwości, w poniższym przykładzie pokazano.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          var list = new List<String>(); 
          list.AddRange( new String[] { "A", "B", "C" } );
          try {
             // Display the elements in the list by index.
             for (int ctr = 0; ctr <= list.Count; ctr++) 
                Console.WriteLine("Index {0}: {1}", ctr, list[ctr]);
          } 
          catch (ArgumentOutOfRangeException e) {
             Console.WriteLine(e.Message);
          }
       }
    }
    // The example displays the following output:
    //   Index 0: A
    //   Index 1: B
    //   Index 2: C
    //   Index was out of range. Must be non-negative and less than the size of the collection.
    //   Parameter name: index
    

    Ponieważ kolekcje w programie .NET Framework Użyj indeksowania liczony od zera, pierwszy element kolekcji znajduje się pod indeksem 0 i jest ostatnim elementem w indeksie Count - 1. Ten błąd może wyeliminować przez zapewnienie im dostępu do ostatniego elementu w indeksie Count - 1, podobnie jak w poniższym kodzie.

    // Display the elements in the list by index.
    for (int ctr = 0; ctr < list.Count; ctr++) 
       Console.WriteLine("Index {0}: {1}", ctr, list[ctr]);
    
Podjęto próbę wykonania operacji ciąg przez wywołanie metody manipulowania ciąg i początkowy indeks nie istnieje w ciągu.

Przeciążenia metod, takich jak String.Compare, String.CompareOrdinal, String.IndexOf, IndexOfAny, String.Insert, String.LastIndexOf, String.LastIndexOfAny, Remove, lub String.Substring umożliwiające określenie początkowy indeks operacji wymagają indeks prawidłową pozycję w ciągu. Indeksy prawidłowe w zakresie od 0 do String.Length - 1.

Istnieją cztery typowe przyczyny tego ArgumentOutOfRangeException wyjątek:

  • Korzystasz z pustym ciągiem., lub String.Empty. Ponieważ jej String.Length właściwość zwraca 0, każda próba manipulowania nim przez indeks zgłasza wyjątek ArgumentOutOfRangeException wyjątek. W poniższym przykładzie zdefiniowano GetFirstCharacter metodę, która zwraca pierwszy znak w ciągu. Jeśli ciąg jest pusta, jak ciąg końcowy przekazany do metody, metoda zgłasza ArgumentOutOfRangeException wyjątek.

    using System;
    
    public class Example
    {
       public static void Main()
       {
           String[] words = { "the", "today", "tomorrow", " ", "" };
           foreach (var word in words)
              Console.WriteLine("First character of '{0}': '{1}'", 
                                word, GetFirstCharacter(word));
       }
    
       private static char GetFirstCharacter(String s)
       {
          return s[0];
       }
    }
    // The example displays the following output:
    //    First character of //the//: //t//
    //    First character of //today//: //t//
    //    First character of //tomorrow//: //t//
    //    First character of // //: // //
    //    
    //    Unhandled Exception: System.IndexOutOfRangeException: Index was outside the bounds of the array.
    //       at Example.Main()
    

    Wyjątek może wyeliminować przez sprawdzenie, czy ciąg String.Length jest większa od zera lub przez wywołanie metody IsNullOrEmpty metody, aby upewnić się, że ciąg nie jest null lub jest pusty. Ten ostatni ma następujący fragment kodu. W tym przypadku, jeśli ciąg jest null lub jest pusty, GetFirstCharacter Metoda zwraca U + 0000.

    static char GetFirstCharacter(String s)
    {
       if (String.IsNullOrEmpty(s)) 
          return '\u0000';
       else   
          return s[0];
    }
    
  • Manipulacje ciąg na podstawie pozycji podciągu wewnątrz tego ciągu, a już nie można ustalić, czy rzeczywiście został znaleziony podciąg.

    Poniższy przykład wyodrębnia drugi wyraz lub frazę dwa słowa. Powoduje ona ArgumentOutOfRangeException wyjątek, jeśli wyrażenie składa się tylko jedno słowo, a w związku z tym nie zawiera znak spacji osadzonych. Dzieje się tak dlatego wywołanie String.IndexOf(String) Metoda zwraca wartość -1 oznacza, że wyszukiwanie nie powiodło się i to nieprawidłowa wartość jest następnie przekazywany do String.Substring(Int32) metody.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          String[] phrases = { "ocean blue", "concerned citizen", 
                               "runOnPhrase" };
          foreach (var phrase in phrases)
             Console.WriteLine("Second word is {0}", GetSecondWord(phrase));
       }
    
       static String GetSecondWord(String s)
       {
          int pos = s.IndexOf(" ");
          return s.Substring(pos).Trim();
       }
    }
    // The example displays the following output:
    //    Second word is blue
    //    Second word is citizen
    //    
    //    Unhandled Exception: System.ArgumentOutOfRangeException: StartIndex cannot be less than zero.
    //    Parameter name: startIndex
    //       at System.String.Substring(Int32 startIndex, Int32 length)
    //       at Example.GetSecondWord(String s)
    //       at Example.Main()
    

    Aby wyeliminować wyjątek, sprawdź poprawność wartość zwracana przez metodę wyszukiwania ciągu przed wywołaniem metody manipulowania ciągu.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          String[] phrases = { "ocean blue", "concerned citizen", 
                               "runOnPhrase" };
          foreach (var phrase in phrases) {
             String word = GetSecondWord(phrase);
             if (! String.IsNullOrEmpty(word))
                Console.WriteLine("Second word is {0}", word);
          }   
       }
    
       static String GetSecondWord(String s)
       {
          int pos = s.IndexOf(" ");
          if (pos >= 0)
             return s.Substring(pos).Trim();
          else
             return String.Empty;   
       }
    }
    // The example displays the following output:
    //       Second word is blue
    //       Second word is citizen
    
Próbowano Wyodrębnij podciąg, który znajduje się poza zakresem bieżących parametrów.

Metody, które wyodrębnianie podciągów wymaga określenia pozycji początkowej podciąg, a dla podciągi, które nie Kontynuuj na końcu ciągu, liczba znaków w podciąg. Należy zauważyć, że nie jest to indeksu ostatniego znaku w podciąg.

ArgumentOutOfRangeException Jest zazwyczaj wyjątek w tym przypadku, ponieważ został niepoprawnie oblicza liczbę znaków w podciąg. Jeśli używana jest metoda wyszukiwania, takich jak String.IndexOf do identyfikowania początkową i końcową pozycję podciągu:

  • Jeśli znak w pozycji końcowej zwrócony przez String.IndexOf jest objęty podciąg, pozycji końcowej podciągu jest wzorem

    endIndex - startIndex + 1
    
  • Jeśli znak w pozycji końcowej zwrócone przez String.IndexOf ma zostać wyłączone z podciąg, pozycji końcowej podciągu jest wzorem

    endIndex - startIndex 
    

W poniższym przykładzie zdefiniowano FindWords metody, która używa String.IndexOfAny(Char[], Int32) metodę, aby zidentyfikować znaków spacji i znaków interpunkcyjnych znaków w ciągu i zwraca tablicę, która zawiera wyrazy w ciągu.

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      String sentence = "This is a simple, short sentence.";
      Console.WriteLine("Words in '{0}':", sentence);
      foreach (var word in FindWords(sentence))
         Console.WriteLine("   '{0}'", word);
   }

   static String[] FindWords(String s)
   {
      int start = 0, end = 0;
      Char[] delimiters = { ' ', '.', ',', ';', ':', '(', ')' };
      var words = new List<String>();

      while (end >= 0) {
         end = s.IndexOfAny(delimiters, start);
         if (end >= 0) {
            if (end - start > 0)
               words.Add(s.Substring(start, end - start)); 

            start = end++;
         }
         else {
            if (start < s.Length - 1)
               words.Add(s.Substring(start));
         }
      }    
      return words.ToArray();                         
   }
}
// The example displays the following output:
//       Words in 'This is a simple, short sentence.':
//          'This'
//          'is'
//          'a'
//          'simple'
//          'short'
//          'sentence'
Liczbą ujemną przekazanego do metody za pomocą argumentu, który wymaga tylko liczby dodatnie i zero lub upłynęły liczbę ujemną lub zero, aby metoda z argumentu, który wymaga tylko liczby dodatnie.

Na przykład Array.CreateInstance(Type, Int32, Int32, Int32) Metoda wymaga, aby określić liczbę elementów w każdym wymiarze tablicę dwuwymiarową; prawidłowe wartości dla każdego wymiaru mogą należeć do zakresu od 0 do Int32.MaxValue. W poniższym przykładzie argument wymiaru ma wartość ujemną, metoda zgłasza, ale ArgumentOutOfRangeException wyjątek.

using System;

public class Example
{
   public static void Main()
   {
      int dimension1 = 10;
      int dimension2 = -1;
      try {
         Array arr = Array.CreateInstance(typeof(String), 
                                          dimension1, dimension2);
      }
      catch (ArgumentOutOfRangeException e) {
         if (e.ActualValue != null)
            Console.WriteLine("{0} is an invalid value for {1}: ", e.ActualValue, e.ParamName);
         Console.WriteLine(e.Message);
      }
   }
}
// The example displays the following output:
//     Non-negative number required.
//     Parameter name: length2

Aby poprawić ten błąd, upewnij się, że wartość nieprawidłowy argument jest ujemna. Można to zrobić, podając prawidłową wartość jak następujący fragment kodu.

int dimension1 = 10;
int dimension2 = 10;
Array arr = Array.CreateInstance(typeof(String), 
                                 dimension1, dimension2);   

Można również sprawdzić poprawność danych wejściowych i, jest nieprawidłowy, należy podjąć niektóre działania. Poniższy fragment kodu wyświetla komunikat o błędzie zamiast wywołania metody.

if (dimension1 < 0 || dimension2 < 0) {
   Console.WriteLine("Unable to create the array.");
   Console.WriteLine("Specify non-negative values for the two dimensions.");
}   
else {
   arr = Array.CreateInstance(typeof(String), 
                              dimension1, dimension2);   
}
Sytuacja wyścigu istnieje w aplikacji, która jest wielowątkowe lub zawiera zadania, które asynchroniczne wykonywanie i że aktualizacje tablicy lub kolekcji.

W poniższym przykładzie użyto List<T> obiekt do wypełnienia zbiór Continent obiektów. Powoduje ona ArgumentOutOfRangeException wyjątek, jeśli przykład próbował wyświetlić siedem elementów w kolekcji, zanim zostanie całkowicie wypełniony kolekcji.

using System;
using System.Collections.Generic;
using System.Threading;

public class Continent
{
   public String Name { get; set; }
   public int Population { get; set; }
   public Decimal Area { get; set; }   
}

public class Example
{
   static List<Continent> continents = new List<Continent>();
   static String msg; 

   public static void Main()
   {
      String[] names = { "Africa", "Antarctica", "Asia", 
                         "Australia", "Europe", "North America",
                         "South America" };
      // Populate the list.
      foreach (var name in names) {
         var th = new Thread(PopulateContinents);
         th.Start(name);
      }              
      Console.WriteLine(msg);
      Console.WriteLine();

      // Display the list.
      for (int ctr = 0; ctr < names.Length; ctr++) {
         var continent = continents[ctr];
         Console.WriteLine("{0}: Area: {1}, Population {2}", 
                           continent.Name, continent.Population,
                           continent.Area);
      }
   }

   private static void PopulateContinents(Object obj)
   {
      String name = obj.ToString();
      msg += String.Format("Adding '{0}' to the list.\n", name);
      var continent = new Continent();
      continent.Name = name;
      // Sleep to simulate retrieving remaining data.
      Thread.Sleep(50);
      continents.Add(continent);
   }
}
// The example displays output like the following:
//    Adding //Africa// to the list.
//    Adding //Antarctica// to the list.
//    Adding //Asia// to the list.
//    Adding //Australia// to the list.
//    Adding //Europe// to the list.
//    Adding //North America// to the list.
//    Adding //South America// to the list.
//    
//    
//    
//    Unhandled Exception: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
//    Parameter name: index
//       at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
//       at Example.Main()

W takim przypadku dwa zasoby są dostępne z wielu wątków:

  • continents Kolekcji. Jego List<T>.Add Metoda jest wywoływana przez wiele wątków. Ponadto wątek główny lub podstawowy przyjęto założenie, że kolekcja jest całkowicie wypełniana siedem elementów podczas jego dokonuje jej elementów członkowskich.

  • msg Ciąg, który jest połączony z wielu wątków.

Aby poprawić ten błąd, upewnij się, że stanie udostępniania są dostępne w sposób wątkowo bezpieczny, w następujący sposób.

  • Jeśli aplikacja używa obiektu tablicy lub kolekcji, należy rozważyć użycie klasy obsługujące wielowątkowość kolekcji, takich jak typy w System.Collections.Concurrent przestrzeni nazw lub System.Collections.Immutable wersji poza pasmem.

  • Upewnij się, czy udostępniania stanu (czyli zasobów, które są dostępne dla wielu wątków) jest dostępny w sposób bezpieczny wątku, tak aby tylko jeden wątek jednocześnie ma już wyłączny dostęp do zasobów. Wiele klas, takie jak CountdownEvent, Interlocked, Monitor, i Mutex, są dostępne do synchronizowania dostępu do zasobów. Aby uzyskać więcej informacji, zobacz Zarządzana wątkowość. Ponadto, obsługa języków jest dostępna za pośrednictwem blokady instrukcji w języku C# i SyncLock konstruowania w języku Visual Basic.

Następujące przykładowe adresy ArgumentOutOfRangeException wyjątków i inne problemy z poprzedniego przykładu. Zastępuje ona List<T> obiekt z ConcurrentBag<T> obiekt, aby zagwarantować, że dostęp do kolekcji jest bezpieczne wątkowo, używa CountdownEvent obiektu, aby upewnić się, że wątek aplikacji nadal dopiero po wykonaniu innych wątków i używa blokady w celu zapewnienia, że tylko jeden wątek może uzyskać dostęp do msg zmiennej w czasie.

using System;
using System.Collections.Concurrent;
using System.Threading;

public class Continent
{
   public String Name { get; set; }
   public int Population { get; set; }
   public Decimal Area { get; set; }   
}

public class Example
{
   static ConcurrentBag<Continent> continents = new ConcurrentBag<Continent>();
   static CountdownEvent gate;
   static String msg = String.Empty;

   public static void Main()
   {
      String[] names = { "Africa", "Antarctica", "Asia", 
                         "Australia", "Europe", "North America",
                         "South America" };
      gate = new CountdownEvent(names.Length);

      // Populate the list.
      foreach (var name in names) {
         var th = new Thread(PopulateContinents);
         th.Start(name);
      }              

      // Display the list.
      gate.Wait();
      Console.WriteLine(msg);
      Console.WriteLine();

      var arr = continents.ToArray();
      for (int ctr = 0; ctr < names.Length; ctr++) {
         var continent = arr[ctr];
         Console.WriteLine("{0}: Area: {1}, Population {2}", 
                           continent.Name, continent.Population,
                           continent.Area);
      }
   }

   private static void PopulateContinents(Object obj)
   {
      String name = obj.ToString();
      lock(msg) { 
         msg += String.Format("Adding '{0}' to the list.\n", name);
      }
      var continent = new Continent();
      continent.Name = name;
      // Sleep to simulate retrieving remaining data.
      Thread.Sleep(25);
      continents.Add(continent);
      gate.Signal();
   }
}
// The example displays output like the following:
//       Adding 'Africa' to the list.
//       Adding 'Antarctica' to the list.
//       Adding 'Asia' to the list.
//       Adding 'Australia' to the list.
//       Adding 'Europe' to the list.
//       Adding 'North America' to the list.
//       Adding 'South America' to the list.
//       
//       
//       Africa: Area: 0, Population 0
//       Antarctica: Area: 0, Population 0
//       Asia: Area: 0, Population 0
//       Australia: Area: 0, Population 0
//       Europe: Area: 0, Population 0
//       North America: Area: 0, Population 0
//       South America: Area: 0, Population 0

ArgumentOutOfRangeException używa COR_E_ARGUMENTOUTOFRANGE HRESULT, która ma wartość 0x80131502.

Lista początkowe wartości właściwości wystąpienia ArgumentOutOfRangeException, zobacz ArgumentOutOfRangeException konstruktorów.

W poniższym przykładzie zdefiniowano klasę, aby zawierają informacje na temat zaproszonych gościa. Jeśli gościa jest mniej niż 21 lat ArgumentOutOfRangeException wyjątku.

using System;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Guest guest1 = new Guest("Ben", "Miller", 17);
            Console.WriteLine(guest1.GuestInfo());
        }
        catch (ArgumentOutOfRangeException outOfRange)
        {

            Console.WriteLine("Error: {0}", outOfRange.Message);
        }
    }
}

class Guest
{
    private string FirstName;
    private string LastName;
    private int Age;

    public Guest(string fName, string lName, int age)
    {
        FirstName = fName;
        LastName = lName;
        if (age < 21)
            throw new ArgumentOutOfRangeException("age","All guests must be 21-years-old or older.");
        else
            Age = age;
    }

    public string GuestInfo()
    {
        string gInfo = FirstName + " " + LastName + ", " + Age.ToString();
        return(gInfo);
    }
}

Platforma uniwersalna systemu Windows
Dostępne od 8
.NET Framework
Dostępne od 1.1
Biblioteka klas przenośnych
Obsługiwane w: przenośne platformy .NET
Silverlight
Dostępne od 2.0
Windows Phone Silverlight
Dostępne od 7.0
Windows Phone
Dostępne od 8.1

Wszystkie publiczne statyczne ( Shared w języku Visual Basic) elementy członkowskie tego typu są wątkowo bezpieczne. Dla żadnych elementów członkowskich wystąpień nie ma gwarancji bezpieczeństwa wątkowego.

Powrót do początku
Pokaż: