Нулевой массив си шарп

Как инициализировать пустой массив в С#?

Если вы собираетесь использовать коллекцию, которой вы не знаете размер заранее, есть лучшие варианты, чем массивы.

Вместо этого используйте List — он позволит вам добавить столько элементов, сколько вам нужно, и если вам нужно вернуть массив, вызовите ToArray() для переменной.

var listOfStrings = new List(); // do stuff. string[] arrayOfStrings = listOfStrings.ToArray(); 

Если вы должны создать пустой массив, вы можете сделать это:

string[] emptyStringArray = new string[0]; 

Ответ 2

Ответ 3

В .Net 4.6 предпочтительный способ — использовать новый метод Array.Empty :

public static T[] Empty() < return EmptyArray.Value; > // Useful in number of places that return an empty byte array to avoid // unnecessary memory allocation. internal static class EmptyArray

(код, связанный с кодом, удаленный для ясности)

Ответ 4

Вы можете инициализировать его с размером 0, но вам придется повторно инициализировать его, когда вы знаете, что такое размер, поскольку вы не можете добавить его в массив.

Ответ 5

В объявлении массива без размера не так много смысла. Массив имеет размер. Когда вы объявляете массив определенного размера, вы указываете фиксированное количество слотов, доступных в коллекции, которые могут содержать вещи, и, соответственно, выделяется память. Чтобы добавить что-то к этому, вам придется в любом случае повторно инициализировать существующий массив (даже если вы изменяете размер массива, см. Этот поток). Один из редких случаев, когда вы хотите инициализировать пустой массив, — это передать массив в качестве аргумента.

Читайте также:  Polymorphism in python classes

Если вы хотите определить коллекцию, когда вы не знаете, какой размер это может быть возможно, массив не ваш выбор, а что-то вроде List или аналогичного.

Тем не менее, единственный способ объявить массив без указания размера — иметь пустой массив размер 0. гемант и Alex Dn предоставляет два способа. Другая более простая альтернатива — просто:

[Элементы внутри скобки должны быть неявно конвертируемы к определенному типу, например, string[] a = < "a", "b" >; ]

Или еще один:

var a = Enumerable.Empty().ToArray(); 

Вот более декларативный способ:

public static class Array  < public static T[] Empty() < return Empty(0); >public static T[] Empty(int size) < return new T[size]; >> 

Теперь вы можете позвонить:

var a = Array.Empty(); //or var a = Array.Empty(5); 

Ответ 6

Примечание: OP означало, что не нужно указывать размер, а не сделать массив без изменений

Ответ 7

Вы можете определить размер массива во время выполнения.

Это позволит вам делать все возможное, чтобы динамически вычислять размер массива. Но, как только определенный размер является неизменным.

Array a = Array.CreateInstance(typeof(string), 5); 

Ответ 8

Как я знаю, вы не можете создавать массив без размера, но можете использовать

Ответ 9

Ответ 10

Объединение предложений @nawfal и @Kobi:

namespace Extensions < /// Useful in number of places that return an empty byte array to avoid unnecessary memory allocation. public static class Array  < public static readonly T[] Empty = new T[0]; >> 

Ответ 11

Вот пример реального мира. В этом случае сначала необходимо инициализировать массив foundFiles до нулевой длины.

(Как подчеркивалось в других ответах: Это не инициализирует элемент, а не элемент с нулевым индексом, потому что это означает, что массив имел длину 1. После этой строки массив имеет нулевую длину!).

Если часть = string[0] опущена, возникает ошибка компилятора!

Это происходит из-за блока catch без повторного броска. Компилятор С# распознает путь кода, что функция Directory.GetFiles() может вызывать исключение, так что массив может быть неинициализирован.

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

В этом случае предполагается, что программа должна продолжаться в случае каталога, который не может быть прочитан, а не break. Лучшим примером является функция, проходящая через структуру каталогов. Здесь обработка ошибок только регистрирует его. Конечно, это можно сделать лучше, например. собирая все каталоги с неудачными вызовами GetFiles(Dir) в списке, но это приведет слишком далеко здесь.

Достаточно сказать, что избегать throw является допустимым сценарием, поэтому массив должен быть инициализирован до нулевой длины. Было бы достаточно сделать это в блоке catch, но это был бы плохой стиль.

Вызов GetFiles(Dir) изменяет размер массива.

string[] foundFiles= new string[0]; string dir = @"c:\"; try < foundFiles = Directory.GetFiles(dir); // Remark; Array is resized from length zero >// Please add appropriate Exception handling yourself catch (IOException) < Console.WriteLine("Log: Warning! IOException while reading directory: " + dir); // throw; // This would throw Exception to caller and avoid compiler error >foreach (string filename in foundFiles) Console.WriteLine("Filename: " + filename); 

Ответ 12

string[] sample = new string[0]; 

Но я мог только вставить в него одну строку, а затем получил ошибку exceptionOutOfBound, поэтому просто добавлю для нее размер, например

string[] sample = new string[100]; 

Или другой способ, который работает для меня:

Назначение значения для списка:

Источник

Массивы (Руководство по программированию на C#)

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

Пример

В следующих примерах создаются одномерные массивы, многомерные массивы и массивы массивов:

class TestArraysClass < static void Main() < // Declare a single-dimensional array of 5 integers. int[] array1 = new int[5]; // Declare and set array element values. int[] array2 = new int[] < 1, 3, 5, 7, 9 >; // Alternative syntax. int[] array3 = < 1, 2, 3, 4, 5, 6 >; // Declare a two dimensional array. int[,] multiDimensionalArray1 = new int[2, 3]; // Declare and set array element values. int[,] multiDimensionalArray2 = < < 1, 2, 3 >, < 4, 5, 6 >>; // Declare a jagged array. int[][] jaggedArray = new int[6][]; // Set the values of the first array in the jagged array structure. jaggedArray[0] = new int[4] < 1, 2, 3, 4 >; > > 

Общие сведения о массивах

Массив имеет следующие свойства:

  • Массив может быть одномерным, многомерным или массивом массивов.
  • Количество измерений и длина каждого из измерений задаются, когда создается экземпляр массива. Эти значения нельзя изменить во время существования экземпляра.
  • Используемые по умолчанию значения числовых элементов массива равны нулю, и элементам ссылки присвоено значение null .
  • В массиве массивов элементы являются ссылочными типами и инициализируются значением null .
  • Массивы индексируются от нуля: массив с n элементами индексируется от 0 до n-1 .
  • Элементы массива могут иметь любой тип, в том числе тип массива.
  • Типы массивов — это ссылочные типы, производные от абстрактного базового типа . Все массивы реализуют IList и IEnumerable. Для итерации по массиву можно использовать оператор foreach. Одномерные массивы также реализуют IList и IEnumerable .

Поведение значения по умолчанию

  • Для типов значений элементы массива инициализируются со значением по умолчанию — шаблоном с нулевыми битами; элементы будут иметь значение .
  • Все ссылочные типы (в том числе не допускающие значения NULL) имеют значения .
  • Для типов, допускающих значения NULL, параметр HasValue имеет значение false , а для элементов будет установлено значение null .

Массивы как объекты

В C# массивы представляют собой реальные объекты, а не просто адресуемые области непрерывной памяти, как в C и C++. Array — это абстрактный базовый тип для всех типов массивов. Вы можете использовать свойства и другие члены класса, входящие в Array. Например, с помощью свойства Length можно получить длину массива. В следующем коде значение длины массива numbers ( 5 ) присваивается переменной с именем lengthOfNumbers :

int[] numbers = < 1, 2, 3, 4, 5 >; int lengthOfNumbers = numbers.Length; 

В классе Array представлено множество других полезных методов и свойств для сортировки, поиска и копирования массивов. В следующем примере свойство Rank используется для отображения количества измерений массива.

class TestArraysClass < static void Main() < // Declare and initialize an array. int[,] theArray = new int[5, 10]; System.Console.WriteLine("The array has dimensions.", theArray.Rank); > > // Output: The array has 2 dimensions. 

См. также раздел

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

Источник

Объявлять и инициализировать пустые массивы в C#

Это удобный трюк для работы с возможными пустыми массивами.

Программа C# не может использовать свойства и методы массива, пока не будет создан экземпляр массива. Например, следующий код объявляет массив, а затем пытается использовать его свойства для прокрутки его значений.

// Объявляем массив и пытаемся использовать его свойства. private void btnDeclare_Click(object sender, EventArgs e) < int[] values = null; try < // Это не удается. for (int i = 0; i < values.Length; i++) < MessageBox.Show("Value[" + i + "]: " + values[i]); >MessageBox.Show("Done"); > catch (Exception ex) < MessageBox.Show(ex.Message); >>

Первая инструкция MessageBox.Show терпит неудачу, потому что массив не был создан. (Обратите внимание, что код устанавливает переменную массива равной null. В противном случае компилятор правильно жалуется, что код пытается использовать неинициализированную переменную.)

Вы можете проверить, есть ли values == null, чтобы определить, был ли еще создан массив, но иногда код был бы более последовательным, если бы вы могли использовать его Length GetLowerBound, GetUpperBound и другие члены, чтобы перебрать пустой массив. Это можно сделать, если вы инициализируете массив, чтобы он содержал нулевые записи, как в следующем коде.

Теперь массив существует, но пуст. Свойство Length возвращает 0, GetLowerBound возвращает 0, а GetUpperBound возвращает -1. Следующий код похож на предыдущую версию, за исключением того, что он инициализирует массив таким образом, чтобы он работал.

// Объявляем массив и инициализируем его пустым массивом. private void btnDeclareAndInitialize_Click(object sender, EventArgs e) < int[] values = new int[0]; try < for (int i = 0; i < values.Length; i++) < MessageBox.Show("Value[" + i + "]: " + values[i]); >MessageBox.Show("Done"); > catch (Exception ex) < MessageBox.Show(ex.Message); >>

Источник

Оцените статью