Структура массива си шарп

Initializing an Array of Structs in C#

Firstly, do you really have to have a mutable struct? They’re almost always a bad idea. Likewise public fields. There are some very occasional contexts in which they’re reasonable (usually both parts together, as with ValueTuple ) but they’re pretty rare in my experience.

Other than that, I’d just create a constructor taking the two bits of data:

class SomeClass < struct MyStruct < private readonly string label; private readonly int id; public MyStruct (string label, int id) < this.label = label; this.id = id; >public string Label < get < return label; >> public string Id < get < return id; >> > static readonly IList MyArray = new ReadOnlyCollection (new[] < new MyStruct ("a", 1), new MyStruct ("b", 5), new MyStruct ("q", 29) >); > 

Note the use of ReadOnlyCollection instead of exposing the array itself — this will make it immutable, avoiding the problem exposing arrays directly. (The code show does initialize an array of structs — it then just passes the reference to the constructor of ReadOnlyCollection<> .)

@Chris: No, I’d say it goes far beyond just publicly consumable APIs. How big is your team? Are you always going to work for that company? How sure are you that every member of your team, now and forever, understands the many and varied oddnesses of mutable structs? For throwaway code, I’d agree. but most code lives much longer in maintenance mode than we originally expect, and poor design can make it much harder to disentangle that later on. You find that someone’s passed a field by reference and then you can’t refactor to properties without breaking it, etc.

It is a shame that there is so much extra typing here. In C++11 I can do: struct foo < int i; const char* str; char c; >; foo f[] = < < 1, "hello", 'c' >, < 2, "goodbye", 'd'" >>; It would be nice if one didn’t need to write the constructor or have to type «new foo» so much.

@Jon Skeet: I have a question. Considering that label and id are readonly, is there any reason to allow accessing them only thorugh property instead of let them be public? Does the compiler optimize it, or accessing them through accessor has an overhead respect of accessing them as public fields?

@FifaEarthCup2014: That would leave the properties being writable within the type — which will be fixed in C# 6, fortunately. At the moment, there’s no way of writing a truly read-only automatically implemented property.

@Tutankhamen: Again, «I’ve shown the OP how to create and initialize an array» — what do you think the code: new[] < new MyStruct ("a", 1), new MyStruct ("b", 5), new MyStruct ("q", 29) >does? It initializes an array.

Источник

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

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

Читайте также:  Android java dialog fragment

Пример

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

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#. Использование массивов в структурах. Массивы структур. Вложенные структуры. Копирование структур

Использование массивов в структурах. Массивы структур. Вложенные структуры. Копирование структур

Поиск на других ресурсах:

Читайте также:  Create Record
1. Как объявить одномерный массив структур? Пример

Ниже приведен программный код, выполняющий следующие действия:

  • объявляется структура типа Point , описывающая координаты точки на плоскости. Структура содержит внутренние поля (переменные x , y ), один метод доступа к переменным, свойства записи в структуру и чтения данных из структуры;
  • объявляет массив MP из 10 экземпляров (объектов) структур типа Point ;
  • демонстрирует использование массива MP в некотором методе.

Объявление структуры типа Point :

// структура, описывающая точку на координатной плоскости struct Point < int x, y; public void SetXY(int nx, int ny) < x = nx; y = ny; >// свойство X public int X < get < return x; > set < x = value; > > // свойство Y public int Y < get < return y; > set < y = value; > > >

Объявление массива MP и его использование в программном коде некоторого обработчика события (приложение типа Windows Forms ).

// одномерный массив структур типа Point Point[] MP; // объявление переменной типа "массив Point" // выделить память для 10 структур типа Point MP = new Point[10]; // Обнулить значение всех точек массива MP for (int i = 0; i < 10; i++) MP[i].SetXY(0, 0); // использовать метод SetXY структуры // Записать некоторые значения в массив точек Point for (int i = 0; i < 10; i++) < // использовать свойства X и Y MP[i].X = i * 2; MP[i].Y = i + 1; >

2. Как объявить двумерный массив структур? Пример

Ниже приведен пример объявления и использования двумерного массива типа Point (см. предшествующий пункт).

// Объявление и использование двумерного массива структур // размером 10*20 // 1. Выделить память для 10 строк Point[][] MP2 = new Point[10][]; // 2. В каждой строке выделить память для 20 экземпляров структур for (int i=0; inew Point[20]; // 3. Заполнить поля структур произвольными значениями for (int i = 0; i < 10; i++) for (int j = 0; j

3. Пример копирования (присвоения) одной структуры другой

Пусть задано объявление структуры Date , определяющей дату в календаре.

struct Date < public int day; // число public int month; // месяц public int year; // год public Date(int nday, int nmonth, int nyear) < day = nday; month = nmonth; year = nyear; >>

В следующем коде продемонстрировано копирование одной структуры другой.

// копирование одной структуры другой Date St1; Date St2; St1.day = 14; St1.month = 1; St1.year = 1972; // копирование структур, структуры размещаются в разных участках памяти St2 = St1; int d, m, y; d = St2.day; // d = 14 m = St2.month; // m = 1 y = St2.year; // y = 1972 St1.month = 5; // St1.month = 5; St2.month = 1;

Как видно из примера, экземпляры структур размещаются в разных участках памяти.

4. Пример структуры, реализующей методы интерфейса

Как известно, в структурах можно реализовывать методы интерфейса. В примере ниже приведено использование интерфейсных методов в структурах.

Пусть дан интерфейс IPoint и структура типа Point , которые имеют такое же объявление

// интерфейс, который будет использован в структуре Point interface IPoint < // методы интерфейса bool IsPointOnPoint(int x1, int y1, int x2, int y2); > // структура Point наследует интерфейс struct Point : IPoint < public int x, y; // явным образом заданный конструктор public Point(int nx, int ny) < x = nx; y = ny; >// Реализация метода интерфейса в структуре public bool IsPointOnPoint(int x1, int y1, int x2, int y2) < bool f; f = false; if ((x1 == x2) && (y1 == y2)) f = true; return f; > >

В интерфейсе описывается метод IsPointOnPoint() , который может быть реализован в структуре Point . Структура Point наследует интерфейс IPoint . Метод IsPointOnPoint() определяет, лежат ли точки одна на другой (имеют ли они одинаковые координаты x , y ).

Читайте также:  Пример

Нижеследующий программный код демонстрирует использование структуры типа Point и вызов интерфейсного метода IsPointOnPoint() .

// Использование структуры, которая наследует интерфейс Point P; bool res; P.x = P.y = 0; // вызов интерфейсного метода IsPointOnPoint(),реализованного в структуре Point res = P.IsPointOnPoint(3, 5, 6, 6); // res = false res = P.IsPointOnPoint(3, 7, 3, 7); // res = true

5. Какие особенности использования массивов в структурах? Пример использования массивов в структуре

Если в структуре объявлен массив, то для него обязательно должна выделяться память с помощью оператора new .

Пример. Пусть задана структура Cars , которая описывает парк автомобилей. В структуре объявляется несколько массивов, которые определяющих характеристики автомобилей.

// структура, которая описывает автомобильный парк struct Cars < public int n; // количество автомобилей public string[] model; // марка автомобиля public int[] year; // год выпуска public float[] engine; // мощность двигателя public string[] country; // страна изготовитель public bool[] on_the_run; // true - автомобиль на ходу >

В нижеследующем программном коде демонстрируется использование массивов в структуре

// использование массивов в структурах Cars C; // объявление структурной переменной // формирование массива из 10 автомобилей C.n = 10; // выделение памяти для массивов в структурах - обязательно C.model = new string[C.n]; C.year = new int[C.n]; C.engine = new float[C.n]; C.country = new string[C.n]; C.on_the_run = new bool[C.n]; // заполнение массивов произвольными значениями for (int i = 0; i < C.n; i++) < C.model[i] = "Model - " + (i + 1).ToString(); C.year[i] = 2000 + i; C.engine[i] = 1.2f + 0.1f * i; C.country[i] = "Country - " + (i + 1).ToString(); C.on_the_run[i] = ((i % 2) == 0) ? true : false; // true - четное; false - нечетное >

6. Пример использования вложенных структур в программах

В примере объявлены три структуры с именами Date , WorkerName , Worker . Структура Worker описывает информацию о работнике и содержит две вложенные структуры Date и WorkerName . Также структура Worker содержит массив чисел типа float .

// вложенные структуры // структура, которая описывает дату struct Date < public int day; // день public int month; // месяц public int year; // год > // структура, которая описывает имя работника struct WorkerName < public string name; // фамилия public string surname; // имя public string patronymic; // отчество > // структура, которая описывает информацию о работнике struct Worker < public WorkerName Name; // фамилия и имя public Date BirthDate; // дата рождения public string code; // идентификационный код public int rank; // разряд работника public float[] salary; // начисленная зарплата по месяцам за год >

Использование структуры Worker в другом программном коде

// массив из 5 структур типа Worker Worker[] W = new Worker[5]; // выделение памяти для поля salary, которое есть массивом - обязательно! for (int i=0; inew float[12]; // заполнение массива W for (int i = 0; i < 5; i++) < W[i].Name.name = "Name of worker - " + i.ToString(); W[i].Name.surname = "Surname of worker - " + i.ToString(); W[i].Name.patronymic = "Patronymic of worker - " + i.ToString(); W[i].BirthDate.day = 1; W[i].BirthDate.month = 1; W[i].BirthDate.year = 1972; W[i].code = "1234567890"; W[i].rank = i + 2; for (int j = 0; j < 12; j++) W[i].salary[j] = (float)(i * 500 + 220.00); >

Связанные темы

Источник

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