2015-04-06 3 views
1

Я хочу создать глобальный доступный struct/class (в C#) для доступа к моим ценам акций от обработчика обратного вызова.C# - Открытый класс с индексом accessor

Я знаю только C и легко там

Пример в C

struct _Sample 
{ 
    int SomeValue; 
}; 
struct _Sample Sample[10]; 

Это то, что я до сих пор в C# через 2 часа безуспешных попыток.

public static class GlobalVar 
{ 
    private static double _StockPrice; 

    public static double SetStockPrice 
    { 
     set 
     { 
       _StockPrice = value; 
     } 
    } 

    public static double GetStockPrice 
    { 
     get 
     { 
       return _StockPrice; 
     } 
    } 
} 

Приведенный выше пример может быть использован в качестве GlobalVar.SetStockPrice = 10.254; я знаю, что я должен использовать <List> сделать _StockPrice доступны в виде массива, но все мои попытки обобщить рабочее решение не удалось.

Я хотел бы получить доступ к нему, как GlobalVar[1].SetStockPrice = 1.0; и GlobalVar[1].SetStockPrice = 1.0;

я должен использовать C#, потому что SDK я использую только в C#.

+0

использовать массив вместо класс. –

+1

Я думаю, что вы хотите использовать SetStockPrice как коллекцию, а не один объект. –

+1

Вы не можете сделать это на C# до 5.0. Даже 6.0 разрешают только глобальные вызовы методов, а не свойства, поэтому вы не можете вызвать глобальный указатель (вы можете получить синтаксис, который вам нужен, ссылаясь на объект singleton, принадлежащий вашему классу) ... –

ответ

0

C пример, который вы указали, создает массив с 10 экземплярами структуры.

Эквивалент C# код заключается в следующем:

struct _Sample 
{ 
    public int SomeValue; 

    public static _Sample[] Sample = new _Sample[10]; 
}; 

Это не очень C# -ish однако. Использование C# стиль я бы написать что-то вроде

struct Sample 
{ 
    public int SomeValue { get; set; } 

    public static Sample[] Values = new Sample[10]; 
} 
0

Вы можете сделать что-то подобное, чтобы иметь такое же поведение, как и в . Обратите внимание, что вам не нужно делать SetField и GetField, используя { get; set; }, вы получите это поведение по умолчанию (это свойство).

public struct Sample 
{ 
    public double StockPrice { get; set; } 
} 

public static class GlobalVar 
{ 
    public static Sample[] Samples = new Sample[10]; 
} 

И Acces использовать

GlobalVar.Samples[1].StockPrice = 1.0; 
1

Вы бы добавить класс StockPrice и сохранить внутренний словарь внутри GlobalVar, чтобы сделать эту работу, но вы можете использовать это:

public StockPrice this[int index] 
{ 
    get 
    { 
     StockPrice stockPrice = null; 

     if (index > -1) 
     { 
      InternalDictionary.TryGetValue(index, out stockPrice); 
     } 
     return stockPrice; 
    } 
} 

Затем вы можете сделать GlobalVar[index], чтобы получить определенный объект StockPrice из этого внутреннего словаря GlobalVar.

Также обратите внимание, что это не будет работать на статическом классе, потому что статические индексы не допускаются на C#. Возможно, вы захотите изменить свой класс как одиночный, а не на статический.

EDIT: Более полный пример (все еще нужно работать, хотя) с одноплодной реализации:

public class GlobalVars 
{ 
    static StockPrices _stockPrices = new StockPrices(); 
    public static StockPrices StockPrices 
    { 
     get 
     { 
      return _stockPrices ; 
     } 
    } 
} 

public class StockPrices 
{ 
    Dictionary<int, StockPrice> InternalDictionary = new Dictionary<int, StockPrice>(); 

    public StockPrice this[int index] 
    { 
     get 
     { 
      StockPrice stockPrice = null; 

      if (index > -1) 
      { 
       InternalDictionary.TryGetValue(index, out stockPrice); 
      } 
      return stockPrice; 
     } 
    } 

    public void Add(StockPrice stockPrice) 
    { 
     int index = InternalDictionary.Keys.Max() + 1; 
     InternalDictionary.Add(index, stockPrice); 
    } 
} 

Тогда вы могли бы назвать свой код так:

GlobalVars.StockPrices[1].DoSomething 
Смежные вопросы