Использование свойства для получения элемента массива в C # - PullRequest
4 голосов
/ 22 октября 2009

Есть ли способ получить определенный элемент (на основе индекса) из строкового массива с помощью свойства. Я предпочитаю использовать публичное свойство вместо того, чтобы сделать массив строк публичным. Я работаю на C # .NET 2.0

Привет

Ответы [ 8 ]

6 голосов
/ 22 октября 2009

Возможно, вы пытаетесь защитить исходный массив; ты имеешь в виду, что ты хочешь защитную оболочку для массива через «свойство» (а не его собственное) Я делаю этот снимок, чтобы угадать детали вашего вопроса. Вот реализация оболочки для строкового массива. Массив не может быть доступен напрямую, но только через индексатор оболочки.

using System;

public class ArrayWrapper {

    private string[] _arr;

    public ArrayWrapper(string[] arr) { //ctor
        _arr = arr;
    }

    public string this[int i] { //indexer - read only
        get {
            return _arr[i];
        }
    }
}

// SAMPLE of using the wrapper
static class Sample_Caller_Code {
    static void Main() {
        ArrayWrapper wrapper = new ArrayWrapper(new[] { "this", "is", "a", "test" });
        string strValue = wrapper[2]; // "a"
        Console.Write(strValue);
    }
}
5 голосов
/ 22 октября 2009

Если я правильно понимаю, что вы спрашиваете, вы можете использовать индексатор. Индексаторы (Руководство по программированию в C #)

Изменить: Теперь, когда я прочитал другие, может быть, вы можете выставить свойство, которое возвращает копию массива?

4 голосов
/ 22 октября 2009

Если свойство предоставляет массив:

string s = obj.ArrayProp[index];

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

static class Program
{
    static void Main()
    {
        string s = ViaArray.SomeProp[1];
        string t = ViaIndexer.SomeProp[1];
    }
}
static class ViaArray
{
    private static readonly string[] arr = { "abc", "def" };
    public static string[] SomeProp { get { return arr; } }
}
static class ViaIndexer
{
    private static readonly IndexedType obj = new IndexedType();
    public static IndexedType SomeProp { get { return obj; } }
}
class IndexedType
{
    private static readonly string[] arr = { "abc", "def" };
    public string this[int index]
    {
        get { return arr[index]; }
    }
}
3 голосов
/ 22 октября 2009

Что вам нужно, это свойство, которое может иметь вход (индекс).

Существует только одно подобное свойство, называемое индексатором.

Посмотрите на MSDN.

Ярлык: используйте встроенный фрагмент кода: перейдите к своему классу и введите «indexer», затем дважды нажмите tab. Viola!

1 голос
/ 22 октября 2009

Свойства не принимают параметры, поэтому это невозможно.

Вы можете создать метод, например,

public string GetStringFromIndex(int i)
{
  return myStringArray[i];
}

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

1 голос
/ 22 октября 2009

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

public class Foo
{
   private string[] bar;

   public string FooBar
   {
       get { return bar.Length > 4 ? bar[4] : null; }
   }
}

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

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

public string GetBar( int index )
{
     return bar.Length > index ? bar[index] : null;
}
0 голосов
/ 04 апреля 2018

То, что вы просите, может быть выполнено, например, так:
Вы можете инициализировать объект, который содержит ваш массив, давая вам именно то, что вам нужно:

public class ArrayIndexer<T> {
    private T[] myArrRef;
    public ArrayIndexer(ref T[] arrRef) {
        myArrRef = arrRef;
    }

    public T this [int index] {
        get { return myArrRef[index]; }
    }
}

Тогда в вашем классе:

public ArrayIndexer arr;
private SomeType[] _arr;    

//Constructor:
public MyClass(){
    arr = new ArrayIndexer<SomeType>(ref _arr);
}

Использование:

myClassObj.arr[2] // Gives the second item in the array.

Et Voila! Индексированное свойство.

0 голосов
/ 22 октября 2009

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

например:.

string s = object.Names[15]
...